Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


Postări Recomandate

Salut,Cerinte:In schema din atasament se gaseste un potentiometru de 250 ohmi inseriat cu o rezistenta de 1.7 Kohmi.Eu vreau sa citesc cu ADC-ul lui ATmega168 tensiunea cursorului si sa folosesc valoarea pentru a modifica factorul de umplere al PWM-ului (portb.1).Ideea este ca, atunci cand potentiometrul este la maxim (+5v) PWM-ul sa aiba factorul de umplere 100%, iar atunci cand este la minim sa am factorul de umplere 60%.Eu am reusit pana acum sa-l fac sa coboare pana la 85% dar nu stiu cum sa fac sa pot ajunge la 60%.As dori explicatii in Bascom AVR dar pot fi si in C++ ca le descifrez eu pana la urma.Mi-ar fi de mare ajutor si o posibila idee nu neaparat cod gata scris.Montajul este folosit la varierea turatiei unui motor dar problema este ca aceasta configuratie (potentiometru+rezistenta) nu o pot modifica.

post-8095-139829296905_thumb.png

Link spre comentariu

Pai daca foloseam doar un simplu potentiometru este usor de facut.

Dar eu acel montaj potentiometru+rezistenta nu-l pot modifica.

El este montat pe un panou de comanda, unse se afla si alte module (remporizari, comenzi pompe etc) si la care nu am acces.

Eu trebuie sa ma adaptez cumva la nenorocirea aia de montaj.

 

Uite mai jos cum am facut eu:

Daca pun un simplu potentiometru pot varia PWM-ul de la 0 la 100%.

Daca pun montajul acela stupid il pot varia de la ~85 la 100%.

Mare filozofie nu este dar inca nu m-am prins cum sa fac.

 

De aceea orice sugestie e binevenita, macar sa stiu cum sa fac citirea ca, codul il fac eu dupa aceea.

 

$regfile "m168def.dat"   $crystal = 8000000   $baud = 9600   Dim Pwm_mo As Word   Config Timer1 = Pwm , Compare A Pwm = Clear Down , Prescale = 1   Start Timer1   Config Adc = Single , Prescaler = Auto , Reference = Avcc   Start Adc   Do      Pwm_mo = Getadc(0)      Pwm_mo = Pwm_mo / 4   Loop   End
Link spre comentariu

O solutie ar fi asta: valoare_PWM = (valoare_ADC - valoare_ADC_minima)*(interval_de_valori_cerut / interval_de_valori_obtinut) + valoare_minima_ceruta.Ex: (85-85)*2.66+60=60; (90-85)*2.66+60=73.3; (100-85)*2.66+60=99.9.Valorile date ca exemple mai sus sunt procentele despre care vorbeai in postul anterior, dar formula e valabila si pentru valori luate direct de la adc.

Link spre comentariu
  • 3 săptămâni mai târziu...
Vizitator poke_veve

Salutare tuturor. As avea nevoie de ajutor in a rezolva urmatoarea problema. Am realizat montajul din proiectul asta: http://www.societyofrobots.com/member_t ... /TSOP2.pdf cu exceptia TSOP-ului care este unul de 38 KHz si nu de 36 Khz cum scrie acolo.

 

// IR LED is connected to PORTC3, output of TSOP is connected to PORTC4.

// Visible wavelength LED is connected to PORTD0

 

#include

#include

#include

 

 

ISR(TIMER2_COMP_vect)

{

if(bit_is_clear(PINC, 3)){PORTC|=(1<

else{PORTC&=~(1<

};

 

 

 

int main (void) {

 

DDRC|=(1<

DDRD|=(1<

 

 

TCCR2|=(1<

OCR2=13;

TIMSK|= (1<<(OCIE2)); //output compare interrupt enable

sei();

 

while(1)

{

if (bit_is_clear(PINC,4)) {PORTD|=(1<

else {PORTD&=~(1<

}

}

 

Iar acesta este codul pus pe un ATMEGA8 cu oscilatorul intern la 1MHz. Problema este ca LED-ul IR nu imi emite. Restul functioneaza bine, fiindca daca butonez o telecomanda de TV LED-ul de pe PORTD0 mi se aprinde. Vedeti voi ceva in neregula la acest cod?

Link spre comentariu

Da, este o problema si anume ca timerul nu are sursa de ceas selectata. Adauga dupa

TCCR2|=(1<<WGM21); //mod CTCOCR2=13;TIMSK|= (1<<(OCIE2)); //output compare interrupt enable

TCCR2|=(1<

 

sau ar mai merge si

OCR2=13;TIMSK|= (1<<(OCIE2)); //output compare interrupt enableTCCR2|=(1<<WGM21)|(1<<CS20); //mod CTC
in felul asta mai salvezi 2 bytes de flash.
Link spre comentariu
  • 2 săptămâni mai târziu...
Vizitator alexvia

Buna seara tuturor,

 

 

Am si eu o problema; sunt foaaarte incepator in ceea ce priveste microcontrollerele si as dori sa ma ajute cineva daca se poate.

Incerc sa aprind un led (ceva in genul hello world) cu un AtTiny 13, iar codul in bascom este urmatorul.

 

Config Portb = Output        'set port B as outputDo                                  ' eternal loopPortb.3 = 1                      ' make portB.0 highWaitms 500                      ' wait 500msPortb.3 = 0                      ' make Portb.0 LowWaitms 500                      'wait 500msLoop
Problema e ca acest cod este compilat si la verificarea sintaxei nu imi da erori insa cand programez chipul (programatorul este USBAsp iar programul este Extreme Burner) imi da o eroare de genul Mismatch at Location 0x00000000 si evident ledul nu se aprinde.

Ceva idei ?

 

Multumesc.

Link spre comentariu

Din ce ai scris pare a fi o problema de scriere a softului in uC nu de cod. Se pare ca nu se scrie cum trebuie hex-ul in uC si evident verificarea esueaza. Incearca Khazama, poate ai succes cu acel program. De asemenea, verifica sa fie alimentat corespunzator uC-ul.

Link spre comentariu
Vizitator alexvia

Am verificat pcb-ul care il folosesc, la fel si conexiunile si sunt ok. (USBAsp-ul nu stiu cum sa il verific :jytuiyu) In imaginile de mai jos sunt varianta .hex originala si cea citita de extreme burner dupa acea eroare. Ceva idei ? :cry:

post-57714-139829310538_thumb.jpg

post-57714-139829310553_thumb.jpg

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări