Skocz do zawartości

Problem z napięciem odniesienia


Pomocna odpowiedź

Napisano

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?

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.

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.

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.

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.

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ę »
×
×
  • Utwórz nowe...