Sida 1 av 1
PWM problem
Postat: 22 november 2005, 00:29:34
av Markus
Tänkte programmera ett program till pic 18f452 som skulle generera en PWM signal tilll mitt rc servo. Men sedan jag har läst databladet till PiC 18F452 så fick jag seav min glädje att det fanns den funktionen inbyggd i pic:en . Nu är bra stora frågan hur jag utnyttjar denna funktion i mitt program. Vet någon där ute om man kan läsa någostans lite info hur man ska programmera för att kunna andvända den inbyggda funktionen i pic:en.Försökte att läsa i genom info i databladet men kändes att jag borde att lite förkunskaper för att förstå detta. Kollade i boken A beginners guide to the Microchip PIC som jag har lånat från universitetbibloteket för att lära mig att programmera pic processorn.
Men dessa pic som beskrivs där är för gammal för denna nya och morderna funktion.
Finns det någonstans eller lämplig bok att läsa angående detta. så man får lite generella kunskaper innan man försöker att begripa infon i databladet.
Om någon sedan hadde några fina exempel att visa mig med komentarer tiill angående detta så skulle jag vara tacksam.
Postat: 22 november 2005, 00:34:34
av danei
Jag tror inte att det går att få ner den i 50Hz utan att klocka ner PICen kraftigt. Inte säker på at det är den, men på någon variant var det så iafa.
svar på inlägget i alla fall om ni svarar
Postat: 22 november 2005, 10:07:27
av Markus
tjoho
Postat: 22 november 2005, 10:09:07
av vfr
Tror att Danei har rätt.
Det man _oftast_ menar när man pratar om PWM är egentligen inte pulsbreddsmodulering utan "pulsförhållandemodulering" (kasst namn), d.v.s att förhållande mellan pulslängd och pulslucka bestämmer resultatet utan att frekvensen egentligen har någon stor inverkan. Det är detta PWM-hårdvaran i uC är gjord för och då oftast med så hög frekvens som möjligt.
Ett RC-servo är mer bokstavligen likt pulsbreddsmodulering eftersom det är enbart pulslängden som egentligen bestämmer resultatet. Frekvensen (pulsluckan i det här fallet) kan däremot variera en hel del utan att förändra läget på servot.
En bättre hårdvarulösning till det här är att använda en "output compare"-modul till en timer. Vid början av pulsen sätts utgången aktiv manuellt och OC-modulen initieras med rätt värden. Efter inställd tid så kommer OC-modulen själv att sänka utgången och man får snygga pulser med stabil pulslängd. Alternativt kan man köra även pulsluckan med OC-modulen. Gärna i kombination med avbrott!
Postat: 22 november 2005, 10:09:40
av sodjan
PWM modulen är inte helt lämplig till detta eftersom, som danei sa, är svårt att få ner den i tillräckligt låg frekvens.
När det gäller var man kan läsa om hur PWM modulen (eller något annat i processorn) fungerar, så är det databladet som gäller. Är något oklart, så fråga bara här. Men läs först ! Om det är stora problem att läsa databladet, så är det ett problem som du bör lösa först, innan du gör någonting annat...
En sak, är det bara en RC kanal som skall styras ?
Vilken upplösning behöver du ? D.v.s hur många distinkta "steg" behöver servot ha ?
Jag antar att det är en vanlig RC servo signal, alltså 20 ms intervall med 1.5 +/- 0.5 ms puls, eller hur ? Om du vill att denna signal skall köras kontinuerligt utan allt för mycket problem i koden, så är det enklast att sätta upp en timer som först ger ett fast 19 ms intervall, sedan ett variabelt intervall på 1-2 ms beroende på vilken "position" servot skall ha, sedan ett fast 19 ms intervall igen o.s.v. Samt fipplar med en pinne så att man får en signal, så klart.
Med en 18F har du tillräckligt med timers för att fixa detta. Fixa ett timer interrupt där timern laddas om med nästa intervall. Och en flagga som signalerar vilken den an signalen som timern just nu befinner sig i.
Det är rellativt lätt att utöka detta till flera kanaler.
Observera att man inte behöver minska 19 ms intervallet med 1-2 ms, det spelar ingen roll att man har ett totalt intervall som varierar något. Vill man (och har timers "över") så kan man använda två olika timers, en för varje del av signalen. Det blir lite enklare och lite snabbare interrupt kod.
> Om någon sedan hadde några fina exempel att visa mig med komentarer tiill angående detta så skulle jag vara tacksam.
Det tar några minuter att fixa, men det är bättre att du börjar och så utgår vi från det...

