Signalkurva från pulsgivare?
Signalkurva från pulsgivare?
Hej, jag har under en tid nu försökt läsa av en pulsgivare (art nr. 35-847-60 på elfa) med en pic, men jag förstår inte hur signalen från en pulsgivare ser ut.
Hur ser signalen ut vid rotation med-/moturs och hur ska picen tolka signalen.
Hur ser signalen ut vid rotation med-/moturs och hur ska picen tolka signalen.
ELFA --> Utförande med 24 pulser/varv, med riktningsindikation
Du får skriva kod för riktningsindikationen.
"Hur ser signalen ut vid rotation med-/moturs."
PIC Application Notes - Reading Rotary Encoders
Du får skriva kod för riktningsindikationen.
"Hur ser signalen ut vid rotation med-/moturs."
PIC Application Notes - Reading Rotary Encoders
Senast redigerad av BEEP 21 augusti 2008, 18:21:31, redigerad totalt 1 gång.
Koppla pullups på utgångarna och den gemensamma till jord. Det blir som upprepande gray-kod 0-3 tror jag.
Här är två exempel i C för kompilatorn CC5X.
http://www.isk.kth.se/kursinfo/6b4059/quad/index.htm
http://www.isk.kth.se/kursinfo/6b4059/quad/rbint.htm
Här är två exempel i C för kompilatorn CC5X.
http://www.isk.kth.se/kursinfo/6b4059/quad/index.htm
http://www.isk.kth.se/kursinfo/6b4059/quad/rbint.htm
förstod inte riktigt skilnaden mellan cw/ccw.
Tycker det verkar som om det vore smartare att båda utgångarna alltid var låga och om man vrider så kommer en kort puls på ena utgången och beroende på vilken pinne som gjorde pulsen så vet man vilken riktning det var. Men det kanske finns något smart med att båda utgångarna växlar mellan hög/låg oavsätt riktning.
Tycker det verkar som om det vore smartare att båda utgångarna alltid var låga och om man vrider så kommer en kort puls på ena utgången och beroende på vilken pinne som gjorde pulsen så vet man vilken riktning det var. Men det kanske finns något smart med att båda utgångarna växlar mellan hög/låg oavsätt riktning.
Det beror på att en sådan givare antingen skulle behöva komplicerad mekanik eller inbyggd elektronik. Givaren är enkel att tillverka och därmed billig. Den har en genial konstruktion tycker jag, så enkel och ändå väldigt robust. Det går att bygga använda några (tror två) grindar utanför PIC:en för att få två "enklare" signaler; den ena är riktning och den andra pulståg.
Det står 24 pulser per varv, det betyder att signal A och signal B är låga/höga 24 gånger per varv. Om du tittar på alla kombinationer blir upplösningen 4*24 per varv.
Det står 24 pulser per varv, det betyder att signal A och signal B är låga/höga 24 gånger per varv. Om du tittar på alla kombinationer blir upplösningen 4*24 per varv.
> förstod inte riktigt skilnaden mellan cw/ccw.
Clockwise/counter clockwise. D.v.s medurs/moturs. Om du "kan" en
gammal klocka med urtavla så tror jag att du vet vad som menas...
Enklast är att ha en loop (loop-tid beroende på hur snabb rotation
man vill kunna detektera). I loopen jämförs aktuell pinstatus med
föregående loop, och jämförelsen ger riktningen.
Enklast är att lägga föregående loops pinnar tillsammans med
denna loops pinnar, t.ex så här: "0000abAB" där "ab" är
föregående loop och "AB" är denna loop. "Värdet" på denna byte
ger då riktningen. I praktiken blir det bara ett par giltiga värden,
de andra kan vara kontaktstudsar eller något annat "skräp" och
det är bara att strunta i.
Det är ju bara en rellativ vridning man vill ha, så missade läsningar
spelar ingen roll, ingen kommer att märka om det är 20, 21, 22 eller
23 duttar per varv istället för 24...
Clockwise/counter clockwise. D.v.s medurs/moturs. Om du "kan" en
gammal klocka med urtavla så tror jag att du vet vad som menas...
Enklast är att ha en loop (loop-tid beroende på hur snabb rotation
man vill kunna detektera). I loopen jämförs aktuell pinstatus med
föregående loop, och jämförelsen ger riktningen.
Enklast är att lägga föregående loops pinnar tillsammans med
denna loops pinnar, t.ex så här: "0000abAB" där "ab" är
föregående loop och "AB" är denna loop. "Värdet" på denna byte
ger då riktningen. I praktiken blir det bara ett par giltiga värden,
de andra kan vara kontaktstudsar eller något annat "skräp" och
det är bara att strunta i.
Det är ju bara en rellativ vridning man vill ha, så missade läsningar
spelar ingen roll, ingen kommer att märka om det är 20, 21, 22 eller
23 duttar per varv istället för 24...
- MadModder
- Co Admin
- Inlägg: 31442
- Blev medlem: 6 september 2003, 13:32:07
- Ort: MadLand (Enköping)
- Kontakt:
Pulstågen från utgångarna är ju förskjutna mot varandra. Genom att kolla vilken flank som kommer först och vad den andra har för läge då kan man räkna ut riktningen ganska lätt.
[edit]
Jahaja, det hann komma ett par svar mellan
Är man lat och inte orkar fixa detta i mjukvara så går det med en logikkrets mellan, så får man en pulser från antingen ena eller andra utgången beroende på hur man vrider
http://www.interq.or.jp/japan/se-inoue/e_ckt10_3.htm
(up down detection circuit)
Här finns också en hårdvarulösning. Kopplar rotationssensorn till ABC till vänster, och du får ut fina upp/ner-pulser från A/B nere till höger.
[edit] adressen kanske...
http://users.tkk.fi/~jwagner/electr/rot ... rotdec.jpg
Men det är ju smidigare att programmera det där istället för att löda det...
[edit]
Jahaja, det hann komma ett par svar mellan

Är man lat och inte orkar fixa detta i mjukvara så går det med en logikkrets mellan, så får man en pulser från antingen ena eller andra utgången beroende på hur man vrider
http://www.interq.or.jp/japan/se-inoue/e_ckt10_3.htm
(up down detection circuit)
Här finns också en hårdvarulösning. Kopplar rotationssensorn till ABC till vänster, och du får ut fina upp/ner-pulser från A/B nere till höger.
[edit] adressen kanske...

Men det är ju smidigare att programmera det där istället för att löda det...

Senast redigerad av MadModder 21 augusti 2008, 20:36:28, redigerad totalt 2 gånger.
Jag tror jag har fattat hur picen ska tolka signalerna, men rätta mig om jag har fel. Picen kör en loop som ständigt kollar av de två ingångarna som pulsgivaren är kopplad till, så länge ingen av ingångarna ändrar status så gör loopen inget, men om någon av ingångarna ändrar status så sparas de två bitarna i en variabel, sedan gör man detta tills man har hela raddan med 8 bitar, har man fått fram kombinationen 10 11 01 00 så kör man ett steg cw, har man däremot fått fram kombinationen 00 01 11 10 så kör man ett steg ccw. Är detta rätt tänkt?
> Picen kör en loop som ständigt kollar av de två ingångarna
Inte "ständigt" utan en gång varje varv i loopen.
Och loopen är vanligtsvis inte en "loop" utan ett timer avbrott/interrupt.
Jag köde med 400 avbrott/sekund på en PIC18 och det fungerade
utmärkt med helt OK "känsla" i vridningen.
Dessutom, detta är *ett* sätt att lösa det på...
> sedan gör man detta tills man har hela raddan med 8 bitar,
Nej!
Du jämför vid varje "varv" (eller igentligen timer-avbrott) om
pinnarna har ändrats, och i så fall i vilken "riktning". Sedan sparar
du bara det senaste läget till nästa avläsning...
Inte "ständigt" utan en gång varje varv i loopen.
Och loopen är vanligtsvis inte en "loop" utan ett timer avbrott/interrupt.
Jag köde med 400 avbrott/sekund på en PIC18 och det fungerade
utmärkt med helt OK "känsla" i vridningen.
Dessutom, detta är *ett* sätt att lösa det på...
> sedan gör man detta tills man har hela raddan med 8 bitar,
Nej!
Du jämför vid varje "varv" (eller igentligen timer-avbrott) om
pinnarna har ändrats, och i så fall i vilken "riktning". Sedan sparar
du bara det senaste läget till nästa avläsning...
Jag har inte filerna här till det nu, men jag fick ha några extra bitar
som håller reda på om man får räkna upp eller ner, eller inte göra det.
Annars så hackar det och hoppar när man vrider.
När jag tog med dom bitarna så fungerade det som det skulle.
(Jag försökte räkna upp eller ner på varje flank först, och dela det med 2,
men det gick inte så bra.)
Det är ingen ide att nån frågar hur det är gjort, för det kan jag inte utantill.
Jag får se om jag kommer åt dom filerna nån gång längre fram.
som håller reda på om man får räkna upp eller ner, eller inte göra det.
Annars så hackar det och hoppar när man vrider.
När jag tog med dom bitarna så fungerade det som det skulle.
(Jag försökte räkna upp eller ner på varje flank först, och dela det med 2,
men det gick inte så bra.)
Det är ingen ide att nån frågar hur det är gjort, för det kan jag inte utantill.

Jag får se om jag kommer åt dom filerna nån gång längre fram.
Menar du "får räkna" eller kanske "ska räkna upp eller ner".
Vad är annars som gör att man inte *får* räkna upp eller ner ?
> (Jag försökte räkna upp eller ner på varje flank först, och dela det med 2,
> men det gick inte så bra.)
Varje flank på "A" eller på "B" eller på båda ?
I mitt fall så är det inte flankerna som är intressanta, utan
det faktiska värdet på A tillsamans med B som jämförs med
föregående läge.
En liten nackdel (jämfört med en interruptdriven lösning) är att man
får läsa encodern även när den inte rörs, men i mitt fall (med 400 Hz
avläsning) så var det bara ett par % av processorns cykler, så det
var inget problem.
Jag har också letat efter mina filer, men de verkar inte finnas kvar...
Vad är annars som gör att man inte *får* räkna upp eller ner ?
> (Jag försökte räkna upp eller ner på varje flank först, och dela det med 2,
> men det gick inte så bra.)
Varje flank på "A" eller på "B" eller på båda ?
I mitt fall så är det inte flankerna som är intressanta, utan
det faktiska värdet på A tillsamans med B som jämförs med
föregående läge.
En liten nackdel (jämfört med en interruptdriven lösning) är att man
får läsa encodern även när den inte rörs, men i mitt fall (med 400 Hz
avläsning) så var det bara ett par % av processorns cykler, så det
var inget problem.
Jag har också letat efter mina filer, men de verkar inte finnas kvar...