Sida 1 av 1
PIC - Parallella processer
Postat: 22 oktober 2009, 07:38:15
av Glenn Fridén
Hej,
Jag är nybörjare på PIC men knåpar på så gott jag kan. Nu vill jag använda en PIC12F683 (eftersom den är billig, liten och har inbyggd PWM) för att göra en ventilstyrning. Kretsen ska mäta temperaturen med en Dallas DS1820 och sedan styra ett RC-servo till rätt läge beroend på det uppmätta temperaturen.
Jag har fått till mätningen med DS1820 (lite halvklumpigt kanske, har nån skitsnygg kod för detta är jag givetvis nyfiken) men fattar inte hur jag ska göra för att styra RC-servot i bakgrunden. Det behöver ju sina pulser hela tiden och det måste göras i bakgrunden när jag mäter temperaturen. Hur gör jag för att uppnå detta - jag vet inte om det kallas parallella processer, bakgrundsprocess etc.
Den kod jag hittills producerat är ju helt sekventiell. Jag måste ha missat något! Är det någon som gjort samma sak och kan dela med sig?
/Glenpa
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 08:42:37
av Micke_s
Du ska kolla på interrupt och använda en timer.
http://www.epanorama.net/documents/motor/rcservos.html
Edit: Jag har gjort till avr. men då har den bättre lämpad 16bitars timer för skapa servopulser från hårdvaran.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 08:49:22
av eqlazer
Antar att du tänkte styra servot med PWM. PWM använder en timer som själv ligger och räknar och sköter utgången. Det enda du gör är att uppdatera några register som talar om pulsbredden och det går att göra när som, tex efter temperaturmätningen.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 08:50:21
av ristomemo
Har aldrig försökt kontrollera en rc-servo från en PIC, men efter att läst länken Micke_s postade så tycker jag att detta borde vara smidigast att göra med en PIC med hårdvaru-PWM. (har ej kollat närmare på PIC12F683 om den har det eller ej)
Edit: eqlazer var snabbare
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 08:56:06
av sodjan
Hårdvaru-PWM-moduler är generellt olämpliga til RC-server styrning.
Det är för låg frekvens för att fungera smidigt. Enklast är att ha ett
timer-interrupt som ligger i bakgrunden och sköter servot. Det bör
inte vara något problem alls att samköra detta med 1-Wire hanteringen.
Du borde väl kunna läsa av DS1820 i 20 ms pausen mellan två pulser
till servot, eller något liknande. Jag antar att ventilen även står kvar
i sitt läge om pulserna uteblir en lite längre tid, eller glider ventilen iväg ?
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 09:06:30
av Micke_s
Det går i avr att använda en 16bitars timer som gör rc-servopulser i alla fall, fast då får man max 64step på servot. Men som sodjan skriver så är timer interrupt bättre att sköta detta i, du måste vara rätt så noga med att pulserna kommer samtidigt så du slipper ha ett servo som hoppar lite.
edit: ändrade pwm till rc-servopulser
edit2: tror det kan bli svårt att använda 16-bitars timern i pic12f att skapa rc-servopulser.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 09:13:36
av Icecap
Precis som sodjan skriver: det är INTE PWM man styr RC-servon med, det är bredden på en puls som är viktig.
Och själva styrningen är ganska enkel: En puls på 1,0ms = ytterställning åt ena hållet, 2,0ms = ytterställning andra hållet och 1,5ms = mittställning. Dessa pulser bör komma med runt 20ms mellan.
Jag har tidigare gjort så att jag avläste en DS18S20 vid att ha en timer-interrupt på 10Hz (som jag hade till mycket annat), jag lade till att den läste/skrev 1 bit varje interrupt till DS18S20'an, temperaturen ändrar sig ju inte så snabbt att det är viktigt att det går snabbt.
Sedan är det frågan för vilken upplösning du vill ha på servon, jag löste det på en PIC och fick en upplösning på 1000 steg, sannolikt alldeles för många för att mekaniken kan följa med. Det projekt finns på min hemsida, under "Freebies".
I essens fungerar det såhär:
Via serieporten kommer det kommandon i form av "kanal X till läge Y", värdet sparas i rätt minneslokation.
Sedan kör en timer-interrupt kontinuerligt och varje av de 13 kanaler får var sin puls och längden är beroende på de värden som är sparat i de respektive minneslokationer.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 09:32:07
av Glenn
Om nu servot bara ska styra en ventil så är det jun inte hela världen om det blir lite ryck och så, och då kan man ju helt enkelt anpassa sin "läsloop" och en paus så timingen mot servot blir ungefär rätt, servon är lite olika kinkiga på det, men oftast ganska toleranta.
Och till trådskaparen: Snyggt förnamn

