Skocz do zawartości

Problem z napięciem odniesienia


Paweł_1985

Pomocna odpowiedź

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?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.