Paweł_1985 Napisano Marzec 2, 2013 Udostępnij Napisano Marzec 2, 2013 Witam Napisałem program realizujący funkcję przetwornika ADC na Atmega16: #include <avr/io.h> #include <avr/interrupt.h> uint16_t value; void ADC_init(void); int main (void) { DDRD =_BV(1); for (;;) { ADC_init(); value = ADC; if (value < 1020) PORTD = _BV(1); if (value > 1020) PORTD &= ~(_BV(1)); } } void ADC_init() { DDRA=0x00; PORTA=0x00; ADMUX=(1<<REFS0); ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADATE)|(1<<ADSC); } Niestety pojawił się problem z napięciem odniesienia. Nie wiem dlaczego procesor jako napięcie odniesienia bierze ok. 1,22V bez względu na to co ustawię w rejestrze ADMUX. Podłączenie VCC i AVCC mam do zasilania, natomiast Vref tak jak podaje karta katalogowa przez kondensator do masy. Czy ktoś spotkał się może z podobnym problemem?
marek1707 Marzec 2, 2013 Udostępnij Marzec 2, 2013 Moim zdaniem to Ty nigdzie nie czekasz na wynik konwersji. Co każdy obrót pętli wpisujesz pełny setup ADC i tym samym startujesz przetwarzanie nie sprawdzając, czy konwersja się zakończyła. Prawdopodobnie przetwornik nie wykonuje ani jednego poprawnego pomiaru. Wywal ADC_init() z pętli, przestaw je na początek i zrób jakieś oczekiwanie na ADIF (i kasuj go "ręcznie") lub po prostu odczytuj wyniki w przerwaniu skoro już zrobiłeś ADIE.
Paweł_1985 Marzec 2, 2013 Autor tematu Udostępnij Marzec 2, 2013 Niestety dalej nie działa, problem opiera się chyba raczej na napięciu odniesienia, którego w żaden sposób nie mogę zmienić na inne.
marek1707 Marzec 2, 2013 Udostępnij Marzec 2, 2013 Zmierz napięcie na AREF woltomierzem. Może masz tam kondensator elektrolityczny z upływnością lub wręcz odwrotnie podłączony?
Paweł_1985 Marzec 2, 2013 Autor tematu Udostępnij Marzec 2, 2013 Do Aref mam podłączony kondensator MKT, napięcie na Aref wynosi w zależności od konfiguracji bitów MUX: 0 - przy wybrany Aref, Vcc - przy wybranym zewnętrznym napięciu, 2,54 - przy wybranym 2,54.
marek1707 Marzec 2, 2013 Udostępnij Marzec 2, 2013 No to z zewnątrz wygląda dobrze. Nie pytam jak weryfikujesz to dziwne działanie bo mniemam, że doprowadzasz znane Ci napięcie do wejścia a linia PD.1 przełącza się przy 1.2V? A czy gdy zmienisz wartości przy if-ach (nawiasem mówiąc wystarczyłby jeden if-else) to czy i próg napięcia sie zmienia? Pokaż tę nową wersję programu.
Paweł_1985 Marzec 3, 2013 Autor tematu Udostępnij Marzec 3, 2013 Nowa wersja z przerwaniami: #include <avr/io.h> #include <avr/interrupt.h> volatile uint16_t value; void ADC_init(void); int main (void) { ADC_init(); DDRD |=(1<<PD1); for (;;) { if (value > 1020) PORTD |= (1<<PD1); if (value < 1020) PORTD &= ~(1<<PD1); } } void ADC_init() { DDRA=0x00; PORTA=0x00; ADMUX= (1<<REFS0)|(1<<MUX1); ADCSRA= (1<<ADEN)|(1<<ADIE)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC); sei(); } ISR(ADC_vect) { value = ADC; } Jak ustawiam prób na 1023 to właśnie wtedy mogę zaobserwować, że progiem zadziałania diody jest 1,22V i że to jest napięcie odniesienia.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »