Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[atmega8]niskie wyniki z ADC

oriwad
-
-
Posty:27
Rejestracja:9 lut 2012, o 20:19
[atmega8]niskie wyniki z ADC

Postautor: oriwad » 29 sty 2013, o 13:45

Witam,
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); } }
Ostatnio zmieniony 29 sty 2013, o 15:07 przez oriwad, łącznie zmieniany 1 raz.

Awatar użytkownika
brun
-
-
Posty:125
Rejestracja:28 mar 2012, o 09:48

Re: [atmega8]niskie wyniki z ADC

Postautor: brun » 29 sty 2013, o 14:32

A mógłbyś pokazać schemat podłączenia zasilania do Atmegi, jaki użyłeś? I w którym miejscu dzielnika mierzysz to napięcie?:)

oriwad
-
-
Posty:27
Rejestracja:9 lut 2012, o 20:19

Re: [atmega8]niskie wyniki z ADC

Postautor: oriwad » 29 sty 2013, o 15:10

Obrazek

Uploaded with ImageShack.us

Do tych dwóch wystających podłączam + i - z zasilacza. Jak zmierzyłem napięcie między pinem ADC1 a GND atmegi to pokazuje mi 0.5 V gdy do tych wyprowadzeń pomiarowych podpinam zasilacz i ustawiamna nim 5V
Ostatnio zmieniony 29 sty 2013, o 16:10 przez oriwad, łącznie zmieniany 1 raz.

Awatar użytkownika
brun
-
-
Posty:125
Rejestracja:28 mar 2012, o 09:48

Re: [atmega8]niskie wyniki z ADC

Postautor: brun » 29 sty 2013, o 16:05

Kilka rzeczy, które mi przyszło do głowy:
- na schemacie nie masz podpiętego zasilania do dzielnika rezystorowego, rozumiem, że w rzeczywistości w układzie podłączyłeś tam 5V?
- Czy w terminalu w komputerze(bo rozumiem że przez COM wysyłasz na komputer) masz ustawione takie same parametry transmisji jak w programie(8 bit danych, bit stopu, brak parzystości)
- z tego co widzę w kodzie, to na UART wysyłasz zmienną wartość. Do zmiennej wartość przypisujesz
wartosc=ADCH;
O ile dobrze pamiętam, to wynik pomiaru adc w Atmegach, jest przechowywany w dwóch rejestrach, ADCL oraz ADCH. Więc raczej musiałbyś przypisywać w ten sposób:
wartosc = ADCL + 256*ADCH;

oriwad
-
-
Posty:27
Rejestracja:9 lut 2012, o 20:19

Re: [atmega8]niskie wyniki z ADC

Postautor: oriwad » 29 sty 2013, o 16:15

Ustawiłem wyrównanie do lewej tak, że odczytuje tylko 8 bitów więc maksymalna wartość powinna być 255 a nie 1023 jakby było gdybym odczytywał oba te rejestry i miał 10bitową dokładność.

Mam w terminalu ustawione takie same parametry używam realterma.

Do tych dwóch wyprowadzeń od dzielnika podłączam zasilacz z ustawionymi 5V

Awatar użytkownika
brun
-
-
Posty:125
Rejestracja:28 mar 2012, o 09:48

Re: [atmega8]niskie wyniki z ADC

Postautor: brun » 29 sty 2013, o 16:41

Mam pewną teorię ;p

1) Atmega wysyła na terminal informacje w postaci HEX, które musisz przeliczyć na DEC, żeby odczytywać informacje w skali 0-255. Czyli Twoje HEX 59 = 89 DEC.

2) Czy jest szansa, że w Uarcie wysyłasz bity w odwrotnej kolejności niż są wpisywane do rejestru w ADC?
bo gdyby przesłany HEX wynosił 95, zamiast 59, to w systemie dziesiątkowym by wychodziło 95HEX = 149DEC.
149/255 to by nawet pasowało, zakładając 10% tolerancje wartości rezystorów ;)

Najlepiej, jakbyś mógł przeprowadzić pomiar dla 2 innych rezystorów, np. żeby zamiast 1/2 napięcia zasilacza, była 1/3 mierzona na ADC, to wtedy można by się upewnić ;)

oriwad
-
-
Posty:27
Rejestracja:9 lut 2012, o 20:19

Re: [atmega8]niskie wyniki z ADC

Postautor: oriwad » 29 sty 2013, o 17:17

Zrobiłem żeby było 1/3 i teraz pokazuje 21

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: [atmega8]niskie wyniki z ADC

Postautor: pajaczek » 29 sty 2013, o 17:31

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 com a wynik jaki otrzymuję gdy na zasilaczu ustawiam 5V to 53.
Jak zmierzyłem napięcie między pinem ADC1 a GND atmegi to pokazuje mi 0.5 V gdy do tych wyprowadzeń pomiarowych podpinam zasilacz i ustawiamna nim 5V
To jeszcze ładnie powiedz, ile jest pomiędzy GND zasilacza (chodzi mi o ten od dzielnika jeżeli są różne), a AGND atmegi ;) bo jak na razie to wszystko się zgadza z powyższymi założeniami.

Awatar użytkownika
brun
-
-
Posty:125
Rejestracja:28 mar 2012, o 09:48

Re: [atmega8]niskie wyniki z ADC

Postautor: brun » 29 sty 2013, o 17:32

Moja teoria upadła :P

oriwad
-
-
Posty:27
Rejestracja:9 lut 2012, o 20:19

Re: [atmega8]niskie wyniki z ADC

Postautor: oriwad » 29 sty 2013, o 23:21

Problem rozwiązany.
Okazało się że port jest spalony i zwiera do masy.

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Re: [atmega8]niskie wyniki z ADC

Postautor: Guru » 29 sty 2013, o 23:23

Może krok po kroku,
najpierw w przerwaniu ADC do zmiennej wartosc wstaw jakąś liczbę const sprawdź czy to co odebrałeś przez UART jest tym czego oczekiwałeś.
Ze schematu nie wynika, że AGND = GND sprawdź czy pomiędzy tymi liniami na pewno jest połączenie. Dla mnie wg tego co widzę na schemacie AGND i GND to zupełnie inne sygnały.

Dodano:
jak zwiera do masy to powinno być coś w okolicy 0 a nie 0x53 to trochę za dużo jak na zwarcie do masy

oriwad
-
-
Posty:27
Rejestracja:9 lut 2012, o 20:19

Re: [atmega8]niskie wyniki z ADC

Postautor: oriwad » 29 sty 2013, o 23:33

Może się mylę ale jak zmieniłem na ADC3 to zaczęło działać i jak na razie działa.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości