Avläsa givare med PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
hakke
Inlägg: 2
Blev medlem: 29 juni 2005, 10:46:43
Ort: Stockholm

Avläsa givare med PIC

Inlägg av hakke »

Hej!
Mitt problem är följande...
Jag ska läsa av upp till sex absoluta vinklar, till detta tänkte jag använda en hallgivare som ger både PWM och analog utsignal. Då en magnet roterar över givaren förändras PWM signalens duty cycle mellan 10% och 90% (0-360 grader) och den analoga utsignalen mellan 0,5 V och 4,5 V (0-360 grader).

Nu undrar jag om någon har en smart lösning på detta, för tillfället sitter jag med en PIC16F628 vilken tyvärr saknar A/D omvandlare. Undrar för det första om det över huvud taget är möjligt att läsa av PWM signalens duty cycle? eller om jag måste byta till en PIC med A/D omvandlare, tex. PIC16F88?

Hoppas ngn kan leda mig på rätt väg....
/Håkan
Användarvisningsbild
AndLi
Inlägg: 18274
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Inte för att jag har databladet till 628an i huvudet...

Du borde kunna läsa av PWM genom att trigga ett interrupt på flankerna, kolla nivån på pinnen och då veta om det är upp eller nedgående.
Samtidigt har du en timer rullandes som du läser av när interrupten kommer.
Sen är det bara att räkna på hur lång tid det är mellan de olika interrupten...

Det finns ett maxtak på hur snabba pulståg du kan läsa av på detta sätt, men på långsamma signaler funkar det ofta fint.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hur vill du att vinkeln skall representeras i PIC'en ?
Ett absolutvärde = vinkeln i grader ? Alltså 0-360 ?
Eller klarar du dig med lite sämre upplösning så att
hela mätområdet kan representeras av en byte 0-255 ?
Vad skall värdet användas till i "nästa steg" ?

Om det enbart är duty cycle som ändras (d.v.s inte
bas frekvensen) så är det ganska enkalt att mäta
det hela med en timer. PWM frek är 2 Khz, så
10-90% motsvaras av 50 - 450 us.

Sätt upp ett interrupt på en pinne. I ISR'en kan man
sedan kolla om pinnen gick "upp" eller "ner" och
stoppa/starta en timer på lämligt sätt. Eventuellt
får man ställa om interrupt flanken varje gång
också... Kolla databladet.

En rent digital mätmetod är också enklare att bygga
och inte lika störkänslig som en analog motsvarighet...
hakke
Inlägg: 2
Blev medlem: 29 juni 2005, 10:46:43
Ort: Stockholm

Inlägg av hakke »

sodjan skrev:Hur vill du att vinkeln skall representeras i PIC'en ?
Ett absolutvärde = vinkeln i grader ? Alltså 0-360 ?
Eller klarar du dig med lite sämre upplösning så att
hela mätområdet kan representeras av en byte 0-255 ?
Vad skall värdet användas till i "nästa steg" ?

Om det enbart är duty cycle som ändras (d.v.s inte
bas frekvensen) så är det ganska enkalt att mäta
det hela med en timer. PWM frek är 2 Khz, så
10-90% motsvaras av 50 - 450 us.

Sätt upp ett interrupt på en pinne. I ISR'en kan man
sedan kolla om pinnen gick "upp" eller "ner" och
stoppa/starta en timer på lämligt sätt. Eventuellt
får man ställa om interrupt flanken varje gång
också... Kolla databladet.

En rent digital mätmetod är också enklare att bygga
och inte lika störkänslig som en analog motsvarighet...
------------------------------------
Tack för svaren...
Saken är den att givaren är tänkt att sitta i ett handväxelreglage som ser ut och fungerar som ett gashandtag till mc. Jag ska ha 6 växlar med 24 graders vridning mellan varje läge -> totalt endast 144 graders vridning.

Ett absolut värde på vinkeln är dock nödvändigt om växeln vrids mekaniskt när strömmen är frånslagen, detta för att alltid känna av rätt läge.

Att klara sig med lite sämre upplösning, en byte (0-255) på ett varv (0-360) räcker gott för mig (!) då jag endast ska känna av 6 lägen på 144 graders vridning. Att klara sig med sämre upplösning verkar mycket bra, men hur menar du att jag kan klara mig på en byte? behöver jag inte använda CCP1 pinnen?

Menar du att jag ska skriva ett interrupt för INT pinnen där jag kollar om pinnen gick upp eller ner och ställa om flanken där emellan..? och mha. tex. timer1 räkna ut tiden...
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

I detta forum citerar man inte inlägget strax före!

Anledningen till att det frågades om du klarade dig med 1 byte är helt enkelt att mycket blir enklare om man kan klara vissa saker med 1 byte i stället för fler.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, här kommer det info som SKULLE ha varit med redan från första början...

Du har alltså bara sex "lägen" (eller intervall) som är intressanta...

Har den mekaniska delen en sådan konstruktion att man aldrig kan hamna i mellanlägen ? D.v.s någon typ av mekanisk spärr eller hack. Eller är reglaget helt steglöst ? Man kan få problem då man ligger "på gränsen" och det avlästa värdet hoppar mellan två värden okontrollerat. Om detta senare används till att styra något annat, kan det få förödande konsekvenser. Nåväl, vi bortser från det tillsvidare (eftersom vi känner till för lite just nu).

Jag skulle koll om man inte kan konfigurera en timer på sådant sätt så att det lästa värdet från timern (vilket alltså motsvarar längden på den låga eller höga pulsen, vilken man nu väljer att använda) på ett enkelt sätt kan användas direkt.

Som exempel gjorde jag en mottagare för en IR signal, där kodningen av "1", "0", och stopp-bit var olika längd på en puls. Jag fixade så att tre olika bitar i timern direkt talade om vilken bit det var. Ingen "range-check" behövdes. I princip liknar det avkodningen av PWM signalen.

Hur som helst, jag tror att man måste börja med att mäta lite på den mekaniska delen inkl givare. Då får du max, min och de olika intervall som motsvarar de olika "lägena". När man har det får man gå vidare och titta på timern, och hur den skall konfigureras för att enkelt avkoda signalen.

Med den givare som du har valt, får du ju alltid ett absolut värde, så det skall inte vara något problem.

Jag har kollat mycket snabbt i databladet (det är ju *ditt* job :-) ) , och kanske kan man använda capture. notera att man där sätter upp vilken flank den skall reagera på. Här gäller det ju tiden mellan två olika flanker (upp/ner eller ner/upp), så man måste fippla lite med CCP modulen on-the-fly, viket inte är något problem alls...

Om inte CCP modulens möjligheter räcker, så kan man ju även göra samma sak, fast med lite mer egen kod.

Slutligen, av helt avgörande betydelse är också vad PIC'en skall göra totalt sätt. D.v.s det kan bli en lösning om den enbart skall avkoda pwm signalen, mot om den även skall göra en massa annat. Lösningen för avkodningen av PWM signalen kanske skall anpassas till en övergripande applikations struktur... Vad vet jag...
Skriv svar