Stránka 1 z 1
Klidné zapnutí serva
Napsal: 03 zář 2009, 21:39
od qwert0
Mám naprogramované mcu mega16. Servo řídím pomocí phase correct oc1 ocr1a. Vše funguje krásně, frekvence je teda jen asi 46Hz kvůli frekvenci mcu ale to snad nevadí. Servo je hitec hs-422. Jediný problém na kráse je to, že pokud restartuju mcu, tak servo škubne na jednu stranu a pak se zas vrátí. Přejede pozici a vrátí se na tu na které bylo původně, prostě takové škubnutí. Dá se tomuhle nějak vyhnout nebo je to prostě normální? Problém je určitě s inicializací pwm, servo asi reaguje hned na první impuls a ten teprve nabíhá, proto asi to škubnutí.
Napsal: 03 zář 2009, 21:50
od Mendor
Zkus napřed rozjet MCU a po malé chvilce teprve připoj servo na napájení.
Napsal: 03 zář 2009, 21:55
od Návštěvník
Co dělá to servo, když má napájení a nemá impulsy (na řídicím vstupu je trvalá log.0)?
Napsal: 03 zář 2009, 23:43
od qwert0
Bez impulsů po připojení napájení necukne. Pokud mcu běží a odpojím a připojím vodič s pulsy tak servo cukne. Odpojím-li napájení a vše ostatní je připojeno a napájení znovu připojím, servo cukne. Pokaždé stejným směrem, jen je to cuknutí pokaždé jiné(větší,menší, ale vždy ve směru kratšího impulsu), takže servo se "chytne" v určitém místě na nějakém impulsu, ale nestihne ho celý a proto cukne. Takže nejspíše vím, kde je problém, ale jak to mám vyřešit?
Napsal: 04 zář 2009, 00:11
od Mendor
S tím asi nic neuděláš. U svého modelu letadla když zapnu hlavní aku, tak taky všechny serva sebou cuknou.
Napsal: 04 zář 2009, 06:53
od eljaro
vyčlenit ještě jeden pin pro blokaci serva -bod odpojit napájení serva nebo blokovat řízení než PWM jede ok
Napsal: 04 zář 2009, 09:53
od Návštěvník
qwert0 píše:Bez impulsů po připojení napájení necukne. Pokud mcu běží a odpojím a připojím vodič s pulsy tak servo cukne. Odpojím-li napájení a vše ostatní je připojeno a napájení znovu připojím, servo cukne. Pokaždé stejným směrem, jen je to cuknutí pokaždé jiné(větší,menší, ale vždy ve směru kratšího impulsu), takže servo se "chytne" v určitém místě na nějakém impulsu, ale nestihne ho celý a proto cukne. Takže nejspíše vím, kde je problém, ale jak to mám vyřešit?
Dej na ten PWM výstup odpor pár kilo na zem, ten by na něm měl udržet log.0 než naběhne procesor. A v počáteční inicializaci ten pin nastav do nuly (nejdřív PORTX.y do 0 a pak DDRX.y do 1) a PWM inicializuj tak, aby už první impuls měl správnou délku. Proč používáš Phase correct PWM?
Napsal: 04 zář 2009, 16:05
od qwert0
bitClear (PORTD, 6);
bitSet (DDRD, 6);
setcampos = 1460;
OCR1A = setcampos;
TCCR1A = 0xA0; // nastavit OC1A a OC1B na low pri porovnani
TCCR1B = 0x12; // Phase and Frequency Correct mode, porovnani s ICR1, delicka 8
ICR1 = 20000; // do kolika se bude pocitat
I odpor jsem tam dal a stejně to škubne. Zajímavé je, že pokud OCR1A vůbec nenastavím tak servo zajede až na krajní polohu a pak se vrátí. Phase correct používám, protože jsem to viděl v nějakém návodu a funguje to.
Napsal: 04 zář 2009, 16:11
od Návštěvník
Při inicializaci toho časovače je dobré ho i vynulovat a spustit ho až úplně na konec. Ty ho spustíš ještě dřív než nastavíš ICR1.
A hlavně OC1A je na PD5

Napsal: 06 zář 2009, 13:07
od qwert0
Stejně to škube:
bitClear (PORTD, 5);
bitSet (DDRD, 5);
TCCR1A = 0;
TCCR1B = 0;
setcampos = 1460;
OCR1A = setcampos;
ICR1 = 20000; // do kolika se bude pocitat
TCCR1A = 0xA0; // nastavit OC1A a OC1B na low pri porovnani
TCCR1B = 0x12; // Phase and Frequency Correct mode, porovnani s ICR1, delicka 8
Napsal: 06 zář 2009, 13:21
od Návštěvník
Vynulovat čítač, ne konfigurační registry.
TCNT1 = 0;
Ale to asi taky nepomůže, on by měl být po resetu vynulovaný. Chtělo by to skouknout osciloskopem, jak vypadá ten první puls. Jestli má správnou šířku, tak je asi problém v servu, že mu vadí dlouhá pauza bez pulsů.

Napsal: 06 zář 2009, 15:25
od Mendor
Jen tak ze zvědavosti jsem vytáhl ze šuplíku servo HS 81, připojil ke zkušební desce s PICem a napsal obslužný program.
Servo je napájeno ze společného zdroje 5V pro PIC. Řídící PWM je vytvořeno programově.
Výsledek testu:
Po zapnutí napájení s nastaveným výstupním pinem na log 0 se servo ani nehlo ( ani nevrzlo).
Po stlačení tlačítka se spustil PWM 1.5 ms / 20 ms a servo najelo na střed.
Po zopakování celé procedury se v žádném případě servo ani nehlo ( ani nevrzlo ).
Takže tam budeš mít někde nějakou chybu nebo zkus jiné servo.
Napsal: 06 zář 2009, 17:29
od qwert0
Tak jsem dal tohle na začátek programu a pak 2 minutové čekání, aby se vyloučila chyba ostatního:
OCR1A = 1900;
ICR1 = 20000; // do kolika se bude pocitat
TCCR1A = 0xA0; // nastavit OC1A a OC1B na low pri porovnani
TCCR1B = 0x12; // Phase and Frequency Correct mode, porovnani s ICR1, delicka 8
TCNT1=0;
bitSet (DDRD, 5);
m_delay_s(120);
Tohle by teoreticky mělo inicializovat časovač, pak ho vynulovat a od nuly posílat do DDRD 5. Ale ať tohle proházím jak chci, stejně to škubne. Servo je HS-422.