Jag använder en lite annorlunda metod, en 16 bitars räknare är inställd så att den vrappar runt var 2.5ms. När den startar på noll sätter hårdvaran en utgång hög, när räknaren når ett förinställt värde på en comparator så fälls utgången och en irq laddar nytt värde i comparatorn och växlar adress på 3-8 decodern så att nästa puls matas ut på en annan utgång.
2,5ms gånger 8 utgångar = 20ms, så alla pulser kommer alltid med 20ms mellanrum oavsett pulslängd (max längd något mindre än 2.5ms). Men då krävs som sagt en 74237a för varje grupp om 8 servon, max 4 grupper kan användas.
20 servon, val av komponenter
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: 20 servon, val av komponenter
Det låter som utanför mina kunskaper, ifall just nu.
Blir nog att köpa tre stycken Pololu micro controllers istället. Där får man allt på ett fat
Det blir en del kodning ändå, men då kommer ja att använda mig av Pololu's egna protokoll så slipper jag knåpa ihop allt själv ifrån scratch.
Blir nog att köpa tre stycken Pololu micro controllers istället. Där får man allt på ett fat

Re: 20 servon, val av komponenter
Jag gjorde en grymt överarbetad lösning en gång som jag skulle kunna skicka om du är intresserad. den borde klara så många servon som du har I/O-pinnar på två timers (går med en också i nödfall).
Tanken var att det skulle bli en USB-servokontroller för att styra den robotarm som jag har som avatarbild. Det föll sig så att jag fick tag på en FPGA och gjorde servokontrollern i den istället så jag slutförde aldrig den för en PISC18F4550, men jag tror det mesta av servokoden var klart.
Idén var i alla fall att hålla en lista med servon sorterade efter pulslängd med kortast först. Så fort man ändrade pulslängd på något servo sorterades listan om. För att kunna göra detta med bra prestanda så använde jag en länkad lista istället för en array. Justerar man bara ett värde i taget i en sådan lista så kan man hålla den sorterad hyffsat effektivt.
För att sedan skicka pulserna använde jag två timers, en som gav ett interrupt var 20:e millisekund. I detta interrupt satte jag alla servos pinnar höga och startade timer nummer två för att ge ett interrupt när första servots pulslängd uppnåts. Då satte jag första servots pinne låg och gick vidare på nästa servo där jag laddade om timern med mellanskillnaden mellan servo 1 och 2 osv... När sista servot satts lågt har du minst 18 ms på dig att uppdatera listan med nya värden och sortera om den.
Tanken var att det skulle bli en USB-servokontroller för att styra den robotarm som jag har som avatarbild. Det föll sig så att jag fick tag på en FPGA och gjorde servokontrollern i den istället så jag slutförde aldrig den för en PISC18F4550, men jag tror det mesta av servokoden var klart.
Idén var i alla fall att hålla en lista med servon sorterade efter pulslängd med kortast först. Så fort man ändrade pulslängd på något servo sorterades listan om. För att kunna göra detta med bra prestanda så använde jag en länkad lista istället för en array. Justerar man bara ett värde i taget i en sådan lista så kan man hålla den sorterad hyffsat effektivt.
För att sedan skicka pulserna använde jag två timers, en som gav ett interrupt var 20:e millisekund. I detta interrupt satte jag alla servos pinnar höga och startade timer nummer två för att ge ett interrupt när första servots pulslängd uppnåts. Då satte jag första servots pinne låg och gick vidare på nästa servo där jag laddade om timern med mellanskillnaden mellan servo 1 och 2 osv... När sista servot satts lågt har du minst 18 ms på dig att uppdatera listan med nya värden och sortera om den.