Autor: Dondu
Początkujący projektanci z braku doświadczenia (co jest naturalne) bardzo często wychodzą z założenia, że funkcjonalność danego pinu mikrokontrolera jest ustawiana gdzieś na początku programu i nie podlega zmianom w trakcie jego działania.
Inspiracją do napisania tego artykułu było pytanie zadane przez kol. Bonczi:
To bardzo dobre pytanie!
Pytanie zostało zadane w artykule dot. generatora liczb losowych wykonanego za pomocą pomiarów jednego z pinów ADC niepodłączonego do niczego i z wyłączonym rezystorem pull-up. Taki pin staje się antenką zbierającą wszelkie zakłócenia. Pisałem o tym w wielu miejscach, a w szczególności:
Zakłócenia zbierane przez jeden z tak wykorzystanych pinów ADC mogą (lecz nie muszą) być przyczyną interferencji zakłóceń na sąsiednich pinach ADC. Nie da się tutaj generalizować skutków, ponieważ zależą one od sposobu wykonania projektu i środowiska, w którym pracuje.
W przypadku generatora liczb losowych wykorzystujemy zakłócenia do generowania losowych liczb. Kol. Bonczi zauważył, że istnieje tutaj wewnętrzna sprzeczność interesów, gdy chcemy jednocześnie używać jeden kanał (pin) przetwornika ADC do generowania liczb losowych, a inne do pomiarów innych sygnałów analogowych.
Co w takiej sytuacji zrobić? Odpowiedź jest bardzo prosta:
Zmieniaj funkcje pinów w trakcie pracy programu!
To powszechna praktyka, a bardzo często wręcz konieczność, bez której wiele projektów byłoby znacznie bardziej skomplikowanych, gdyby nie wykorzystywały zmian funkcjonalności pinów w trakcie realizacji programu.
Jak więc powinniśmy rozwiązać problem poruszony przez kol. Bonczi?
W ten sposób, "antenka" włączona jest tylko w określonym przedziale czasu, gdy nie dokonujemy innych pomiarów za pomocą ADC niż pomiar na potrzeby generatora liczba losowych. Jeżeli więc wykonywać będziesz jakieś pomiary na pozostałych kanałach ADC, antenka będzie spolaryzowana np. wewnętrznym rezystorem pull-up i nie będzie zbierała zakłóceń.
Taki algorytm może jednak spowodować, że potencjał napięcia na pinie odpowiedzialnym za generowanie liczb losowych nie będzie już tak bardzo losowy jak w przypadku ciągłego jego pozostawienia w formie "antenki" zbierającej zakłócenia. Wynika to z faktu, iż tuż przed dokonaniem pomiaru włączamy rezystor pull-up, który ładuje nam wszelkie wewnętrzne ukryte pojemności związane z częścią wejściową pinu.
Co więc możemy zrobić? Na przykład dodać opóźnienie:
A jeżeli nie możemy dodać opóźnienia lub nie daje to odpowiednio losowych zakłóceń na pinie wejściowym generatora liczb losowych?
Niektóre mikrokontrolery mają różne struktury wewnętrzne wybranych pinów wejściowych ADC (kanałów). Przykładem takiego mikrokontrolera jest mikrokontroler ATmega8, który zawiera 6 (w wersji obudowy DIP) lub 8 (w wersjach pozostałych) kanałów przetwornika ADC.
Część analogowa tego mikrokontrolera (w tym przetwornik ADC) jest zasilana z osobnego pinu, którym jest AVcc. Ale są wyjątki:
Piny ADC4 i ADC5 są inaczej zasilane niż pozostałe piny wejściowe przetwornika ADC. Jest to związane z ich szczególną funkcjonalnością alternatywną, jaką jest przypisanie im funkcji interfejsu komunikacyjnego TWI (I²C):
Ponieważ zasilanie wewnętrznej struktury tych pinów jest realizowane z pinu zasilającego pozostałą (cyfrową) część mikrokontrolera możemy się spodziewać, że pomiary będą obarczone większym błędem niż na pozostałych pinach ADC. W związku z tym piny te należy używać do pomiarów 10-bitowych tylko wtedy, gdy już nie mamy innego wyjścia.
Jednak w przypadku generatora liczb losowych zakłócenia na pinie pomiarowym przeznaczonym do tworzenia liczb losowych, są nam "na rękę" stąd w przypadku, o którym pisze kol. Bonczi warto jest podzielić funkcjonalności w następujący sposób:
- ADC0-ADC3: piny pomiarowe o dużej dokładności,
- ADC4: pin pomiarowy o możliwych większych błędach niż ADC0-ADC3,
- ADC5: pin pomiarowy generatora liczb losowych,
- ADC6-ADC7: piny pomiarowe o dużej dokładności (w obudowach innych niż DIP).
Odległość "antenki" od pozostałych pinów
Odległość pinu z antenką od innych pinów pomiarowych także może mieć wpływ na interferencję zakłóceń. Dlatego jeżeli masz możliwość wyboru, powinieneś tak rozplanować podłączenie kanałów ADC, by leżały możliwie daleko od siebie, a na PCB były oddzielone polygonem masy:
Usypianie
Należy także pamiętać o możliwościach związanych z odpowiednim trybie usypiania na czas pomiaru ADC dla pinów innych niż pomiar dla potrzeb generatora liczb losowych. W mikrokontrolerach AVR tym trybem jest ADC Noise Reduction mode.
Podsumowanie
W ten sposób dzięki:
- odpowiedniemu algorytmowi zmieniającemu funkcje pinu w trakcie pracy mikrokontrolera,
- odpowiedniemu przydzieleniu pinów pomiarowych,
- usypianiu mikrokontrolera na czas pomiaru,
Jakie inne przypadki zmiany funkcji pinu w trakcie działania programu chcecie, aby zostały omówione?
Czekam na propozycje w komentarzach.
Z racji braku komentarzy, może komuś będzie przydatne, gdy opisze się wykorzystanie jakiegoś pinu do funkcjonowania jednocześnie jako wejście oraz wyjście :) np. przycisk + wyjście led, zmieniając cykl co jakiś czas, ale to tylko sugestia.
OdpowiedzUsuńSugestia jak najbardziej słuszna. Główkowanie to chleb powszedni projektantów :-)
UsuńNo cóż, można także opisać realizację magistral o stanie recesywnym za pomoca zmiany kierunku pinu. Chodzi mi o patent przy realizacji 1Wire, gdzie pin skonfigurowany jest jako wejście ze stanem wysokim i w zasadzie cały protokuł realizujemy zmieniając tylko kierunek pinu.
OdpowiedzUsuń