Sari la conținut
ELFORUM - Forumul electronistilor

Citire ADC eronata


Vizitator DragosH

Postări Recomandate

Vizitator DragosH

Buna, incerc sa masor tensiunea de la un AO(0.15-3V) cu un ATmega16 iar rezultatul are o variatie de 4-5 biti. ADC-ul e in free-running mode, Aref e 3.07V, alimentarea AVCC e filtrata cu C=100n, L=10u, la pinul de intrare e un filtru R=10k,C=100n. Aref si semnalul de intrare nu variaza cu mai mult de 2mV. Chiar si dupa o filtrare digitala eroarea rezultatului persista. Multumesc anticipat pentru solutii.

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • mitescu

    2

Top autori în acest subiect

Nu ai dat toate elementele. Ce frecventa de ceas utilizezi la ADC?Ce referinta ai? Interna , sau VCCPe cati biti faci conversia?Cel mai bine ai pune secventa de cod, sa se vada modul de utilizare ADC

Link spre comentariu
Vizitator DragosH

Referinta e externa de la o ref de tensiune LT1029(5V) si un potentiometru,

conversia e pe 10 biti,

frecventa controlerului e de 8Mhz de la un cristal.

 

 

//SET ADC*******************************************ldi r16,0x00out SFIOR,r16ldi r16,0b00000000        //Aref_extern,ADC0out ADMUX,r16ldi r16,0b11101111   //prescaler=128out ADCSRA,r16
Link spre comentariu

Intradevar , ai pus o secventa de cod. Dar ea este numai initializarea. Secventa de citire nu ai pus-o. Acum, ptr initializare , ai initializat si ADATE, ceea ce insemna ca trebuia sa arati si cum ai setat bitii ADTSx in registrul SFIOR. Vad ca ai initializat si intreruperea, si presupun ca acolo faci citirea rezultatului. La Free Running Mode, citirea rezultatului face ca sa se reia ciclul unei noi conversii. Din acest motiv este importanta ordinea citirii. Reluarea conversiei se face imediat dupa citirea ADCH. Prin urmare, ordinea corecta a citirilor este , intai ADCL si pe urma ADCH. Aceasta poate fi una din cauzele aparitiei "fenomenului" descris. Daca ai fi pus toate secventele, legate de ADC, probabil ca se putea face o analiza mai corecta. Oricum , daca se dovedeste ca nu porogramul este vinovat, o sa trebuiasca sa te intorci la "sarme".

Link spre comentariu
Vizitator DragosH

Multumesc pt. raspunsuri.

Am facut niste modificari la soft:

 

//SET ADC*******************************************ldi r16,0x00out SFIOR,r16ldi r16,0b00000000        //Vref_extern,ADC0out ADMUX,r16ldi r16,0b10001110   //prescaler=64out ADCSRA,r16sbi ADCSRA,ADSC //start conversion

 

Rutina de citire pt intrerupere:

int_ADC:push r16in r16, SREGpush r16push r17in r16,ADCLin r17,ADCHclcadd ZL,r16adc ZH,r17clcinc contorADCcpi contorADC,0b00010000breq adc16endadc16:pop r17//ldi r16,0b11101110      //prescaler=64//out ADCSRA,r16sbi ADCSRA,ADSCpop r16out SREG,r16pop r16reti //exit intADCadc16:ldi contorADC,0lsr ZHror ZLlsr ZHror ZLlsr ZHror ZLlsr ZHror ZLclcadd YL,ZLadc YH,ZHldi ZL,0x00ldi ZH,0x00clclsr YHror YLrjmp endadc16

 

Acum variatia a coborat la 2-3 biti maxim.

Am citit pe forum ca pentru o rezolutie mai buna trebuie facute vreo 5 citiri pe secunda, asa sa fie?

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