Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

Seppe 25 Sie 2012 03:19 4794 34
  • #1 25 Sie 2012 03:19
    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?

    0 29
  • Pomocny post
    #3 25 Sie 2012 09:37
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • Pomocny post
    #5 27 Sie 2012 10:28
    Jakub
    Poziom 13  

    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.

    0
  • #7 27 Sie 2012 21:34
    krru
    Poziom 32  

    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.

    0
  • #8 27 Sie 2012 22:16
    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
    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]

    0
  • Pomocny post
    #10 27 Sie 2012 23:22
    krru
    Poziom 32  

    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ć.

    0
  • #11 28 Sie 2012 01:04
    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'? :)

    0
  • #12 28 Sie 2012 01:12
    dondu
    Moderator Mikrokontrolery Projektowanie

    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

    0
  • #13 28 Sie 2012 01:24
    Seppe
    Poziom 10  

    Racja - nF :).
    Co jest złego z podłączeniem VCC i AVCC?

    0
  • #15 28 Sie 2012 01:32
    Seppe
    Poziom 10  

    Błąd za błędem. Jasne, że źle ;). Nie zwróciłem uwagi, na szybko montowałem.

    0
  • #16 28 Sie 2012 01:34
    dondu
    Moderator Mikrokontrolery Projektowanie

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

    0
  • #17 28 Sie 2012 01:43
    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.

    0
  • #18 28 Sie 2012 01:49
    dondu
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #19 28 Sie 2012 01:55
    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

    0
  • #20 28 Sie 2012 02:03
    dondu
    Moderator Mikrokontrolery Projektowanie

    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/viewtopic.php?p=11252415#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 :)

    0
  • #21 28 Sie 2012 02:16
    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 :).

    0
  • Pomocny post
    #22 28 Sie 2012 02:32
    dondu
    Moderator Mikrokontrolery Projektowanie

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

    0
  • Pomocny post
    #23 28 Sie 2012 08:44
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #24 28 Sie 2012 11:01
    krru
    Poziom 32  

    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.

    0
  • #25 28 Sie 2012 13:54
    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?

    0
  • #27 28 Sie 2012 17:09
    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

    0
  • Pomocny post
    #28 28 Sie 2012 21:07
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #29 29 Sie 2012 14:40
    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)?

    0
  • #30 29 Sie 2012 19:57
    krru
    Poziom 32  

    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.

    0