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

Jak ustawić ICR1 dla serwa na PB7 w Atmega 644?

webruben 13 Maj 2012 18:13 2204 14
  • #1 10892487
    webruben
    Poziom 10  
    Mam mikrokontroler atmega 644 za pomocą, którego próbuje sterować 3 serwami.
    Serwa podpięte do pinów PB5 i PB4 ładnie płynnie działają natomiast to podpięte do PB7 straszni się trzepie przy poruszaniu. Chciałbym jakoś to zniwelować.
    Przypuszczam, że chodzi częstotliwość. W kodzie mam taką linijkę:
    ICR1=4999;  //fPWM=50Hz (Period = 20ms Standard).

    gdy zmniejszę wartość ICR1 to serwa podpięte do PB5 i PB4 też się trzęsą przy ruszaniu.
    Jaki będzie odpowiednik ICR1 dla timera współpracującego z PB7 bo nie mogę się doczytać w dokumentacji? ;)
  • #2 10892641
    McMonster
    Poziom 32  
    Bez pokazania dokładnego (z naciskiem na "dokładnego") schematu lub zdjęcia podłączenia całości oraz kodu to raczej zbyt wiele osób nie zainteresujesz tutaj.
  • #3 10895944
    webruben
    Poziom 10  
    Ze schematem może być ciężko, ale spróbuje zrobić dokładne zdjęcie płytki.
    Jeżeli chodzi o kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I to jest tak, OCR1A i OCR1B działają świetnie. Jednak OCR2A rusza serwem strasznie źle. Skacze, element przyczepiony do końca serwa podczas przemieszczania przypomina tłok w silniku który skacze szubko w górę i dół. Jak należy ustawić to wszystko?
    [/code]
  • #4 10896318
    janbernat
    Poziom 38  
    No a jaki jest ten "Period=20ms" dla Timer2?
    Pamiętając że jest to Timer 8bit.
  • #5 10897005
    webruben
    Poziom 10  
    No właśnie mi o to chodzi :D nie wiem jak go ustawić. Za pomocą jakiej zmiennej i jaka ma mieć on wartość? :D
  • #6 10897071
    janbernat
    Poziom 38  
    A jaka jest częstotliwość zegara dla procesora?
    Bo bez tego- tylko zgadywać.
    No i jeszcze coś- jakbyś nie ustawił to masz takie czasy- 20ms ,1.5ms, 1ms i 2ms.
    No to dla period 20ms, rozdzielczości 256 i czas 2ms będziesz miał tak sobie.
    PWM jest dobre dla Timer1 16bit i dla 1-2 serw.
    Potem to już mocno pod górkę.
    No i czym to sterujesz?
    Masz w programie wyliczone wartości czy z ADC?
  • #7 10898143
    webruben
    Poziom 10  
    MCU Clock Frequency : 11059200
    Steruje za pomocą zmiennych OCR2A, OCR1A, OCR1B, którym zadaje określone wartości.
    Za pomocą jakiej zmiennej mam to ustawić dla Timera 2?
    Przepraszam za takie pytania, ale jestem totalnym nowicjuszem w tej tematyce :)
  • #8 10900206
    janbernat
    Poziom 38  
    To tak- prescaler dla Timer2 ustawiasz na 1024.
    Będziesz miał sygnał co 23.7073 ms a nie co 20ms.
    Powinno działać.
    Przy rozdzielczości 256 masz krok co 92,5926 us.
    Można przyjąć- co 0.1ms.
    Sterowanie serwa jest 1-2ms.
    Czyli na cały zakres masz 20 stabilnych pozycji.
    10 w lewo i 10 w prawo.
    Czyli co 9 stopni- skokowo.
    Więcej się nie da.
    Jak wystarczy- to ok.
  • #9 10900868
    webruben
    Poziom 10  
    To jest uproszczony kod, który używam. Jak widać mam ustawiony prescaler na 1024. Ramie jednak cały czas się trzepie a co gorsza podczas kręcenia filmiku jak wygląda jego praca, żeby całość najlepiej pokazać, po jakiś 20s działania serwo się spaliło :cry:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zupełnie już nie wiem co robić, kod wydaje się być dobry, ale taki nie jest. Zrobienie programowego pwm może byłoby prostsze.
  • #10 10902141
    janbernat
    Poziom 38  
    Tu, w poście #35:
    https://www.elektroda.pl/rtvforum/topic2084991.html
    Masz gotowy program do sterowania do ośmiu serw.
    Sprawdzony.
    Musisz jeszcze zwrócić uwagę że serwa mają dużą impedancję na wejściu i są wrażliwe na zakłócenia.
    Wtedy się "trzęsą".
    Tanie serwa też potrafią działać niestabilnie.
  • #11 10903586
    webruben
    Poziom 10  
    Zamieniłem we wskazanym kodzie TIMSK na TIMSK1 resztę pozostawiłem bez zmian. Serwo podpiąłem do PC7 i nie działa. :| Co robię źle?
  • #12 10904029
    janbernat
    Poziom 38  
    Ten program służy do sterowania serw potencjometrami a Twój- przyciskami.
    Trzeba będzie "skleić" to razem.
    Ale to potem.
    Podepnij jakiś potncjometr do jednego z wejść ADC i zobacz co się dzieje z wyjściami.
    Np. przy pomocy takiego oscyloskopu:
    http://mikrokontrolery.blogspot.com/2011/04/darmowy-oscyloskop-i-analizator.html
    Potem zamiast serw podłącz LED-y- są dużo tańsze i raczej ich nie spalisz.(jak prawidłowo podłączysz).
    Programy robi się po kawałku- jak coś działa to nastepną funkcjonalność dodajesz, sprawdzasz czy działa itd.
    Sprawdź tym "oscyloskopem" swój program- może dopatrzysz się dlaczego serwo się spaliło.
  • #13 10904895
    webruben
    Poziom 10  
    Niestety żadnego potencjometru nie mam pod ręką.
    A może będzie prościej skorzystać z programowych PWM?
    Mam taki kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Serwo podpięte do PA0. Niezależnie od tego czy w if'ach dam kolejno wartości dla TCNT1: 1700 i 2000 czy też 700 i 1000 serwo się kręci w tym samym kierunku.
    Wzorowałem się na tym obrazku jeżeli chodzi o wartości:
    Jak ustawić ICR1 dla serwa na PB7 w Atmega 644?

    Co jest źle?
  • #14 10908601
    janbernat
    Poziom 38  
    A skąd wiesz że jest to naprawdę taki czas jak zakładasz?
    Może to dalej jest ponad 1.5ms?
    Zainstalowałeś ten pseudooscyloskop?
    No bo mi się widzi tak- TCNT1 już osiągnął 20000.
    Zanim sprawdzisz warunek to program coś robi.
    A licznik dalej liczy.
    TCNT1 już przekroczył 20000.
    No i warunek nigdy nie jest spełniony.
  • #15 10910011
    webruben
    Poziom 10  
    Chciałbym go zainstalować, ale nie posiadam wtyczki LPT z odpowiednimi podłączeniami mi kontrolera. Bo chyba jest ona konieczna do tego programu?
    A nie posiadacie może jakiś własnych, gotowych kodów do programowego PWM?
    Nawet jakby to miało działać na sztywno tzn. w programie umieszczone poszczególne ruchy serwa, bez opcji sterowania w czasie rzeczywistym?
    Przerobiłbym może to do swoich potrzeb bo zbliża się termin oddania prac a mi tylko to 3 serwo zostało do uruchomienia :cry:
REKLAMA