Posiadam aparaturę zdalnego sterowania, w której podczas maksymalnych wychyleń drążka w lewo i prawo na nadajniku, na odbiorniku na wyjściu sygnałowym napięcia przykładowo 0.26-0.42V. Chciałbym podłączyć ten sygnał do wejścia uC. Czy można programowo odróżnić te wartości napięcia, aby w skrajnych przypadkach podawać napięcie na różne wyjścia uC?
Posiadam aparaturę zdalnego sterowania, w której podczas maksymalnych wychyleń drążka w lewo i prawo na nadajniku, na odbiorniku na wyjściu sygnałowym napięcia przykładowo 0.26-0.42V. Chciałbym podłączyć ten sygnał do wejścia uC. Czy można programowo odróżnić te wartości napięcia, aby w skrajnych przypadkach podawać napięcie na różne wyjścia uC?
Można bez problemu, przy pomocy ADC. Ale jesteś pewien, że masz tam zmiany napięcia? No mnie się wydaje, że masz tam sygnał sterujący servem - czyli impulsy co kilkanaście ms o szerokości ok. 1,5ms+/-0,25ms. W takiej sytuacji należałoby do pomiaru wykorzystać wejście ICP timera.
Nie, jest to wartość konwersji napięcia przetwornika A/C na postać cyfrową. jest to wynik bezwymiarowy. Wartość napięcia musisz policzyć sobie z proporcji. Dla konwersji 10-bit i Vin=Vref => value=1023.
Tutaj: http://extremeelectronics.co.in/avr-tutorials/using-the-analog-to-digital-converter/ na pierwszym rysunku masz wszystko wyjaśnione.
Z resztą w linku który podałeś też jest to opisane.
Ja jednak dołaczył bym się do zdania kolegi tmf - pomysł mierzenia napięcia jest głupi, tam jest przebieg prostokątny (potrzebny byłby dość mocny filtr dolnoprzepustowy), należy mierzyć czas trwania stanu wysokiego a nie jakieś napięcie, którego wartośc może zależeć np. od stanu baterii. Dodatkowy zysk jest taki, że praktycznie jednym wejściem procka (ICP) można odczytywać stan kilku kanałów, należy jedynie zrobić cyfrową sumę sygnałów.
Od początku nie działał do końca poprawnie. Być może kwestia podłączeń, bo mieszają mi się wszystkie terminy związane z 'napięciem referencyjnym'. Otóż po ustawieniu potencjometru tak, że napięcie na mierniku było wyższe niż 2.5V (to pewnie te 512 bitów, więc się zgadza), jedna dioda się zapalała, a poniżej 2.5V ta dioda gasła, ale inna już się nie zapalała. Dodatkowo delikatnie zwiększając napięcie 'graniczne', dioda zmieniała swoją jasność. Czy nie powinno być tak, że po określonym napięciu na przetworniku odpowiedni port ma po prostu zostać ustawiony na stan wysoki, czyli dawać zwyczajne 5V?
Inna sprawa jest taka, że potem zmieniłem ilość bitów z 512 na 64. Obliczyłem sobie, że skoro 2,5V - 512 b, to 64 bity - 0.3V. Poprawnie? W tym wypadku jedna dioda zapalała się już przy 2V (zjeżdżając w dół), ledwie dostrzegalnie. Druga analogicznie się nie zapalała. Odbiornik podłączony pod ADC (0.26-0.42V) nie zapalał żadnej diody.
A wracając do tematu, to wychodzi jednak na to, że lepiej zrobię, jeśli zamiast ADC zajmę się timerami? Czy muszę do tego znać jakąś specyfikację tego odbiornika? Jakieś wskazówki?[/code]
Standardowe aparatury do zdalnego sterowania, na pojedynczym wyjściu dają impulsy o długości 1-2ms (stąd mniej wiecej dwukrotna zmiana napięcia przy pomiarze woltomierzem) powtarzane 50 razy na sec. W kanale radiowym impulsy są nadawane kolejno i rozdzielone dłuższym impulsem, niestety do tego sygnału nie ma dostępu, a można by łatwo odebrać wszystkie kanały naraz. Jak przypuszczam, (to najbardziej logiczne rozwiązanie, ale nie można wykluczyć, że producent wymyślił jakieś dziwactwo) impulsy na wyjściach poszczególnych kanałów pojawiają się dokładnie wtedy, gdy idą w kanale radiowym - a więc idą po kolei w różnych momentach, dzięki czemu można je dodać.
Mam nadzieję, że czytelny Rezystory przy ledach to 330.
krru, jeśli chodzi o odbiornik i woltomierz, to wygląda to tak: przy środkowym położeniu wajchy napięcie wynosi 0.3V, dam w lewo - stopniowo obniża się do 0.22 w ekstremum, dam w prawo - rośnie do 0.34. Wyniki nie 'skaczą'. A zatem to napięcie to nie takie 'zwykłe' napięcie, które widzi miernik, tylko szybkie impulsy, które wykrywa uC? Jak miałbym się zabrać do mierzenia długości tych sygnałów, skąd uC ma wiedzieć, kiedy będzie 'lewo', a kiedy 'prawo'?
Nie, zasilał się wcześniej w porządku, opisałem przecież efekty . Teraz po poprawkach jedna dioda świeci się cały czas niezależnie od napięcia przez potencjometr, czy to 0 czy 5V.
Nie, zasilał się wcześniej w porządku, opisałem przecież efekty .
Jeżeli miałeś go tak podłączony jak na schemacie, to mógł zasilać się poprzez wewnętrzne struktury i podłączenia diod i potencjometru, co jest tylko przypadkowym efektem.
Seppe napisał:
Teraz po poprawkach jedna dioda świeci się cały czas niezależnie od napięcia przez potencjometr, czy to 0 czy 5V.
No i teraz trzeba dopiero przyglądnąć się Twojemu programowi.
Zacznijmy od tego, że nie podałeś, jaką częstotliwość zegara masz ustawioną.
i tak na wszelki wypadek pokaż na schemacie jak poprawiłeś podłączenie.
A to ma kluczowy wpływ na przetwornik? Wygląda na to, że nie ustawiłem . Niezbyt pojmuję jeszcze całe to ADC i nie znam zależności między częstotliwością a pomiarem. Załóżmy, że dodam #define F_CPU 16000000L .
Widać tkwię w piekiełku po uszy .
Zajmę się tym, ale istotne jest, czy mogę jednak użyć tego do mojego celu? Da radę wykorzystać to oszukane napięcie z odbiornika w prawidłowo ustawionym przetworniku? Bo jak nie, to lepiej się skupię na czym innym .
Możesz mierzyć za pomocą ADC jeżeli faktycznie masz tam zmianę napięcia.
Jeżeli jednak tak jak sugerował tmf, jest tam sygnał PWM, to wtedy powinieneś:
1. dodać jakiś kondensator na wejściu ADC,
2. lub nie korzystać z ADC w ogóle, a mierzyć sygnał PWM za pomocą ICP.
Prawie każde zadanie można wykonać na wiele sposobów
Mam nadzieję, że czytelny Rezystory przy ledach to 330.
krru, jeśli chodzi o odbiornik i woltomierz, to wygląda to tak: przy środkowym położeniu wajchy napięcie wynosi 0.3V, dam w lewo - stopniowo obniża się do 0.22 w ekstremum, dam w prawo - rośnie do 0.34. Wyniki nie 'skaczą'. A zatem to napięcie to nie takie 'zwykłe' napięcie, które widzi miernik, tylko szybkie impulsy, które wykrywa uC? Jak miałbym się zabrać do mierzenia długości tych sygnałów, skąd uC ma wiedzieć, kiedy będzie 'lewo', a kiedy 'prawo'?
Zrób sobie prosty oscyloskop, chociażby z karty dźwiękowej komputera i zobacz jak wygląda sygnał na tym wyjściu. Podane przez ciebie wartości napięć sugerują, że nie jest to wyjście analogowe, a cyfrowe, woltomierz po prostu uśrednia to co widzi. Z drugiej strony jeśli twój miernik ma możliwość pomiaru częstotliwości to sprawdź jaką widzi, powinno być coś koło 50 Hz (jeśli to wyjście analogowe to 0 Hz). Jeśli tak jak pisałem jest to wyjście sterowania serwem to impulsy w położeniu neutralnym mają 1,5ms, impulsy krótsze to wychylenie np. w lewo, a dłuższe to w prawo (lub odwrotnie bo to bez znaczenia). Zanim zaczniesz brnąć dalej ustal koniecznie z jakim typem sygnału masz do czynienia. Pomiar przez ADC sygnału cyfrowego PPM będzie obarczony kosmicznym błędem, nawet jeśli dasz filtr magicznego rzędu to napięcie będzie się zmieniać, a dodatkowo dynamika poleci.
Wyniki nie skaczą, bo cyfrowe mierniki uśredniają pomiar przez 20ms (50Hz) - tak by maksymalnie wyeliminować zakłócenia sieciowe. A tutaj też jest pewnie 50Hz - stąd stały odczyt. 50Hz mieści się w paśmie akustycznym - wystarczy podłączyć słuchawkę do wyjścia, ewentualnie przez tranzystor. Można też przełączyć miernik na pomiar napięć zmiennych.
Podłączyłem pod głośniczek. Słychać 'terkanie', czy 'pykanie', bardzo szybkie. Jak dam wajchę w lewo, ton jest niższy, w prawo - wyższy. To zapewne znaczy, że w lewo sygnały są dłuższe, a w prawo krótsze? To mi wystarczy?
No więc zgodnie z moimi przypuszczeniami masz tam sygnał cyfrowy, w którym informacja o położeniu jest kodowana jako czas trwania impulsu - 1,5ms położenie neutralne, 1 lub 2ms położenia skrajne. W takim przypadku to co potrzebujesz to:
1. Porzucić pomysły związane z ADC,
2. Zająć się timerem, a dokładniej układem pomiaru czasu trwania impulsu - input capture unit. Jeśli coś tu będzie niejasne to pytaj.
Czy terminy 'rising/falling edge' to odpowiednio rosnące i opadające zbocza mojej fali z powyższych zrzutów? Jeśli tak, to czy taki plan działania jest odpowiedni?
1. Wykryć zbocze narastające i uruchomić licznik
2. Wykryć zbocze opadające i zatrzymać licznik
3. Złapany czas to długość fali
4. Jeśli długość taka, zrób to, jeśli inna, zrób tamto.
Jak porównać długości fali do tej neutralnej (1.39 ms)?
W sumie może być, ale można dokładniej - wejscie ICP automatrycznie powoduje, że w odpowiednim rejestrze (ICR) zostaje zapamiętana bieżąca wartość licznika. Dzięki temu nie masz tak krytycznych zależności czasowych w programie - jak przerwanie się trochę opóźni to nic się zgubisz. Zostawiasz licznik pracujący w kółko, w przerwaniu ICP zmieniach naprzemiennie zbocze na które reagujesz. Na zboczu narastającym zapamiętujesz w jakiejś zmiennej stan rejestru ICR, na opadającym odejmujesz ta wartosc od aktualnej zawartości rejestru ICR. Dobrze byłoby by licznik przepełniał się wolniej niż 50 razy na sec, tak by najwyżej raz się przepełnił pomiędzy zboczami. Przerwania od przepełnienia też się przydadzą by wykryć brak impulsów - naprzykład wyjście poza zasięg.
Ostatnio trochę bawiłem się timerem, zrobiłem odbiór RS232 na wejściu ICP.