logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][C] - Odczytywanie wartości napięcia na wejściu

Seppe 25 Sie 2012 03:19 6237 34
  • #1 11243143
    Seppe
    Poziom 10  
    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?
  • Pomocny post
    #2 11243284
    11111olo
    Poziom 42  
    Można, choć to nie za wielkie zmiany.
  • Pomocny post
    #3 11243347
    tmf
    VIP Zasłużony dla elektroda
    Seppe napisał:
    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.
  • Pomocny post
    #5 11250454
    Jakub
    Poziom 14  
    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.
  • #7 11252791
    krru
    Poziom 33  
    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.
  • #8 11253005
    Seppe
    Poziom 10  
    Dzięki za linki. Przejrzałem, i skończyłem z jeszcze większym mętlikiem w głowie :). Będę musiał przestudiować. Przedtem zacząłem się bawić z tutorialem z tej strony:
    http://www.robotplatform.com/knowledge/ADC/adc_tutorial_4.html . Oto kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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]
  • Pomocny post
    #10 11253313
    krru
    Poziom 33  
    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ć.
  • #11 11253536
    Seppe
    Poziom 10  
    Mam nadzieję, że czytelny :)
    [Atmega8][C] - Odczytywanie wartości napięcia na wejściu
    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'? :)
  • #12 11253551
    dondu
    Moderator na urlopie...
    Seppe napisał:
    [Atmega8][C] - Odczytywanie wartości napięcia na wejściu

    Oj, coś nie teges z podłączeniem Vcc i AVcc do +5V. Mam nadzieję, że to tylko błąd na schemacie?
    Kondensatory 100µF, czy 100nF?

    Seppe napisał:
    Mam nadzieję, że czytelny :)

    Zacznij korzystać z Eagle: http://mikrokontrolery.blogspot.com/2011/04/kicad-projektowanie-schematow-i-pytek.html
  • #13 11253559
    Seppe
    Poziom 10  
    Racja - nF :).
    Co jest złego z podłączeniem VCC i AVCC?
  • #15 11253565
    Seppe
    Poziom 10  
    Błąd za błędem. Jasne, że źle ;). Nie zwróciłem uwagi, na szybko montowałem.
  • #16 11253567
    dondu
    Moderator na urlopie...
    Seppe napisał:
    Błąd za błędem. Jasne, że źle ;). Nie zwróciłem uwagi, na szybko montowałem.

    Czyli to nie błąd na schemacie, tylko na zmontowanym układzie?
    Jeżeli tak, to dopiero teraz będziesz zasilał swój mikrokontroler :)
  • #17 11253572
    Seppe
    Poziom 10  
    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.
  • #18 11253578
    dondu
    Moderator na urlopie...
    Seppe napisał:
    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.
  • #19 11253583
    Seppe
    Poziom 10  
    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 :). [Atmega8][C] - Odczytywanie wartości napięcia na wejściu
  • #20 11253591
    dondu
    Moderator na urlopie...
    Teraz schemat OK.

    Poznanie częstotliwości zegara ma istotny wpływ na sprawdzenie ustawienia preskalera ADC.



    Podsumując:

    Moim zdaniem powinieneś najpierw zacząć od poznania ADC, bardzo fajnie opisał Drzasiek a link podałem Ci już wcześniej tutaj:
    https://www.elektroda.pl/rtvforum/topic2365658.html#11252415

    Nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    Wyjaśni Ci się wiele problemów i ruszysz z miejsca.
    Ale nie spiesz się, by z Piekiełka początkujących szybko wyjść - taki paradoks :)
  • #21 11253601
    Seppe
    Poziom 10  
    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 :).
  • Pomocny post
    #22 11253608
    dondu
    Moderator na urlopie...
    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 :)
  • Pomocny post
    #23 11253809
    tmf
    VIP Zasłużony dla elektroda
    Seppe napisał:
    Mam nadzieję, że czytelny :)
    [Atmega8][C] - Odczytywanie wartości napięcia na wejściu
    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.
  • #24 11254156
    krru
    Poziom 33  
    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.
  • #25 11254723
    Seppe
    Poziom 10  
    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?
  • #27 11255314
    Seppe
    Poziom 10  
    Oto i wyniki. Nie wiem, czy prawidłowo pomierzyłem (od 'góry' fali):
    Położenie neutralne:
    [Atmega8][C] - Odczytywanie wartości napięcia na wejściu
    Wychylenie w lewo:
    [Atmega8][C] - Odczytywanie wartości napięcia na wejściu
    W prawo:
    [Atmega8][C] - Odczytywanie wartości napięcia na wejściu
  • Pomocny post
    #28 11256178
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #29 11258289
    Seppe
    Poziom 10  
    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)?
  • #30 11259231
    krru
    Poziom 33  
    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.
REKLAMA