Styra flera R/C servon från en PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Styra flera R/C servon från en PIC

Inlägg av ToPNoTCH »

Hallå.

Här kommer ett inlägg som inte direkt är ett problem utan en allmän fundering.

Har tidigare labbat en del med att styra R/C servo från PIC.
Som de flesta känner till så styr man ju utslaget med pulsbredd mellan 1ms & 2ms med en puls ca. var 20'e ms.

Alt1:
Ett enkelt sätt att lösa det på är ju att lägga en timer med interupt på 20ms och sätta en pinne hög och göra en delay loop på 1-2ms sedan sänka pinnen igen, beroende på önskat läge.
Inte så snyggt då man hänger processorn under den positiva perioden.

Alt2:
Ett mer adekvat sätt är ju att göra på samma sätt, men ställa om timern var 20ms, och sätta räknaren för att få en ny interupt efter önskat delay (1-2ms) och sänka pinnen igen.
Att ställa om timern (pre & post scale) är nödvändigt för att få nödvändig upplösning för läget. Denna metod är ju bättre då den inte hänger processorn på samma sätt.
Dock kräver den en hel del matte för det går inte enbart med en kobination av pre & post scaler för den höga pulsen, utan det åtgår två kombinationer.

Alternativ två fungerar dock, och bortsett från allt jobbigt räknande är den sannolikt ett rätt bra alternativ.

Men nu kommer min fundering. Finns det någon klurig lösning om man vill köra fler servon med olika utslag (på olika pinnar givetvis) ?
Alternativ två bygger ju på att man dedicerar timern till uppgiften och ETT servo.
Jag har en del funderingar, men är nyfiken på hur ni som är proffs skulle angripa ett sådant problem. :P

Om någon får för sig att lista exempelkod, så ha i åtanke att jag är helt rudis på C, och bara kör assembler :cry:
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra flera R/C servon från en PIC

Inlägg av Icecap »

På min hemsida, under "Freebies", ligger det ett projekt som gör exakt detta. Med en PIC16F628A kan den styra 12 st RC-servo, positionerna skickas seriellt till kretsen. Det finns med källkod i C (MikroC - inte vassaste verktyg i lådan men...).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra flera R/C servon från en PIC

Inlägg av sodjan »

Upp till 10 servon fungerar rellativt OK (eftersom det går inom 20 ms).
Man pulser alltså inte alla servon samtidigt utan en i taget. Det spelar ju ingen
som helst roll, bara varje servo i sig ser en 1.5 +/- 0.5 ms puls varje 20 ms.
Sen är inte 20 ms speciellt kritiskt, om det bli 18 eller 222 ms har väldigt
liten betydelse.

Du kan alltså köra med en och samma timer och ta ett servo i taget.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: Styra flera R/C servon från en PIC

Inlägg av ToPNoTCH »

Gud så enkelt.

Och självklart. Bara man tänker liiite utanför boxen. :roll:

Det blir rätt utmanande att koda det (om man vill ha det exakt måste man ju räkna bort tiden för varje kommando), men lösningen är ju helt rätt.

Ett solklart fall där lösningen skall göras på papper innan en rad kod skrivs.

Tack för ett supersnabbt och superbra svar till er båda.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra flera R/C servon från en PIC

Inlägg av sodjan »

Ja, alltså, det är ju själva 1-2 ms pulsen som är kritisk, och där det blir samma hantering
oberoende av antal servon. Om det är lite olika tid (alltså hela 20 ms perioden)
fram och tillbaka spelar nog mindre roll. Sen så är ju några instruktioner hit eller dit
bara en eller ett par us, så det bör nog gå att få att fungera...

Och sen kan ju förbereda de flesta beräkningar i slutet av varje operation, så att man
inte måste börja med det när timern är klar.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: Styra flera R/C servon från en PIC

Inlägg av ToPNoTCH »

Jag varnade för att jag inte begrep C, men jag tror att Icecap's lösning är något annorlunda.

Vad jag kan förstå höjer han samtliga pinnar på given tidpunkt, och sänker dom succesivt med timerns hjälp.

Altså lite mer av "parallell" hantering jämfört med din mera "seriella" variant.

Inser även att mina tidigare försök med omställning av post & prescaler, är en konsekvens av att jag jobbat med en 8-bitars timer.
Med en 16-bitars borde man komma undan det.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra flera R/C servon från en PIC

Inlägg av sodjan »

Ja, det är ju lite saker som man bör göra klart för sig först.
T.ex (kanske det viktigaste) vilken upplösning (hur många "steg") som man
vill att varje servo ska ha. "Så många som möjligt" duger INTE som svar !
Och visst kan man räkna alla servona parallellt, det är väl så Icecap gör
(jag har inte kollat hans kod)...
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra flera R/C servon från en PIC

Inlägg av Icecap »

Och den uppfattning av funktionssättet är fel!

Den gör exakt vad sodjan beskriver! Varje puls är uträknat och ligger i minnet, och när timern ger en interrupt avslutas den pågående puls, den nästa aktiveras och timern ställs till den tid som den ska ha och sedan kör det i ring.

PRF (Puls Repetition Frekvens) varierar alltså mellan extremfallen 12ms och 24ms.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra flera R/C servon från en PIC

Inlägg av sodjan »

Aha, där ser man... :-)
Som sagt, jag hade inte kollat, jag blev lite lurad av ToPNoTCH kommentar... :-)
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: Styra flera R/C servon från en PIC

Inlägg av ToPNoTCH »

Jo jag lurar mig själv helatiden med, men jag försvarar mig med att jag inte begiper C :(

Hur som haver har jag redan hunnit prova principen och det funkar bra.

Tack för hjälpen.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: Styra flera R/C servon från en PIC

Inlägg av ToPNoTCH »

Bara för att krångla till saker lite :vissla:

Visst borde även principen (min missupfattade :razz: ) med att höja samtliga parallelt funka ?

Altså höja godtyckligt antal pinnar och sedan sänka den med "mest motsols värde" (dvs. kortas puls) och sedan näst kortast etc. etc.

Principen torde ju medge obegränsat antal servon och fast frekvens (även om denna inte verkar så kinkig), eller är jag ute och cyklar ?

Givetvis skulle den behöva en "sort" funktion vilken skulle bli skitjobbig att koda.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra flera R/C servon från en PIC

Inlägg av sodjan »

Problemet med den metoden är när alla (t.ex) 10 servona ska stå på
i princip samma läge. Det går då inte att ha en metod som bygger på
att man ska ladda om en timer mellan varje servo.

Notera också att jag även sa att den kanske viktigaste
paramatern i det hela är vilken upplösning (antal "steg") du behöver !

Låt oss säga att det är OK med 20 olika lägen, det ger faktiskt i många fall en helt
OK flexibilitet. Varje steg motsvarar då 50 us, eller 250 instruktionscykler vid 20 MHz.
För varje "tick" om 50 us så behöver man räkna ner en räknare per servo som
initialt ställs på 20-40 (d.v.s "läget" för varje servo 1 ms + 0-1 ms)). Varje 50 us räknar
man ner alla räknarna och om de = 0 så avslutar man respektive puls.

Något i stil med :

Kod: Markera allt

Srv1
  decfsz  Srv_1_Cnt
  goto    Svr_2
  bcf     Srv_1
Srv2
  decfsz  Srv_2_Cnt
  goto    Svr_3
  bcf     Srv_2
Srv3
  decfsz  Srv_3_Cnt
  goto    Svr_4
  bcf     Srv_3
Srv4
  o.s.v....
5-6 instruktioncykler per servo så man skulle kunna hantera kanske 30-40 servon eller så.

Varje 20 ms så gör man bsf Srv_n på alla pinnar samt återställer alla Srv_n_Cnt
till de aktuella lägena.

Ungefär, i stor sett, otestat...
Gimbal
Inlägg: 8687
Blev medlem: 20 april 2005, 15:43:53

Re: Styra flera R/C servon från en PIC

Inlägg av Gimbal »

Jag har inte grottat i det så mycket men en relativt vanlig lösning verkar vara att köra alla pulser "seriellt" som redan beskrivits, men ut på en och samma pinne kopplad till en 74hct4017 som då delar ut pulserna till varsit servo. Kan vara något att kika på om man vill spara pinnar.
Skriv svar