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

Nierówna praca serwa Power HD-1800A z Atmega16 i PWM - co sprawdzić?

dweorh 20 Sty 2015 00:19 1809 15
REKLAMA
  • #1 14349260
    dweorh
    Poziom 10  
    Dobry wieczór wszystkim.

    Tak jak w temacie nie wiem co robię źle, że moje serwo nierówno działa.

    Schemat podłączenia jest w załączniku a filmik pokazujący jak ono działa





    uC to Atmega16 ustawiona bitami na 1MHz.

    Podciąganie resetu rezystorem 4.7k nic nie daje. Zmiana kondensatora 1uF na 22uF też niczego nie poprawiła.

    Program sam w sobie też jest bardzo prosty, bez udziwnień.

    Serwo, które mam to Power HD-1800A (neutral 1500u sec, 90' - 1000-2000u sec).

    Kod: text
    Zaloguj się, aby zobaczyć kod


    I pytanie, dlaczego to nie działa?

    Czy serwo wywołuje poprzez zakłócenia reset uC czy też w samym programie mam jakiś niuans? Np. mój 'delay' na to wpływa i dlatego co jakiś czas suma opóźnień powoduje wstrzelenie się serwa w jakiś nieoczekiwany sygnał PWM?

    Nierówna praca serwa Power HD-1800A z Atmega16 i PWM - co sprawdzić?
  • REKLAMA
  • #2 14350119
    dondu
    Moderator na urlopie...
    1. F_CPU zgodnie z zasadami: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    2.
    dweorh napisał:
    Czy serwo wywołuje poprzez zakłócenia reset uC czy też w samym programie mam jakiś niuans?

    O tym możesz przekonać się odczytując na początku programu rejestr MCUCSR.

    3. Czy to serwo potrafi się obrócić o 90 stopni w 325ms?

    4. Dlaczego PWM generujesz w trybie:

    Cytat:
    Set OC1A/OC1B on compare match, clear OC1A/OC1B at BOTTOM, (inverting mode)

    a nie:
    Cytat:
    Clear OC1A/OC1B on compare match, set OC1A/OC1B at BOTTOM, (non-inverting mode)
  • #3 14350147
    dweorh
    Poziom 10  
    @dondu,

    dzięki za odpowiedź

    Ad. 1. ale F_CPU jest zdefiniowane przed załączeniem delay.h a nawet gdyby nie było to i tak domyślnie jest 1MHz

    Ad. 2. to muszę sprawdzić

    Ad. 3. to są moje pierwsze kroki w elektronice i ta pętla miała obracać w nieskończoność ramieniem serwa, od min do max i z powrotem. A serwo powinno się obracać co najmniej o 60 stopni w 0.11 sekundy, czyli w 0.325 powinno być z zapasem na obrót o 90 stopni (chyba, że coś źle wyczytałem z datasheet'a)

    Wydawało się to proste, miało to być takie 'Hello World!", ale serwo nie pracuje równo i nie wiem dlaczego?

    Ad 4. dlatego, że robiłem to zgodnie z tutorialem :)
    https://www.newbiehack.com/MicrocontrollerControlAHobbyServo.aspx
  • #4 14350182
    dondu
    Moderator na urlopie...
    Sprawdź MCUCSR, a co do trybu pracy pinu, to nie ma sensu udziwniać jakimiś odejmowaniami w kodzie i generowaniem impulsu PWM "od tyłu".

    Zrób może w pętli głównej pętlę, która będzie co 50ms zmieniała PWM o jeden począwszy od zerowego wypełnienia do maksymalnego i zobacz, czy serwo będzie spokojnie poruszało się w pełnym zakresie.
  • REKLAMA
  • #5 14350194
    dweorh
    Poziom 10  
    ok, dzięki wielkie za wskazówki.

    Po pracy potestuję i dam znać co i jak.
  • #6 14352399
    dweorh
    Poziom 10  
    dobra, coś mi restartuje aplikację

    @dondu, napisałeś, żebym sprawdził rejestr MCUCSR niestety mój programator nie ma odpluskwiacza :/

    po małej zmianie fragment kodu wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    wartość 1500 to neutral, 1000 to wychylenie w lewo (45'), 2000 wychylenie w prawo(45').

    Serwo teraz zachowuje się tak jakby uC się resetował po każdym wykonaniu pętli.

    Serwo idzie do położenia neutralnego, wychyla się w lewo, prawo i znowu netural, a neutrala w pętli nie ma.

    Niestety nie wiem czy to watchdog się odpala i mi resetuje uC, jeżeli tak to nie wiem dlaczego, jeżeli to coś z samym podpięciem serwa do uC to też nie wiem. :)

    Tak czy siak byłbym bardzo wdzięczny za pomoc.
  • REKLAMA
  • #7 14352419
    dondu
    Moderator na urlopie...
    dweorh napisał:
    @dondu, napisałeś, żebym sprawdził rejestr MCUCSR niestety mój programator nie ma odpluskwiacza :/

    Nie rozumiem :)

    dweorh napisał:
    Niestety nie wiem czy to watchdog się odpala i mi resetuje uC, jeżeli tak to nie wiem dlaczego, ...

    To jakaś nowość :)

    W takim razie zacznijmy jednak od rejestru MCUCSR - w czym problem?
  • #8 14352428
    dweorh
    Poziom 10  
    do programowanie uC używam AVRISP MK2 i on nie obsługuje debuggowania/odpluskwiania a nie wiem jak inaczej sprawdzić i 'wydrukować' wartość tego rejestru :/
  • #9 14352440
    dondu
    Moderator na urlopie...
    OK - teraz rozumiem :)

    To nie tak się sprawdza. W dokumentacji jest podane jak to należy zaimplementować w programie:

    Cytat:
    To make use of the Reset Flags to identify a reset condition, the user should read and then reset
    the MCUCSR as early as possible in the program. If the register is cleared before another reset
    occurs, the source of the reset can be found by examining the Reset Flags.

    Teraz rozumiesz jak to wykorzystać?
  • #10 14352472
    dweorh
    Poziom 10  
    hmm... wpisanie mu na bezczelnego do tego rejestru 0 dalej nie pomogło :/
  • #11 14352479
    dondu
    Moderator na urlopie...
    To nie o to chodzi. Na początku programu:
    - w pierwszej linii kodu zapamiętaj wartość tego rejestru w jakiejś zmiennej,
    - i wyzeruj ten rejestr.

    Teraz w zmiennej masz stan bitów tego rejestru i możesz sprawdzić, który reset wystąpił - patrz bity tego rejestru.
    W ten sposób będziesz wiedział co jest przyczyną resetu - o ile nadal uważasz, że faktycznie reset następuje.
  • REKLAMA
  • #12 14352514
    dweorh
    Poziom 10  
    tak tak, ideę załapałem

    dzisiaj albo jutro podepnę sobie kilka ledów do uC, które na początku programu wyświetlą mi stan tego rejestru wtedy będę mógł faktycznie odczytać co w nim siedzi :)

    dzięki za kolejną wskazówkę :)

    a co do resetów to jestem przekonany na 90%, że coś mi restartuje uC tylko nie wiem czy to pracujące serwo, watchdog czy może sam programator.
  • #14 14352582
    dweorh
    Poziom 10  
    mam gada.

    MCUCSR ma ustawioną flagę EXTRF (External reset!) a jak odłączam programator to program kończy swoje działanie. Jutro będę szukał dlaczego?

    ps. zmieniłem kondensator przy serwie na 22uF.
  • #15 14352599
    dondu
    Moderator na urlopie...
    No widzisz daliśmy radę :)

    Reset podciągnij zewnętrznym rezystorem 4,7-10k do Vcc, a jeśli to nie pomoże to oprócz dodania rezystora odłączaj programator na czas testów.

    Patrząc na Twój projekt sądziłem, że wiesz jakie są minimalne wymagania w tym zakresie: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html
  • #16 14391444
    dweorh
    Poziom 10  
    Mój najpierwszy projekt zaczyna powoli wyglądać.

    Jest to Atmega16 + LCD LCM1602 IIC I2C (TWI) + klawiatura 4x4 + servo HD-1800A.

    Jak to wszystko działa można zobaczyć na filmiku youtu.be/16TNh1ChUMQ.
    Źródła są w załączniku.

    Ogólnie połączenie wygląda tak:
    Nierówna praca serwa Power HD-1800A z Atmega16 i PWM - co sprawdzić?

    Jak pisałem jest to mój pierwszy projekt związany z uC więc fakt, iż działa nie znaczy, że jest dobrze. Żarówka na kablu telefonicznym też poświeci ;)

    W całym projekcie chodziło o połączenie kilku popularnych rzeczy. PWM + I2C(TWI) + klawiatura.

    PWM generalnie działa, ale nie jest do końca jasne dla mnie dlaczego tak a nie inaczej? ;-) Wiem dlaczego ustawiłem takie a nie inne wartości ale nie wiem dlaczego działa to inaczej niż by na to te wartości wskazywały.
    Jak widać na filmiku, z klawiatury wpisujemy wartość ORC1A (x10) i akceptujemy 'D'. Przycisk C - Cancel, B - repeat.
    Moje serwo przyjmuje wartości 800-1500-2200 (min-neutral-max), ale poprawnie w mojej aplikacji działa w zakresie od 0 - 800. Co lepsze działa w miarę deterministycznie, więc nie są to przypadkowe wartości. Niestety nie znalazłem jeszcze powodu dlaczego ten zakres jest taki a nie inny. Kolejną bolączką są, najczęściej, wartości skrajne. Czasem przy wpisaniu takiej wartości serwo próbuje ją 'przekręcić'. Na filmiku 24s.

    Klawiatura działa dosyć wolno i tu też jeszcze nie doszedłem gdzie jest problem. Może jakiś kondensator, może czas 'delay' jest zbyt duży... jeszcze nie wiem :)

    Odnośnie LCD... I2C = Atmel TWI. Z tym ustrojstwem komunikacja jest 8 bitowa, bo to I2C, ale dopiero na schemacie jak to wszystko jest tam połączone widać, że sam układ I2C komunikuje się z LCD jakby był podłączony na 4 pinach, Dzięki temu spędziłem 3 dni walcząc o pierwszy znak na wyświetlaczu :) upraszczając... pierwsza wiadomość to adres 8-bitowy, następne już do LCD 8-bitowe ale w formacie 4-bitowym dla LCD :)

    Gdyby ktoś miał uwagi lub wskazówki odnośnie tego co zrobiłem byłbym bardzo wdzięczny.

    pozdrawiam
REKLAMA