Sari la conținut
ELFORUM - Forumul electronistilor

help ! precize adc.


Vizitator yoco

Postări Recomandate

timpul de esantionare a semnalului de intrare e dat de clock-ul adc-ului si este 14.5clk pentru prima conversie , 1.5clk urmatoarele conversii.m-am exprimat gresit cind ti-am zis sa scazi frecventa de esantionare. nu intodeauna este proprotionala cu clock-ul adc-ului. corect este sa scazi clock-ul adc-ului.

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

Top autori în acest subiect

Salut Zc !

 

ai idee cum sa scad clock-ul adc-ului ??? fara sa "umblu" la Quartz.

-prescalerul l-am pus pe minim (fclck/128) adica la frecv. :

 

am configurat ADC-ul din atmega8 la frecv de esantionare de 156.25 Khz la un Quartz de 10Mhz si pe urma am schimbat acest Quartz cu unul de 14.3818Mhz pentru a obtine baud rate-uri decente si AM UITAT de frecv. de esantionare! (am gresit eu ce mai....).

acum am pus frecv de esantionare la 112.35 Khz si sper sa dea rezultate.

Link spre comentariu

in ADCSRA ai biti pentru setarea prescalerului ADC-ului(bitii 0,1,2). bitii se numesc ADPS0,ADPS1,ADPS2. daca maresti valoarea data de cei trei biti scazi clock-ul ADC-ului.in pdf-ul pentru atmega8 este un tabel care te lamureste exact cu valorile de divizare.o relatie ar fi asta: frecventa ADC=frecventa cuart/(2^(valoare ADPS2..0)) mai putin pentru valoare ADSPS2..0=0.

Link spre comentariu

scuze nu am citit si al rindul doi din ce ai scris???deci nu ti-am zis nimic nou.vezi ca ADC-ul mai are un bit in SFIOR.eu am folosit ADC-ul pentru masuratori orientative sau ma raportam la alta valoare masurata anterior. o eroare de 1.4% nu ma deranja. situ ca la o aplicatie (da nu mai stiu exact daca era cu atmega8 sau alt atmega) valoarea citita era deranjant mai mica decit ar fi trebuit sa fie si i-am scazut frecventa ADC-ului. problema s-a rezolvat.banuiesc ca nu faci o singura citire ci faci o medie a mai multor citiri.daca am timp astazi am sa fac si eu citeva teste si-ti zic ce am obtinut.da le fac cu atmega16 ca asta am pe masa.

Link spre comentariu

uite ce am masurat acum pe un atmega16-ADPS2,1,0=1,1,1-AREF scurt cu AVCC 4,907V-tensiune intrare 2,975V-valoare convertor 622-ADPS2,1,0=0,1,0-AREF scurt cu AVCC 4,898V-tensiune intrare 2,975V-valoare convertor 624prima masuratoare pare in regula. rezolutia convertorului 4,8mV eroarea de masura 8mV.

Link spre comentariu

Hey !

-cum spuneam nu a avut ocazia sa refac si eu masuratorile dar se vede ca voi DA, despre rezultatele lui Zc ce pot sa zic in afara de faptul ca sunt cat se poate de corecte dar sunt un pic curios la secventa de cod prin care faci activarea si citirea valorii ADC, pentru asta o sa pun secventa care am scris-o eu si poate pui si tu secventa ta pentru o mai buna intelegere a "treburilor" care se intampla mai exact.

-eu fac masuratori pe 3 canale adica selectez un canal nou dupa fiecare masuratoare , salvez data si incep una noua iar dupa ce se termina toate prelucrez datele dar ai dreptate cand spui ca trebuie sa faci o medie mai multor masuratori , asa vreau si eu sa fac dar asta presupune niste calcule mai "avansate", nu ca ari fi cine stie ce dar .... in fine este de lucru la un proiect nu?

-uite in mare cam ce face atmega8 al meu: citesc 3 tensiuni din care una este afisata ca si tensiune iar celelalte 2 sunt convertite in curent , in final le afisez pe un LCD 4x20 char. asa , si le trimit pe serial rs232 la Pc pentru o log-are+afisare in LABVIEW.

- am si un temporizator care contorizeaza timpul .

-setarile se fac de la o tastatura cu 9 butoane....

 

-codul scris pentru citire ADC:

conv_init:			;ch_0:ldi temp,0b01000000	;selectare canal 0 ,vlsb=4.88mvout admux,templdi temp,0b10001111 ;init adcout adcsr,tempsbi adcsr,6			;start dumy conv.adc_loop1:sbis adcsr,4rjmp adc_loop1nopnoprcall mcu_sleep		;conv. realalds templ,adlsts ub1l,templlds temph,adhsts ub1h,temphrcall conv_result	;conversie hex->int->ascii rezultatcbi adcsr,7			;adc disable
Link spre comentariu

;ADMUX=0;//intrarea 0 referinta AREF CLR R30 OUT 0x7,R30 ;ADCSR|=0x40;// Start conversie SBI 0x6,6 ;while ((ADCSR & 0x10)==0);// asteapta conversie completaet: SBIS 0x6,4 RJMP et ;ADCSR|=0x10; SBI 0x6,4 ;rezultat=ADCW; IN R30,0x4 IN R31,0x4+1 STS _ii,R30 STS _ii+1,R31

Link spre comentariu

dupa cum am zis nu e nevoie sa activezi intreruperea si sa citesti valoarea in intrerupere pentru ca adc_loop1: sbis adcsr,4 rjmp adc_loop1asteapta sfirsitul conversiei si dupa ce programul iese din bucla asta poti lua valoarea din ADCW.eu cind am facut testul nu am schimbat canalul.

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