Wiki material ? (PWM generator)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
MrFreeze
Inlägg: 72
Blev medlem: 23 november 2005, 22:15:02

Wiki material ? (PWM generator)

Inlägg av MrFreeze »

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
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Läste igenom hela inlägget innan jag såg "AVR Studio". Aha.. 'fel' sort. :)

Så om det blir en wiki-artikel: Skriv då att det gäller AVR. :wink:
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Det går säkert att få användning av den där koden. :)

Vad gör variablerna 'ucLocalPORTA' och 'ucLocalPORTB' för nytta?
Användarvisningsbild
MrFreeze
Inlägg: 72
Blev medlem: 23 november 2005, 22:15:02

Inlägg av MrFreeze »

Ok, (AVR rules ;) )

ucLocalPORTA & ucLocalPORTB är vad PORTA och PORTB har för värden
så att man inte behöver läsa av portarna hela tiden.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK (kan inte AVR) vad gör det för skillnad ?
Varför är det sämre att läsa portarna direkt ?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Då kan du väl lika gärna läsa av PORTA och PORTB direkt, eller? Det borde reducera antalet instruktioner och minska SRAM-användandet.

En sak till. Om man bara har ett servo vill man kanske inte ockupera hela PortA och PortB...
Användarvisningsbild
MrFreeze
Inlägg: 72
Blev medlem: 23 november 2005, 22:15:02

Inlägg av MrFreeze »

Ah, ja jag tänkte att det var långsamt vilket det kanske inte är ...

Annars så eftersom koden är byggt för en 16-bits interrupt så verkar
de atmega som har det också ha relativt mycker minne, 2kb sram på Atmega32 tex.

Om man vill använda färre servon så får man dock skriva om koden lite,
om jag läser direkt från portarna så används ju färre bitar upp dock.

Ska kolla upp det och kolla om det funkar bra att läsa direkt från portarna
då kommer programmet bara att använda X antal bitar i portarna där X är
antalet servon definierat i programmet.

Ja jag får allt kolla upp det där.

/Ludvig
ps. jag har lagt till en länk i wikin :
PWM-generator
(ändra gärna om det behövs).
Skriv svar