Sari la conținut

Setare ADC pt rezultat pe 10bit


dan_e

Postări Recomandate

De vreo luna imi bat capul sa scriu in Microcip Studio codul in C++ pentru a culege rezultate pe 10 biti de la doua canale ADC Atmega1284 si ceva imi scapa sau nu-mi iese!!!

Pentru 8 biti, am inteles, inclusiv din niste subiecte de aici de pe site, ca e suficienta rutina asta (si merge):

void adc_init(void);
uint8_t adc_read(uint8_t ch);

uint8_t ch, LowBits;

void adc_init()  // Referita am ales sa o las 5V
{
    ADMUX|=(1<<ADLAR);            // Pt rezultat pe 8 biti
    ADCSRA|=(1<<ADPS2)|(1<<ADPS1) // Setez Prescaler: F_CPU/64  == 125kHz
    | (1<<ADEN);                  // Activ ADC-ul
}

uint8_t adc_read(uint8_t ch)
{
    ADMUX &= 0xE0;      //Sterg vechiul canal
    ADMUX |= ch;        //Setez noul canal
    ADCSRA|=(1<<ADSC);   //Porneste conversia
    while(!(ADCSRA&(1<<ADIF)));   
    return ADCH; // Returneaza rezultatul (pe 8 biti)
}

Ce anume ar trebui sa modific in codul de mai sus ca rezultatul ADC sa fie intre 0 si 1023, adica pe 10 biti ? :scratchchin:

 

Link spre comentariu
Distribuie pe alte site-uri

 

Trebuie sa schimbi linia asta 

ADMUX|=(0<<ADLAR);     // Pt rezultat pe 10 biti 

(aici poti sa vezi ce rol joaca bitul ADLAR https://www.newbiehack.com/microcontrollersadc10bits.aspx)

 

 

Schimbi prototipul functiei din  uint8_t in uint16_t  ca sa returneze o valoare pe 16 biti (chiar daca numarul tau e numai 10 biti)

 

Citat

uint8_t adc_read(uint8_t ch)

 

acum devine

uint16_t adc_read(uint8_t ch);

 

 

uint16_t adc_read(uint8_t ch){
	uint16_t adc_value;
	ADMUX &= 0xE0; //Sterg vechiul canal     
	ADMUX |= ch; //Setez noul canal     
	ADCSRA|=(1<<ADSC); //Porneste conversia
    	while(!(ADCSRA&(1<<ADIF)));
	adc_value = ADCL;
	/*shift from low level to high level ADC, from 8bit to 10bit*/
	adc_value += (ADCH<<8);
	return adc_value;
}

 

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Mersi, :cheers2:

 

Ti s-a intamplat vreodata ca codul C++ de setare convertor ADC la un microcontroler AVR sa nu functioneze corect cand trecem de la o serie de microcontrolere la alta ? Spre exemplu, daca trecem de la AVR Atmega la AVR Attiny codul pentru configurare ADC, cum e cel exemplificat de tine, ramane acelasi sau la fel ? :scratchchin:

Link spre comentariu
Distribuie pe alte site-uri

nu stiu sunt diferite microcontrolerele astea doua?

din cate stiu eu ar trebui sa fie la fel (datasheet-ul stie cel mai bine) totusi ma astept sa fie diferit registrul ADMUX (din cauza ca attiny are mai putini pini)

codul asa cum e scris mai sus nu e foarte portabil exista un nivel de abstactie mai inalt (HAL - hardware abstraction layer) care se potriveste de la un MCU la altul. Pana la urma sunt 3-4 registre vare trebuie cautate in datasheet daca sunt la fel bitii in ele (ADMUX, ADCSRA ADCH ADCL ) 

daca stii exact ce Attiny vrei cauta pe net ca sigur e un exemplu ca nu esti tu singurul de planeta care vrea ADC la Attiny. (sau in Atmel studio sigur e un exemplu)

RR

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

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
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock