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

[Atmega328P][C] - Poprawna konfiguracja timera 16-bitowego pod serwo

09 Wrz 2013 13:29 2511 15
  • Poziom 7  
    Witam! Jestem początkujący w tym temacie, od niedawna uczę się programować mikrokontrolery AVR. Po pierwszych programach typu migająca dioda przy użyciu funkcji delay oraz opanowaniu timerów na tyle aby one sterowały diodą chciałbym "oswoić" serwomechanizm : TowerPro SG90. Trochę czytając na internecie oraz oczywiście dokumentacje atmegi328p udało mi sie napisać krótki program w którym steruję serwem. Działa on poprawnie ale że jestem nowicjuszem chciałbym się zapytać mądrzejszych czy ten program ma sens, ewentualnie jak go poprawić, co zmienić. W kodzie nie ma taktowania procesora ponieważ ECLIPSE sam go dołącza a w moim przypadku jest to 8MHz. Serwo jest podłączone na porcie B dokładnie pin 1 (OC1A).
    Kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proszę o pomoc, w szczególności że chciałbym go przerobić aby sterować nim poprzez potencjometr liniowy. Pozdrawiam!
  • Poziom 19  
    Jeśli ustawiasz bity WGM11, WGM12 i WGM13 to znaczy, że używasz trybu FastPWM zgodnie z tabelą 15-4 (str. 136) w datasheet i czym się różni od zwykłego PWM przeczytasz w rozdziale "15.9 Modes of Operation" na stronie 125, są tam nawet narysowane odpowiednie timingi.
  • Poziom 7  
    Przeczytałem i mniej/więcej rozumiem ;) A jeśli chodzi o sam program to kod jest poprawny czy jakby ktoś miał go pisać od początku pod serwo to zrobiłby to inaczej?
  • Moderator Mikrokontrolery Projektowanie
    Jeśli chodzi o kod to jest ok - z wyjątkiem return 0. W AVR ponieważ nie masz OS, main nie poiwnien się kończyć. W tym przypadku PWM generujesz sprzętowo więc return 0 nic nie zmienia, ale ogólnie bym się tego wystrzegał.
  • Poziom 7  
    Mam jeszcze 2 pytania:
    1) Czy jak zmienię preskaler bądź taktowanie procesora to PWM (50Hz) ulegnie zmianie? Tak samo z wartościami długości sygnału dla serwa, np jak teraz pozycja neutralna to 1500, to czy to ulegnie zmianie?
    2) W datasheet jest napisane że moja atmega jest w stanie generować 6 PWM-ów, teraz generuje 1, w jaki sposób wyzwolić pozostałe i czy ich konfiguracja wygląda tak samo?
  • Moderator Mikrokontrolery Projektowanie
    1) Tak, zmieniając taktowanie timera zmieniają się także liczby, które należy wpisać do jego rejestrów.
    2) każdy timer ma kilka kanałów PWM i skojarzone z nimi rejestry. Konfigurujesz wyłącznie wartość określającą wypełnienie, konfigurację samego timera już masz. Co do tych 6 PWM - zauważ, że drugi timer, któym dysponujesz jest tylko 8-bitowy i w zależności od użytego zegara może nie być w stanie wygenerować impulsów o pożądanej szerokości, lub uzyskana rozdzielczość będzie zbyt mała. Stąd też jeśli masz kilka serw, to prościej zmienić procesor, np. XMEGA32E5 kosztuje mniej, ma więcej kanałów PWM i prościej konfiguruje się timer. Większe XMEGA mają nawet do 24 16-bitowych kanałów PWM, stąd można przy ich pomocy sterować wieloma serwami :) Oczywiście to ciągle poczciwe AVRy.
  • Poziom 7  
    Dziękuje Wam za odpowiedzi na moje pytania, ładnie to działa ;) teraz tylko skonfigurować to z potencjometrem ;)
  • Poziom 19  
    Do odycztywania wartości potencjometru będziesz musiał użyć przetwornika ADC. Nie jest jakiś specjalnie trudny do obsługi. Pod spodem wklejam przykładową funkcje odczytującą której sam kiedyś używałem, oczywiście wczesniej trzeba skonfigurować i uruchomić ADC. A elektronika to prosta dajesz potencjometr do 5V, z drugiej strony podciągasz rezystorem do masy i podłączasz na dany kanał ADC. Nie zapominaj o pinach AVCC i AREF, reszte przeczytasz w datasheet.

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 7  
    Tak zrobię, ale tu zrodziły się kolejne pytania:
    1) Jako napięcie odniesienia lepiej wybrać 5V zasilania procka i te 5V podpiąć do AREF, czy AREF kondensatorem 100uF do masy i jako odniesienie wewnętrzne zasilanie procka 1.1V?
    2) Przedział liczbowy wyniku pomiaru ADC ile wynosi? 0 - 255? Czy jest on związany z preskalerem ADC?
    3) Mógłbyś mi wyjaśnić co znaczy ta linijka funkcji:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pozdrawiam!

    Dodano po 16 [minuty]:

    Teraz przeczytałem, że przetwornik 10-bitowy czyli wynik 0-1023?
  • Moderator Mikrokontrolery Projektowanie
    1. VRef + kondensator, Vcc można wybrać jako VRef programowo.
    2. To zależy od rozdzielkczości ADC, dla 10 bitowej masz zakres 0..2^10-1
    3. To fragment niepotrzebny, gdyż pisze się po prostu dana=ADC lub ADCW. << to operacja przesunięcia bitowego.
  • Użytkownik usunął konto  
  • Poziom 7  
    To znaczy Vref +5V z zasilania procka z kondensatorem. A na czym polega różnica między Vref 5V a Vref w przypadku mojej Atmegi 1.1V? Pan Mirosław Kardaś na swoim blogu wyjaśniał to i owo ale w moim przypadku które będzie lepsze do płynnego sterowania serwem poprzez potencjometr?
  • Moderator Mikrokontrolery Projektowanie
    albertb napisał:
    tmf napisał:
    Jeśli chodzi o kod to jest ok - z wyjątkiem return 0. W AVR ponieważ nie masz OS, main nie poiwnien się kończyć. W tym przypadku PWM generujesz sprzętowo więc return 0 nic nie zmienia, ale ogólnie bym się tego wystrzegał.


    Hmm, sądzę, że jeśli tego return 0 by nie było kompilator powinien wywalić warning.

    Albert


    avr-gcc nie jest głupi i już nie zgłasza warninga w takiej sytuacji. Ktoś go w końcu nauczył, że na AVR to nie ma sensu.

    Dodano po 2 [minuty]:

    antheri napisał:
    To znaczy Vref +5V z zasilania procka z kondensatorem. A na czym polega różnica między Vref 5V a Vref w przypadku mojej Atmegi 1.1V? Pan Mirosław Kardaś na swoim blogu wyjaśniał to i owo ale w moim przypadku które będzie lepsze do płynnego sterowania serwem poprzez potencjometr?


    ATMega może jako napięcie referencyjne używać Vcc, wewnętrzną referencję 1,1V, lub napięcie doprowadzone do pinu VRef. Konfiguruje się to programowo. W twoim przypadku, nie ma znaczenia co zastosujesz jako referencję, gdyż ani dokładność twojego pomiaru, ani rozdzielczość nie jest krytyczna. Wykorzystanie Vcc jako referencji w tym przypadku jest najprostsze.
  • Poziom 7  
    W nieskończonej pętli programu uruchamiać pojedynczy pomiar, czy uruchomić tryb free running do mojej potrzeby?
  • Moderator Mikrokontrolery Projektowanie
    Jeśłi masz jeden potencjometr to tryb free running jest ok. Możesz też uruchamiać pojedynczy pomiar, naprawdę w tak prostym przykładzie nie ma to znaczenia.
  • Poziom 7  
    Jeden potencjometr steruje serwem które skręca kołami pojazdu ;) natomiast drugi potencjometr przewidziany jest w przyszłości na regulacje obrotów 2 silników DC przez mostek H napędzające tylnią oś modelu. Pilot narazie chcę wykonać przewodowy, ponieważ nie mam pojęcia jak zrobić zdalne sterowanie...