Uppdatera RC-servo snabbare än 10ms = problem?
Uppdatera RC-servo snabbare än 10ms = problem?
Att man styr RC-servon med en puls på 1-2ms är ju allmänt känt, likaså att pulsen ska återkomma ca var 10-20ms.
Men vad händer om man uppdaterar pulsen oftare? Får servot spader, eller kan det gå bra ändå?
Anledningen är att vill styra ett servo med PWM-modulen i en 16F876A som snurrar i 4MHz. Om jag inte är helt ute och cyklar, kan jag inte få ner periodtiden under ca 4ms.
Jag kan inte heller gå ner i CPU-frekvens p.g.a. övriga funktioner.
Kan man lösa det på något smidigt sätt?
En hållhake är att jag kör en bit-bangad serieport på en INT0 som vid interrupt samlar på sig en rad tecken utan att tillåta andra interrups under tiden.
Detta gör att jag inte kan garantera att hinna trigga på en ren timerlösning som jag tror man skulle kunna ha löst det med.
Detta gled in lite på uC kategorin, men jag tyckte att det krävdes lite bakgrund till frågan...
EDIT:
Eller är det så att man med Timer2:s "Postscaler" kan fördröja varje PWM-puls med 1-16 * periodtiden?
Är det exakt detta man i databladet menar på sid.67 med:
"The Timer2 postscaler Prescaler and Postscaler is not used in the determination of the PWM frequency. The postscaler could be used to have a servo update rate at a different frequency than the PWM output."
Men vad händer om man uppdaterar pulsen oftare? Får servot spader, eller kan det gå bra ändå?
Anledningen är att vill styra ett servo med PWM-modulen i en 16F876A som snurrar i 4MHz. Om jag inte är helt ute och cyklar, kan jag inte få ner periodtiden under ca 4ms.
Jag kan inte heller gå ner i CPU-frekvens p.g.a. övriga funktioner.
Kan man lösa det på något smidigt sätt?
En hållhake är att jag kör en bit-bangad serieport på en INT0 som vid interrupt samlar på sig en rad tecken utan att tillåta andra interrups under tiden.
Detta gör att jag inte kan garantera att hinna trigga på en ren timerlösning som jag tror man skulle kunna ha löst det med.
Detta gled in lite på uC kategorin, men jag tyckte att det krävdes lite bakgrund till frågan...
EDIT:
Eller är det så att man med Timer2:s "Postscaler" kan fördröja varje PWM-puls med 1-16 * periodtiden?
Är det exakt detta man i databladet menar på sid.67 med:
"The Timer2 postscaler Prescaler and Postscaler is not used in the determination of the PWM frequency. The postscaler could be used to have a servo update rate at a different frequency than the PWM output."
Ska jag vara ärlig ser jag det som ett fel att måste använda bit-banged UART, låser man sin konstruktion på detta sätt är grunddesignet fel och då är det svårt (och dumt) att "lirka" med annat för att få det att fungera.
Men om servon får spader.... vet faktisk inte. Testa vetja, jag lovar att det inte kommer (allt för mycket) rök ut.
Men om servon får spader.... vet faktisk inte. Testa vetja, jag lovar att det inte kommer (allt för mycket) rök ut.
>"Ska jag vara ärlig ser jag det som ett fel att måste använda bit-banged UART..."
Javisst, jag håller med, men jag använder redan hårdvaru-porten för annan kommunikation och det känns våldsmt att behöva kliva upp till en 64 pinnars PIC i 18-familjen för att få två portar...
Eller är det jag som är dålig på att leta?
>"Testa vetja..."
Hade jag haft ett servo hemma hade det redar varit gjort...
>"Varför hänger du så länge i interrupten?"
Eftersom jag måste trigga INT0 på en bit (inte som USART-interrupten på en byte), blir det mer tidskritiskt. För att inte riskera att tappa en del av ett tecken så väntar jag en liten stund på att få in starttecknet vid trigg på INT0. Får jag starttecknet plockar jag in hela strängen i ett svep för att som sagt, inte riskera att tappa nå'n del.
>" Hämta/skicka ETT tecken och lämna sedan rutinen. "
För att med marginal komma ner under 1ms/tecken måste jag köra i 19200 baud om jag tänker rätt, vilket är helt omöjligt då den bit-bangade porten får sin data från en RF-länk som inte hänger med i dom farterna, vilket gör att även denna idé faller....
Javisst, jag håller med, men jag använder redan hårdvaru-porten för annan kommunikation och det känns våldsmt att behöva kliva upp till en 64 pinnars PIC i 18-familjen för att få två portar...
Eller är det jag som är dålig på att leta?
>"Testa vetja..."
Hade jag haft ett servo hemma hade det redar varit gjort...

>"Varför hänger du så länge i interrupten?"
Eftersom jag måste trigga INT0 på en bit (inte som USART-interrupten på en byte), blir det mer tidskritiskt. För att inte riskera att tappa en del av ett tecken så väntar jag en liten stund på att få in starttecknet vid trigg på INT0. Får jag starttecknet plockar jag in hela strängen i ett svep för att som sagt, inte riskera att tappa nå'n del.
>" Hämta/skicka ETT tecken och lämna sedan rutinen. "
För att med marginal komma ner under 1ms/tecken måste jag köra i 19200 baud om jag tänker rätt, vilket är helt omöjligt då den bit-bangade porten får sin data från en RF-länk som inte hänger med i dom farterna, vilket gör att även denna idé faller....
PWM modulen är ganska dålig till (R/C-) servostyrning.
Använd ett vanligt timer-interrupt istället. Timingen
i en servo signal är så långsam så du har massor av tid på dig.
Att hänga kvar i ISR'en är, som andra har sagt, inte så bra.
Du behöver alltså två st serieportar. Kanske en av Maxim's MAX3100
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1731 .
Då avlastar du 876A'an hela USART hanteringen för den ena linjen.
Eller (om du kan styra när de två USART linjerna används) kanske ha lite
extern hårdvara som switchar USART-pinnarna mellan två olika RS232 linjer.
> Jag kan inte heller gå ner i CPU-frekvens p.g.a. övriga funktioner.
Upp då ?
Använd ett vanligt timer-interrupt istället. Timingen
i en servo signal är så långsam så du har massor av tid på dig.
Att hänga kvar i ISR'en är, som andra har sagt, inte så bra.
Du behöver alltså två st serieportar. Kanske en av Maxim's MAX3100
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1731 .
Då avlastar du 876A'an hela USART hanteringen för den ena linjen.
Eller (om du kan styra när de två USART linjerna används) kanske ha lite
extern hårdvara som switchar USART-pinnarna mellan två olika RS232 linjer.
> Jag kan inte heller gå ner i CPU-frekvens p.g.a. övriga funktioner.
Upp då ?
>"PWM modulen är ganska dålig till (R/C-) servostyrning. "
Så Timer2:s "Postscaler" fungerar inte som jag hoppades? (Som jag skrev i första inläggets EDIT)
>"Kanske en av Maxim's MAX3100"
Ja, den verkar ju inte så dum... Tåls att tänka på.
>"...lite extern hårdvara som switchar USART-pinnarna..."
Funderar även i dessa banor. Får se vad det blir...
>"Upp då ?"
Jo jag kan gå upp i frekvens, men hur menar du?
Anledningen till att jag skrev att jag inte kan gå ner i frefvens var för att man skulle ju annars kunnat få ner farten på PWM:en på sdet viset.
Så Timer2:s "Postscaler" fungerar inte som jag hoppades? (Som jag skrev i första inläggets EDIT)
>"Kanske en av Maxim's MAX3100"
Ja, den verkar ju inte så dum... Tåls att tänka på.
>"...lite extern hårdvara som switchar USART-pinnarna..."
Funderar även i dessa banor. Får se vad det blir...
>"Upp då ?"
Jo jag kan gå upp i frekvens, men hur menar du?
Anledningen till att jag skrev att jag inte kan gå ner i frefvens var för att man skulle ju annars kunnat få ner farten på PWM:en på sdet viset.