Skocz do zawartości

[C] Przetwornik ADC - działał działał... i nie działa.


drukarz

Pomocna odpowiedź

Witam kolegów.

Próbuje (nieskutecznie jak na razie) uruchomić przetwornik A/D w Amtega8.

Najdziwniejsze jest to że kilka dni temu działał jak należy i to na czterech kanałach a dzisiaj już nie chce. Może ktoś będzie wiedział i mi powie co robię nie tak?

Na wyświetlaczu cały czas pojawia mi się 0. I nie wiem już czy zapomniałem coś ustawić czy może jest uszkodzony przetwornik? Niestety nie mam już innej atmegi żeby się upewnić.

Funkcje LCD działają jak należy, itoa też działa dobrze. Napięcie do AREF jest podłączone.

Oto ten malutki programik który mnie tak ogromnie męczy:

#include <avr/io.h> 
#include <util/delay.h> 
#include <inttypes.h> 
#include <avr/pgmspace.h> 
//#include <compat/deprecated.h> 
#include <stdlib.h> 
//#include <avr/interrupt.h>        
//#include <avr/signal.h>           
#include "definicje.h" 
#include "makra.h" 
#include "lcd.c" 



//POCZĄTEK PLIKU MAIN
int main(void) 
{ 
uint16_t wartosc3;				//zmienna do odczytu danych z ADC
char bufor[5]; 					// string na który zamienimy wartość odczytaną z ADC 

//ustawienie portów
LCDsetport();				
//inicjalizacja wyświetlacza
LCDinit(); 

ADMUX = 5;               		// kanał 5 przetwornika ADC
ADCSR = 1<<(ADEN);				// ustawiamy bit enabled rejestru ADCSR


for(;;) 
{ 

	ADCSR = 1<<(ADSC);        	// rozpocznij pomiar przetwornikiem ADC
	wartosc3 = ADCW; 			//zmienna wartosc3 przyjmuje wartosc z ADC
	LCDstr(itoa(wartosc3, bufor, 10));//itoa zmienia wartość na string

	_delay_loop_2(0xfff); 
	LCDcls(); 
} 

return 0; 
}

Pozdrawiam.

Link do komentarza
Share on other sites

wartosc3 = ADCW;             //zmienna wartosc3 przyjmuje wartosc z ADC 

To mi się nie podoba co to za rejestr? ja korzystam z ADCH i ADCH , nie wiem czy nie powinieneś czekać na koniec konwersji :

while(bit_is_set(ADCSRA,ADSC)){};

No i nie pokazałeś jak poustawiałeś to wszystko (porty i inne rejestry). Polecam stronkę

http://www.tkdami.net/~voytek/programy/adc/Przetwornik_AC.html świetnie jest tam wszystko opisane.

Link do komentarza
Share on other sites

ADCW to 16bitowy rejestr składający się z rejestru ADCH i ADCL.

Może i powinienem czekać na koniec ale działało i bez tego a teraz nie chce.

Innych rejestrów nie ustawiam przecież. Nie trzeba ich wszystkich ustawiać. Port C na którym jest przetwornik jest wolny i nic go nie zakłóca.

Link do komentarza
Share on other sites

Jeszcze takie coś znalazłem

Do prawidłowej pracy przetwornik potrzebuje sygnału taktującego o częstotliwości z przedziału od 50kHz do 200kHz

A nie widzę zmiany tych bitów ADPS0 do ADPS2 . No i nie wiem jak z tym AREF ja miałem niby 5 V tam podłączone ale mi nie działało więc przestwiłem na AVCC jako napięcie odnieśenia.

  • Pomogłeś! 1
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

ADPSy są nieruszone w tym przypadku więc są w nich ustawione zera. Jednym słowem preskaler jest wyłączony (preskaler wynosi 1). Nie jest to wina tego napewno.

Jak podłącze 5V do AVCC lub/i do AREF to nic się nie zmienia.

Link do komentarza
Share on other sites

ADPSy są nieruszone w tym przypadku więc są w nich ustawione zera. Jednym słowem preskaler jest wyłączony (preskaler wynosi 1). Nie jest to wina tego napewno.

A chyba jednak

fragment z atmega8 datasheet:

"By default, the successive approximation circuitry requires an input clock frequency between 50

kHz and 200 kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the

input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate."

  • Pomogłeś! 1
Link do komentarza
Share on other sites

No właśnie tak jak abxyz pisze.

Jak podłącze 5V do AVCC lub/i do AREF to nic się nie zmienia.

A po podłączeniu do AVCC zmieniłeś w rejestrach skąd ma brać napięcie odniesienia?

Link do komentarza
Share on other sites

Witam po dłuższej nieobecności.

Po zmianie preskalera na 8 (czyli sygnał taktujący 125kHz) i ustawieniu bitu ADFR w rejestrze ADCSR przetwornik działa jak powinien. Reszta pozostała bez zmian.

Dziękuję za pomoc.

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.