Sari la conținut
ELFORUM - Forumul electronistilor

ATMEGA8 +ADC


JQ

Postări Recomandate

salutare, am un circuit cu un atmega8 care citeste niste tensiuni pe anumite canale ADC si pentru verificare trimit datele pe comunicatia seriala. Problema e ca nu prea sunt conforme cu realitatea, adica ori fluctueaza foarte mult, ori nu citeste de pe portul specificat.Unde e greseala? codul este urmatorul:#include#include#include#include#define USART_BAUDRATE 4800#define BAUD_PRESCALE (((1000000 / (USART_BAUDRATE * 16UL))) - 1) int main (void){int i; //INITIALIZAREA COMUNICATIEI SERIALE UCSRB |= (1 << RXEN) | (1 << TXEN); // Turn on the transmission and reception circuitry UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register //INITILIZAREA ADC ADCSRA |= (1 << ADEN); // Enable ADC ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescalar to 128 - 125KHz sample rate @ 1MHz ADMUX |= (1 << REFS0); // Set ADC reference to AVCC ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading ADMUX &= 0xF8; // clear bottom 3 bits ADMUX |= 0; // then set bottom 3 bits to channel n ADCSRA |= (1<

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

Top autori în acest subiect

  • Laci

    2

  • JQ

    2

Top autori în acest subiect

  • Laci

    Laci 2 postări

  • JQ

    JQ 2 postări

Puteai sa grupezi scrierile in registri intr-un singur rand, prescallerul il setezi la 8 nu la 128, dar nu asta-i problema.ADMUX |= 0; // then set bottom 3 bits to channel n ???? aici ce ai vrut sa faci?ori faci asa:ADMUX = (1 << REFS0)|(1 << ADLAR)|(3); //canal 3 selectat ori:ADMUX |= (1 << REFS0); // Set ADC reference to AVCCADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit readingADMUX &= 0xF8; // clear bottom 3 bitsADMUX |= 3; // canal 3 selectatpentru citire ADC:unsigned char adc_read_buff;for(;;){...ADCSRA |= (1<

Link spre comentariu

Intr-adevar, dupa ce am implementat in acest mod secventele raspunsul e mai stabilizat, cu variatii mai mici. Insa am observat cadaca aici ADMUX = (1 << REFS0)|(1 << ADLAR)|(0); selectez canalul 0 (unde nu e conectat nimic) imi trimite totusi niste valori de genul ( 90 100 in decimal) iar la celelalte porturi pe care nu le folosesc trimite niste valori mici( maxim 10 in decimal) ceea ce as putea considera neglijabil. Oricum, merci de ajutor

Link spre comentariu
  • 1 lună mai târziu...
Vizitator bboyandru

Salut!

1. trebuie luat? în considerare ?i lungimea firului dintre senzor si pinul de la uC -> acest fir trebuie s? fie cât mai scurt posibil

2. citirea ADC se poate trimite(unde vrei s? o trimi?i) ?i ca medie aritmetic? a mai multe citiri

 

Uite un exemplu foarte util de func?ie pentru citirea ADC:

uint16_t ReadADC(uint8_t ch){

//Select ADC Channel ch must be 0-7

ch=ch&0b00000111;

ADMUX|=ch;

//Start Single conversion

ADCSRA|=(1<

//Wait for conversion to complete

while(!(ADCSRA & (1<

//Clear ADIF by writing one to it

//Note you may be wondering why we have write one to clear it

//This is standard way of clearing bits in io as said in datasheets.

//The code writes '1' but it result in setting bit to '0' !!!

ADCSRA|=(1<

return(ADC);

}

apoi po?i s? cite?ti foarte simplu cu valoare = ReadADC(num?r_canal)

num?r_canal trebuie s? fie o cifr? între 0 ?i (num?rul de canale ADC)-1

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