PIC - Parallella processer
- Glenn Fridén
- Inlägg: 5
- Blev medlem: 22 oktober 2009, 07:23:19
- Ort: Hisingen, Göteborg
PIC - Parallella processer
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
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
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.
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
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
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
Edit: eqlazer var snabbare
Re: PIC - Parallella processer
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 ?
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
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.
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
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.
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.
Senast redigerad av Icecap 22 oktober 2009, 09:33:05, redigerad totalt 1 gång.
Re: PIC - Parallella processer
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
Och till trådskaparen: Snyggt förnamn

Re: PIC - Parallella processer
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 ?
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 ?
- Glenn Fridén
- Inlägg: 5
- Blev medlem: 22 oktober 2009, 07:23:19
- Ort: Hisingen, Göteborg
Re: PIC - Parallella processer
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

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
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
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.
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
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.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.
Re: PIC - Parallella processer
Nja, byggde inte den tidigare beskrivningen på hur PWM modulen i sig fungerar också ?
Där kan det finnas andra begränsningar...
Där kan det finnas andra begränsningar...