Próbuję zrobić układ mierzący napięcie w zakresie 0-5V i wysyłający wynik na COMa.
Napięcie odniesienia ustawiłem na wew. AREF i do pinu ADC1 podłączyłem dzielnik napięcia z dwoma rezystorami 330, więc jeśli dobrze myślę to 5V/2=2.5 i (2.5/2.56)*255=249 i taki wynik powinno mi wysyłać na coma a wynik jaki otrzymuję gdy na zasilaczu ustawiam 5V to 53. Czy gdzieś jest błąd w moim rozumowaniu?
Kod: Zaznacz cały
#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile unsigned char wyslano_flaga;
volatile unsigned char wartosc;
volatile unsigned char wynik;
ISR(ADC_vect)
{
wartosc=ADCH; // wpisanie wyniku pomairu do zmiennej wartosc
}
void usart_inicjuj(void)
{
//definiowanie parametrów transmisji za pomocą makr zawartych w pliku
//nagłówkowym setbaud.h. Jeżeli wybierzesz prędkość, która nie będzie
#define BAUD 9600 //żądaną prędkość transmisji
#include <util/setbaud.h> //linkowanie tego pliku musi być po zdefiniowaniu BAUD
//ustaw obliczone przez makro wartości
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
//Ustawiamy pozostałe parametry moduł USART
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //bitów danych: 8
//bity stopu: 1
//parzystość: brak
//włącz nadajnik i odbiornik oraz ich przerwania
UCSRB = (1<<TXEN);
}
//--------------------------------------------------------------
void wyslij_wynik(void){
//Zaczekaj, aż bufor nadawania będzie pusty
while (!(UCSRA & _BV(UDRE)));
UDR = wartosc; //wyślij wynik
}
//---------------------------------
int main(void)
{
// KONFIGURACJA ADC
ADMUX = (1<<MUX0) // kanal 0 PC1
|(1<<REFS0)|(1<<REFS1) //wewnetrzne 2.56 z kon. na AREf
|(1<<ADLAR); // tryb 8 bitowy
ADCSRA = (1<<ADEN) //odblokowanie adc
|(1<<ADIE) //wlaczenie przerwania od adc
|(1<<ADFR) //tryb free running
|(1<<ADSC) //start konwersji
|(1<<ADPS1)|(1<<ADPS2); // prescaler 64
sei(); //włącz przerwania globalne
//-------------------------------------
usart_inicjuj(); //inicjuj moduł USART (RS-232)
while(1)
{
wyslij_wynik(); //rozpocznij wysyłanie wyniku przez RS-232
_delay_ms(50);
}
}