Skocz do zawartości
Zaloguj się, aby obserwować  
Paweł_1985

Problem z napięciem odniesienia

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?

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

Zmierz napięcie na AREF woltomierzem. Może masz tam kondensator elektrolityczny z upływnością lub wręcz odwrotnie podłączony?

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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!

Gość
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.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...