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



Teraz jest 10 sty 2025, o 22:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 2 lip 2014, o 20:27 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

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ę:

Składnia: [ Pobierz ] [ Ukryj ]
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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2014, o 20:48 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Sprawdzałem to też Obie zmienne o które pytasz są typu volatile static uint16_t nie wiem o jakie klasy pamięci Ci chodzi.



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: 2 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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