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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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