finns ingen littratur att läsa med andra ord om detta
Postat: 22 november 2005, 10:43:04
av Markus
Synd för jag är rocky på detta område. Först fattar jag på dom första svaren at det inte går,sedan går det utan problem. Hur går jag tillväga. Igen som kan visa mig ett exempel.och vad är det i databladet som är viktigt för konstruktionen.
igen som kan visa mig en pwm kod till servo så kanske jag förstår hur jag ska programmera.
MVH markus
Ps:behöver mega hjälp är en rocky på pic
Postat: 22 november 2005, 10:54:37
av sodjan
Har du inte skrivit någon kod till en PIC förrut ?
I så fall skall du börja med enkla exempel, få en LED att blinka eller liknande.
Vad har du för hårdvara/programmerare ?
> vad är det i databladet som är viktigt för konstruktionen.
Åtminstånde kapitel 1-5, 8-13, 19 och 20. Eventuellt fler som t.ex 6, 14 och 16 beroende på villka funktioner du behöver/vill använda.
Enklast är att läsa databladet från sid 1 och framåt ett par gånger...
> Först fattar jag på dom första svaren at det inte går,sedan går det utan problem.
Det går inte med PWM modulen, men det är inga problem annars...
Postat: 22 november 2005, 11:02:09
av sodjan
En kommentar...
Du har helt rätt i att databladen kan vara lite svåra första gången man öppnar dom. Jag har tankar på att skriva en "Nybörjarguide till PIC datablad", där jag dels förklarar olika begrepp och även tar ett typiskt datablad och kör en "walk-through" från pärm till pärm. Alla datablad är mycket lika, så har man väl lärt sig hitta och förstå ett är det väldigt enkelt att hitta i ett annat för en annan PIC modell.
Men just nu är det väll bara att hoppa i i den ljupa delen av bassängen och simma utav bara f-n...

Postat: 22 november 2005, 11:14:03
av Icecap
Och när nu kommentaren har kommit igång: det heter rooky, inte rocky.
EDIT: Åhja...som ni ser av inlägget efter hade jag fel där: ROOKIE är det rätta.... hå hå, ja ja....
Men jag håller med de föregående talare i deras slutsats: PWM är egentligen ett "billigt" sätt att kunna skapa t.ex. analoga spänninger på ett enkelt digitalt sätt.
Det är å andra sidan fullt möjligt att trixa lite med timer och interrupt:
* sätt timern att ge interrupt efter en viss tid, t.ex. 20ms.
* När ISR körs skrivs det en '1' till lämplig portpinne och en tid som motsvarer det utslag man vill ha på servon skrivs in i timern varpå ISR'n avslutas.
* När ISR'n åter aktiveras av ytterligare ett interrupt kollar man portpinnen. Om den är satt ställer man tillbaka pinnen och laddar timern med de 20ms igen, annars gör man som beskrivit steget innan.
På detta sätt kan pulsningen köra "autonomt" och en "normal" rutin kan räkna ut vilket värde som den önskade positionen motsvarer och spara den i en variabel.
Sådär ja.....båda lite messerschmidt och vettigt....det är en bra dag!

Postat: 22 november 2005, 11:23:22
av fredde76
Eller så heter det rookie

Postat: 22 november 2005, 11:25:12
av Icecap
Just det....inte ens som messerschmidt kan man ha rätt
Nåväl, resten _vet_ jag fungerar, jag har gjort så i ett par projekter.

PWM Signal
Postat: 22 november 2005, 16:38:35
av Markus
Kan någon visa mig hur jag utnytjar timer och interrupt i ett exempel. visa några exempel i kod så kanske jag begriper hur man ska andvända interrupt och timer för att skapa en PWM signal.
Koden skrivwn i Lågnivå helst.
Kanske någon som har ett färdig konstruktion till servo med interrupt och timer som man kan få kolla på och lära sig.Då kanske jag får ut mer sedan av data bladet. Heller någon bara hemsidfa eller bok som handlar om detta.