Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 20:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 6 kwi 2021, o 00:34 
Offline
Użytkownik

Dołączył(a): 18 lis 2020
Posty: 31
Pomógł: 0

Witam,

Zaobserwowałem dziwne funkcjonowanie przełączania kanałów przetwornika ADC w ATMega328. Z pewnością robię coś niewłaściwie i chciałby dowiedzieć się dlaczego. Byłbym wdzięczny za wskazanie mi zapisu w nocie technicznej, który tłumaczyłby, że postępuję niewłaściwie. Otóż sytuacja jest następująca. Przechwytuję przerwanie ADC, pobieram wynik konwersji, przełączam kanał i uruchamiam kolejną konwersję. Dla testów ograniczam się do pomiaru temperatury procka - czyli kanał 8. Kod jest następujący (w uproszczeniu):

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Działa to dobrze. Teraz modyfikuję kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nadal działa jak poprzednio - bez zastrzeżeń. Przy inicjalizacji użyłem właśnie ADMUX = 0xC8;

Teraz robię kolejną modyfikację:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I teraz żegnamy poprawne odczyty temperatury. Przypuszczalnie mimo żądania odczytu z kanału 8 czytany będzie kanał 0. Nie mam pewności. Nie znalazłem w instrukcji zapisu mówiącego o tym, że druga zmiana wartości ADMUX przed uruchomieniem konwersji będzie ignorowana.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2021, o 05:54 
Offline
Nowy

Dołączył(a): 30 sty 2021
Posty: 12
Pomógł: 0

Cześć,
A pokaż jeszcze jak inicjalizujesz ADC w kodzie.

Nie mam pewności czy przerwanie to jest dobre miejsce na zmianę kanału... Ale może spróbuj przed zmianą kanału wyłączyć przerwanie od ADC i potem włącz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2021, o 08:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Na początku przerwania odczytuj kanał, a dopiero później zmieniaj na kolejny

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2021, o 20:22 
Offline
Użytkownik

Dołączył(a): 18 lis 2020
Posty: 31
Pomógł: 0

tobsik napisał(a):
Cześć,
A pokaż jeszcze jak inicjalizujesz ADC w kodzie.

Nie mam pewności czy przerwanie to jest dobre miejsce na zmianę kanału... Ale może spróbuj przed zmianą kanału wyłączyć przerwanie od ADC i potem włącz.


Inicjalizacja raczej standardowa. Dla testów pobieram temperaturę procka.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ADMUX po inicjalizacji zawiera 0xC8. Zwróć uwagę, że w przerwaniu zmieniam adres... na dokładnie ten sam. Tyle tylko, że w dwóch krokach. Wtedy przestaje działać. Te dwa kroki docelowo mają za zadanie najpierw wyzerować 4 bity określające adres, a potem wprowadzić właściwy. Testowo wprowadzam ten sam: 0x08 czyli (1 << MUX3).

Zupełnie nie ogarniam w czym rzecz. Robię wszystko zgodnie z notą: odczytuję wartości zgodnie z kolejnością najpierw ADCL, potem ADCH. Dopiero potem zmieniam (a raczej nawet nie zmieniam) adres, odpalam pomiar i odczytuję jakieś niedorzeczne wartości temperatury.

Czy przerwanie jest niewłaściwym miejscem? Hmmm... powinno to się dać zrobić, bo zależy mi na tym, by w miarę szybko odczytać kolejne kanały. Przerwanie to tylko skok i powrót. Nic szczególnego.

------------------------ [ Dodano po: 5 minutach ]

mirekk36 napisał(a):
Na początku przerwania odczytuj kanał, a dopiero później zmieniaj na kolejny


W/g kodu źródłowego przerwania jaki przytoczyłem - dokładnie to czynię. Najpierw odczytuję ADCL, a potem ADCH - jak nota informuje, a dopiero potem zmieniam kanał.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2021, o 22:10 
Offline
Użytkownik

Dołączył(a): 18 lis 2020
Posty: 31
Pomógł: 0

Uśmiejecie się co było przyczyną. Wyszło mi na preskalerze 184kHz. Tak by było, gdyby zegar procka miał 1474560Hz a ma o jedno zero więcej! :-D Za duża częstotliwość na ADC powodowała cuda. tobsik - dzięki za spostrzegawczość. ;-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 kwi 2021, o 15:23 
Offline
Nowy

Dołączył(a): 30 sty 2021
Posty: 12
Pomógł: 0

Super, że działa :D Masz jakiś projekt na oku z tym ADC czy póki co tylko testujesz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 kwi 2021, o 20:29 
Offline
Użytkownik

Dołączył(a): 18 lis 2020
Posty: 31
Pomógł: 0

tobsik napisał(a):
Super, że działa :D Masz jakiś projekt na oku z tym ADC czy póki co tylko testujesz?


Robię projekt. Zbieram informacje z przepływomierzy paliwa z silników - informacja jest w standardzie automatyki przemysłowej 4-20mA. Stąd potrzeba kilku analogowych pomiarów. Potem dołączam dane z szyn CAN silników + GPS i przesyłam "wyżej" na mostek. Fajny temat i zabawa przy nim :-) Z głupim błędem kopałem się 2 dni zanim doliczyłem się, że częstotliwość zegara wklepałem do kalkulatora z jednym zerem za mało. :D Do tego sprzętowo również wyzwanie, bo okazuje się, że masa wiele ma twarzy :-D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO