Filtracja ADC w Arduino: Rodzaje i zastosowania
- Szczegóły
Użytkownik zmaga się z niestabilnością wartości ADC podczas pomiaru temperatury za pomocą czujnika TMP36 i mikrokontrolera Atmega32A-PU. Problemy dotyczą skoków wartości ADC, co wpływa na odczyty temperatury.
Problem niestabilnych odczytów ADC
Problem polega na tym, że wartość ADC jest niestabilna. Głównie tyczy to się cyfr jedności (kiedy , np. wartość ADC wynosi 256 to cały czas skacze ona z 256 na 257, potem znowu 256 itd...). Przekłada się to negatywnie na odczytaną przeze mnie wartość temperatury, ponieważ wartości po przecinku cały czas się zmieniają, np. skacząc w kółko z 21.2 na 21.5.
To że przetwornik dla pewnych napięć skacze o swoją jednostkę nie jest jakieś tragiczne bo to oznacza że zakłócenia mają amplitudę mniejszą niż jego rozdzielczość. Sedno problemu jest w tym że ADC ma akurat rozdzielczość 2,5mV a TMP ma 10mV/stopień i jeśli chcesz mieć na wyświetlaczu dziesiąte stopnia to może to faktycznie wyglądać nieelegancko. Choć metrologicznie jest poprawne działanie.
Jeśli problemem jest przeskok o jednostkę to znaczy, że nie ma problemu. Masz idealne odczyty. Teraz po stronie programu musisz zrobić jakąś filtrację.
Metody stabilizacji odczytów ADC
W odpowiedziach zasugerowano kilka rozwiązań, w tym zmniejszenie pojemności kondensatorów na zasilaniu, uśrednianie odczytów ADC, a także zastosowanie filtrów dolnoprzepustowych.
Przeczytaj także: Definicja i pomiar filtracji kłębuszkowej
Uśrednianie odczytów
Czyli np. uśredniać odczyty z jakiegoś okresu, np. sekundy. Średnia będzie znacznie bardziej stabilna, możesz np. wyświetlać dominantę wartości odczytanych w jakimś czasie itd.
Jeśli potrzebujesz odczyty co pół sekundy, to możesz np. same odczyty z ADC robić dużo częściej np. sto razy na sekundę, zbierać do bufora a wartość uśrednioną wyświetlać co pół sekundy.
Na ADC nie dostajesz nic po przecinku, bo nie ma przecinka. Masz liczyć średnią z "tablica". Cała funkcja, np. average_adc_read() to będą te dwie linie, plus oczywiście start nowego pomiaru. W average_adc() musisz tylko zwrócić średnią z tej tablicy.
Filtrowanie dolnoprzepustowe
Można trochę z tym zawalczyć filtrując napięcie z TMP, bo to przebieg wolnozmienny. Przykładowo dodając układ RC, tzn. połączyć Vout do pinu ATmega poprzez opornik kilka kiloomów a między masę a wejście ADC (jak najbliżej ATmega) dać kondensator np. 100nF lub więcej.
FILTRUJ, nie uśredniaj! Ludziska, czy Wy naprawdę uśredniacie pomiary zamiast je filtrować, że tak wszyscy jak jeden mąż rekomendujecie delikwentowi to głupie uśrednianie? Filtrowanie jest szybsze, prostsze i nie wymaga przechowywania iluś tam próbek.
Przeczytaj także: Webber AP8400 - wymiana filtrów
Po drugie: nie potrzebujesz uśredniać, tylko filtrować filtrem dolnoprzepustowym.
Filtr programowy
Może da się wykonać filtr programowy by np za krótkich impulsów nie liczył jako prawidłowe tak samo następujących za szybko po sobie.
Praktyczne wskazówki
- Sprawdź poprawność podłączenia pinów AREF i AVCC oraz kondensatorów filtrujących.
- Rozważ dodanie układu RC filtrującego na wyjściu czujnika TMP36.
- Implementuj uśrednianie odczytów ADC lub filtr dolnoprzepustowy w kodzie programu.
- Upewnij się, że zmienne używane do obliczeń są odpowiedniego typu (np. uint16_t, uint64_t).
- Obserwuj diodę czujnika, aby zidentyfikować potencjalne zakłócenia.
Dodatkowe uwagi
Autor pisze program na chybił trafił, pyta dlaczego średnia z kilku liczb ujemnych daje liczbę ujemną i dlaczego pisanie poza tablicą psuje mu program, a Ty jako rozwiązanie proponujesz oversampling adc. Prosta średnia krocząca jat w tym przypadku całkiem ok, nawet jeśli wykładnicza będzie łatwiejsza w obsłudze i nawet jeśli jakakolwiek inna metoda da lepsze wyniki.
Jeśli ktoś myśli poważnie o programowaniu w przyszłości to douczenie się o filtrach nie powinno być problemem, taki rodzaj zawodu, że prędkość uczenia się jest bardzo istotna.
Najważniejsze, żeby mierzyć temperaturę, i żeby wynik się dobrze wyświetlał, przynajmniej wtedy, kiedy jest parzysty, bo przecież nieparzysty nie będzie się zdarzał zbyt często, nie?
Przeczytaj także: Optymalne rozcieńczenie bimbru
tags: #filtracja #ADC #Arduino #rodzaje

