JQ Postat Februarie 28, 2009 Partajează Postat Februarie 28, 2009 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
Laci Postat Februarie 28, 2009 Partajează Postat Februarie 28, 2009 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
JQ Postat Martie 1, 2009 Autor Partajează Postat Martie 1, 2009 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
Laci Postat Martie 1, 2009 Partajează Postat Martie 1, 2009 Iti citeste ceva pentru ca probabil ai impedanta mare la intrare si ai interferente de la 50Hz, trebuie filtrat si AVCC Link spre comentariu
Vizitator bboyandru Postat Aprilie 8, 2009 Partajează Postat Aprilie 8, 2009 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum