Wiki material ? (PWM generator)
Postat: 2 januari 2008, 16:23:39
Hej hej, nu har jag till slut lyckats fixa ihop någonting som fungerar
så jag tänkte att om någon vänlig själ kunde ta sej en titt på koden
och bestämma om det är något att dela med sej av så kan jag kanske
stoppa in det i wikin tex.
Det är en interruptdriven PWM generator för att styra "vanliga" servon med.
Idén är att man ska kunna styra flera servon och samtidigt ha sin egen kod
snurrande, ingen polling behövs tex det är bara att anropa startrutinen
och sen sätta servo-positioner när man vill i sin kod (eller sätta en sorts
traveling se nedan).
Hur det funkar :
Signalerna genereras en efter annan, servo 1 puls, servo 2 puls osv.
När sista servot har gjort sin puls kollas det om vi behöver vänta lite,
alltså har rundan tagit typ minst 20msec (denna siffra kan man ändra,
det är en #define i koden).
Detta är ju inte en optimal lösning, men det borde funka ok på typ upp till 10-15
servos antar jag, har genererat pulser för 16 men hade bara två servon för test
inkopplade men det funkade bra (servona snurrade som dom skulle utan att hacka).
Skrev ihop et liten function också som interpolerar läget över tiden så att
man kan säga typ "kör från puls 1.0msec till 1.7msec över två sekunder".
Man kan såklart sätta ett absolut värde om man vill det (puls 1.5msec Nu).
Vad kan jag säga mer... programmerat i AVR Studio, 100% icke optimiserad kod...
Koden i testtimer.c visar hur man använder pwm koden och vrider två
servon fram och tillbaka i två olika hastigheter.
Ja jo, projektet finns här här
så jag tänkte att om någon vänlig själ kunde ta sej en titt på koden
och bestämma om det är något att dela med sej av så kan jag kanske
stoppa in det i wikin tex.
Det är en interruptdriven PWM generator för att styra "vanliga" servon med.
Idén är att man ska kunna styra flera servon och samtidigt ha sin egen kod
snurrande, ingen polling behövs tex det är bara att anropa startrutinen
och sen sätta servo-positioner när man vill i sin kod (eller sätta en sorts
traveling se nedan).
Hur det funkar :
Signalerna genereras en efter annan, servo 1 puls, servo 2 puls osv.
När sista servot har gjort sin puls kollas det om vi behöver vänta lite,
alltså har rundan tagit typ minst 20msec (denna siffra kan man ändra,
det är en #define i koden).
Detta är ju inte en optimal lösning, men det borde funka ok på typ upp till 10-15
servos antar jag, har genererat pulser för 16 men hade bara två servon för test
inkopplade men det funkade bra (servona snurrade som dom skulle utan att hacka).
Skrev ihop et liten function också som interpolerar läget över tiden så att
man kan säga typ "kör från puls 1.0msec till 1.7msec över två sekunder".
Man kan såklart sätta ett absolut värde om man vill det (puls 1.5msec Nu).
Vad kan jag säga mer... programmerat i AVR Studio, 100% icke optimiserad kod...
Koden i testtimer.c visar hur man använder pwm koden och vrider två
servon fram och tillbaka i två olika hastigheter.
Ja jo, projektet finns här här