Re: PIC - Parallella processer
Postat: 22 oktober 2009, 12:31:24
av sodjan
Antalet "steg" (eller "upplösning") som det där ventilen behöver är helt
centralt för designen av servo-rutinen. Det avgör vilken upplösning
räknaren som räknar behöver. Behövs det mer än kanske 10 lägen
på ventilen ?
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 13:03:27
av Glenn Fridén
Tackar för komplimangerna om mitt namn - det är inte varje dag som man hittar en namne på andra sidan Sverige!
Kraven på upplösning är låga! Tio steg är kanske i minsta laget men det dubbla borde räcka.
Eftersom det är stor termisk tröghet i systemet så är kraven på tidsmässig uppdatering låga. Det räcker egentligen bra om jag mäter temperaturen en gång i timmen och ställer shunten efter detta mätvärde. Det är snarare en nackdel att vrida på shunten oftare.
Jag är osäker på hur R/C-servot uppför sig då det inte får någon signal. Shunten i sig påverkar inte servot med någon kraft då det står stilla. Det har ingen form av fjäderbelastning. Däremot vet jag inte om ett vanligt R/C-servo (typ Futaba från nån firma som säljer hobbygrejer) strävar efter att gå tillbaka till 0-läge då det inte får någon styrsignal - någon som vet? Om inte så räcker det med att skicka en skur med styrsignaler en gång i timmen och därefter låta servot vila.
/Glenn
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 13:17:19
av Micke_s
En vanlig RC-servo gör inget om det inte kommer en insignal och eftersom det inte finns någon kraft som påverkar servot så kommer det inte flytta sig.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 14:15:27
av sodjan
Jahaja, ja då har du ju ett mycket enklare "läge" så att säga.
Du kan ju enkelt göra en sak åt gången. Mäta temperaturen då
och då (beroende hur hur din reglerloop ser ut) och köra lite med
servot. Det räcker ju att köra servot så pass länge så att det täcker
in gångtiden mellan fulla utslag. Och som sagt, ett RC server står still
utan insignal. Dock kan man vrida ett kvalitets servo bakvägen om man
belastar armen (eller skivan om det är en roterande servo).
En annan sak. Beroende på massan på det som ska flyttas (spjället)
så kan det vara snyggt att "rampa" servot, d.v.s inte bara låta det gå
med full fart direkt. Det kan (beroende på massan) kanske bli för stor
belastning direkt från stillastående. Samma sak när man närmar sig
börvärdet (-läget) så att det bromsar in snyggt. Eller så kör man det bara
långsamt med jämn hastighet hela tiden, du har ju inga stora krav
på att spjället ska flyttas snabbt i alla fall.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 16:34:43
av Gimbal
Micke_s skrev:Det går i avr att använda en 16bitars timer som gör rc-servopulser i alla fall, fast då får man max 64step på servot.
Nja, 16 bitar utspridda på 20ms ger ca 3200 steg per ms. Det ger rätt bra upplösning och betydligt mer än 64 steg.
Re: PIC - Parallella processer
Postat: 22 oktober 2009, 17:03:12
av sodjan
Nja, byggde inte den tidigare beskrivningen på hur PWM modulen i sig fungerar också ?
Där kan det finnas andra begränsningar...