Hej. Już jakiś czas zmagam się z takim problemem.
Chcę zrobić opóźnienie czasowe przy pomocy sprzętowego Timera1, regulowane przy pomocy potencjometru podłączonego do jednego z przetworników ADC.
Pomysł swój realizuję w ten sposób.
Najpierw deklaruję sobie zmienną o nazwie "wynik" która w zależności od położenia potencjometru przyjmuje wartość od 0 - 1023
Ta zmienna jest zadeklarowana w ten sposób:
volatile static uint16_t wynik;
Następnie w pętli głównej odczytuję wartość ADC w zwyczajny sposób
wynik = pomiar(PC4);
Fakt że dzieje się to bardzo szybko ale mój program nie ma zbyt wiele do roboty. Funkcja odczytująca uwzględnia flagę która mówi o gotowości wyniku, tak więc mam pewność że za każdym razem otrzymuję właściwy wynik pomiaru. Z resztą obserwuję tę zmienną na wyświetlaczu LCD.
Następnie jako przerwanie od Timera1 mam taką funkcję:
język actionscript
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tutaj na początku zwiększam zmienną licznik pulsacji a za tym daję warunek, jeśli zmienna "licznik pulsacji" będzie większa lub równa zmiennej odczytanej z ADC, wówczas niech zresetuje się zmienna licznik pulsacji, dalej niech zresetuje się licznik TCNT1 oraz zmieni stan na przeciwny dioda LED.
Wszystko teoretycznie wygląda OK jednak tak na prawdę dioda LED działa nierównomiernie. Czasami da się zauważyć że dioda wykona dwa cykle "TOGGLE" podczas jednego cyklu wykonania warunku IF z przerwania. Próbowałem już wielu sposobów wszystkie zmienne (nawet te szybkozmienne) monitoruję na wyświetlaczu LCD i wszystko wygląda OK. Kiedy w warunku IF w przerwaniu wpiszę jakąś cyfrę zamiast wyniku ADC wtedy wszystko działa OK.
To sprowadziło mnie na taki ślad, że zmienna wynik, która bywa że waha się o jedną najmniej znaczącą cyfrę, kiedy ślizg potencjometru jest na jakimś skraju dwóch wartości może wprowadzać te zakłócenia.
Z drugiej strony jednak przy tak częstym wykonywaniu przerwania i przy tak krótkich czasach nie sądzę żeby takie małe wahanie jednej cyfry mogło dać wizualne wrażenie nierównomiernej pracy.
Czy ma ktoś jakiś pomysł jak to ustabilizować? Niecierpliwie czekam na Wasze wskazówki.
Przed chwilą zrobiłem takie karkołomne działanie
if (licznik_pulsacji>= (wynik|(wynik+1)|(wynik-1)))// programowy preskaler
przez co wydaje mi się wyeliminowałem takie drgania jednak problem pozostał. Nadal nie mam pomysłu.