Autor: Dondu
Prowadząc z supportem Atmela korespondencję w zakresie problemów mikrokontrolera ATmega8 związanych z wewnętrznym zwarciem pinów Vcc i AVcc (występujęce w niektórych wersjach i partiach tego mikrokontrolera), dowiedziałem się bardzo ciekawej rzeczy.
Część mikrokontrolerów AVR w przypadku przetwornika ADC zawiera układ pozwalający na pomiary różnicowe oraz wzmacniacz sygnału. Przykładem takiego mikrokontrolera jest ATmega128:
Wybór trybu różnicowego i włączenia wzmacniacza odbywa się poprzez rejestr ADMUX w następujący sposób:
ATmega128 |
Zauważ, że zaznaczone kolorem zielonym ustawienia rejestru ADMUX rozpoczynają się od 01000 i kończą na 01111. Różnią się one od pozostałych ustawień wartością bitów MUX3 oraz MUX4.
Porównując to do ADMUX ATmega8:
ATmega8 |
oraz ATmega 88
ATmega88 |
zauważysz, że prawie w całości obszar ten jest zarezerwowany, ale bit MUX3 oczywiście osiągalny (możliwe jego ustawianie i zerowanie):
Informacje uzyskane z supportu Atmela były dość nieoczekiwane:
Okazuje się, że w prawie każdej wersji mikrokontrolerów, w których w dokumentacji nie ma informacji o trybie różnicowym oraz o wzmacniaczu sygnału, faktycznie ten tryb i wzmacniacz występują.
Dlaczego więc brak o nich informacji?
Support stwierdził, że są to błędy (niedopracowania) projektowe we wstępnych wersjach tych układów, powodujące nieprawidłowe działanie wzmacniacza, a konkretnie znaczne wykraczanie poza parametry. Błędy te pozostały na matrycach produkcyjnych do dziś! Na moje pytanie dlaczego lakonicznie stwierdzili, że było to także związane ze strategią marketingową Atmela.
Idąc tym tropem dokonałem testów posiadanych wersji ATmega8 i ATmega88.
ATmega8-16PI, 0503I, od spodu: 4L1820, 355POI, 4-P0503; obudowa: DIP
To najstarsza ATmega w moich zbiorach. |
|||
---|---|---|---|
MUX3:0 | Kanał lub różnicowe | Wzmocnienie | Rezultat |
1000 | ADC0 | 10x | Poprawnie |
1001 | ADC1-ADC0 | 10x | Poprawnie |
1010 | ADC0 | 200x | Brak reakcji na wzmocnienie |
1011 | ADC1-ADC0 | 200x | j.w. |
1100 | ADC2 | 10x | Poprawnie |
1101 | ADC3-ADC2 | 10x | Poprawnie |
ATmega8A-PU, 1136, od spodu: H6L732-2, 354VAN, 6-P1136, e3; obudowa: DIP | |||
---|---|---|---|
MUX3:0 | Kanał lub różnicowe | Wzmocnienie | Rezultat |
1000 | ADC0 | 10x | Poprawnie |
1001 | ADC1-ADC0 | 10x | Poprawnie |
1010 | ADC0 | 200x | Pomiary kompletnie z kosmosu |
1011 | ADC1-ADC0 | 200x | j.w. |
1100 | ADC2 | 10x | Poprawnie |
1101 | ADC3-ADC2 | 10x | Poprawnie |
ATmega8A-AU, 1116, od spodu: H6L099.06, 354VAN, 3-P, 1116, e3 obudowa: TQFP | |||
---|---|---|---|
MUX3:0 | Kanał lub różnicowe | Wzmocnienie | Rezultat |
1000 | ADC0 | 10x | Poprawnie |
1001 | ADC1-ADC0 | 10x | Poprawnie |
1010 | ADC0 | 200x | Pomiary kompletnie z kosmosu. |
1011 | ADC1-ADC0 | 200x | j.w. |
1100 | ADC2 | 10x | Poprawnie |
1101 | ADC3-ADC2 | 10x | Poprawnie |
ATmega88-PU, 1028; od spodu: G5K112, 27HON, 3-S1028, a0; obudowa: DIP | |||
---|---|---|---|
MUX3:0 | Kanał lub różnicowe | Wzmocnienie | Rezultat |
1000 | ADC0 | 10x | Poprawnie |
1001 | ADC1-ADC0 | 10x | Poprawnie |
1010 | ADC0 | 200x | Całkiem nieźle poniżej 0,1V, ale wyżej to tragedia |
1011 | ADC1-ADC0 | 200x | j.w. |
1100 | ADC2 | 10x | Poprawnie |
1101 | ADC3-ADC2 | 10x | Poprawnie |
Do pobrania
Poniżej do pobrania pliki HEX dla transmisji szeregowej przez RS-232:
- F_CPU 1MHz
- baud 9600
- bez parzystości
- jeden bit stopu
Jak ustawić terminal Realterm, by odbierać dane znajdziesz w tym artykule: RS-232: Komunikacja ATmega8 z komputerem (Uwaga! Tam ustawiam baud na 57600, a tutaj wykorzystuję 9600 - reszta jest taka sama).
Pliki hex do pobrania (zajętość flash 3,4kB):
Schemat
Układ testowy podłączony według wersji 1.2.3 z tego artykułu: ADC - Dokładność vs podłączanie
Zasilanie 5V - istotne dla prawidłowych wyników!!!
Na wejściach ADC0-ADC3 podłączone potencjometry tworzące cztery dzielniki napięciowe, by móc badać różne napięcia i ich zależności, czyli podobnie jak to jest w tym artykule: ADC - Wstęp i uruchomienie tylko bez rezystora R5.
Wnioski
Jak zauważysz, w każdym z badanych mikrokontrolerów wzmocnienie 10x jest zawsze osiągalne i w mojej ocenie wystarczająco dokładne, by z powodzeniem je stosować. W przypadku wzmocnienia 200x jest znacznie gorzej i trudno opierać się na wynikach takich pomiarów.
Ponieważ jest to nieudokumentowana funkcjonalność niektórych mikrokontrolerów AVR, stąd też oczywiście nie powinno się jej wykorzystywać w projektach komercyjnych.
Nic nie stoi jednak na przeszkodzie, by w projektach hobbystycznych ją wykorzystać :-)
Masz czas, przetestuj i daj znać o wynikach
Tradycyjnie już jak w poprzednim przypadku dot. pinów Vcc i AVcc, także i tym razem czekam na rezultaty Waszych pomiarów i wniosków, w formie komentarzy do niniejszego artykułu. Pamiętaj, by podać dokładne oznaczenia układu zarówno z górnej, jak i dolnej strony.
Rezultat pracy programów 1 kwietnia 2014r. |
Ja kiedyś znalazłem w AT90PWM3 jakieś dziwne rejestry, które w dokumentacji nie zostały opisane. Może też to jakieś cuda-wianki :)
OdpowiedzUsuń0x32 (0x52) MSMCR Monitor Stop Mode Control Register reserved
0x31 (0x51) MONDR Monitor Data Register reserved
Ciekawe. Ale to chyba nie z okazji 1 kwietnia? :D
OdpowiedzUsuńAle się dałem nabrać! Świetny kawał ;D
OdpowiedzUsuń:D
UsuńTen komentarz został usunięty przez autora.
OdpowiedzUsuńCzasy 8bitowców mi się przypomniały. Nieudokumentowane funkcje grafiki (o których sami projektanci mogli nie wiedzieć), nieudokumentowane rozkazy asemblerowe...
OdpowiedzUsuń