[HowTo] Rotary encoder

Pagina: 1
Acties:
  • 4.491 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 25-04 15:08
Wat is een rotary encoder?
Een draaiknopje, waarbij 2 signalen, A en B, worden uitgestuurt als er aan het knopje wordt gedraaid. Dit werd bijvoorbeeld vroeger gebruikt in balletjesmuizen, om de beweging van de muis op te nemen, tegenwoordig vind je het vaak terug voor (digitale) volumeregeling op stereo's, en ook worden rotary encoders vaak gebruikt in robot's en dergerlijke, om draaisnelheid en richting in de gaten te houden.
Wat zijn die signalen dan, hoe weet je of ie voor of achteruit draait?
De signalen worden bij de simpele rotary encoders gegenereerd door een gemeenschappelijke pen C (die je aan de massa hangt) te verbinden (er zitten 2 schakelaartjes in) met 2 uitgangssignalen (die van een pull-up weerstand van ongeveer 5 à 10 KOhm voorzien zijn). Daardoor krijg je op A en B 2 signalen, die 90° in fase verschoven zijn. De aansluiting gebeurt dus door pen C aan de massa te hangen, en pen A en B via een weerstand naar de voedingsspanning die je gebruikt te verbinden. De signalen lees je dan af aan pen A en B.
Duurdere encoders zijn optisch, en werken zoals in een balletjesmuis (schijf met gaatje's, ledje aan ene kant en fototransistor aan de andere kant), bij deze heb je geen last van dender (zie verder beneden).

Er zijn 2 type's van rotary encoders, de ene zullen in 'idle' toestand (als je niet aan het draaien bent, met grijze streep aangeduid op onderstaande figuur) altijd geen verbinding geven (dus een '1'), de andere zijn bij 'idle' toestand beide signalen A en B op '1' of op '0' hebben (de onderste van de 2 op onderstaande figuur). Kijk dus even na in de datasheet hoe jou rotary encoder werkt.
Afbeeldingslocatie: http://crew.tweakers.net/naftebakje/RotEnc.gif
Hoe uitlezen?
Heel simpel, gebruik een microcontroller, of een specifiek IC. Met een specifiek IC hang je gewoon A en B aan het IC, en je krijgt de pulsjes en een signaal dat de draairichting aangeeft, zie hiervoor de datasheet.
Met een microcontroller kan je het best interrupts gebruiken. Een van de signalen (neem A uit de tekening) hang je aan een ingangspin die interrupts kan genereren bij verandering (interrupt on change), het ander signaal (B) hang je aan een gewone ingangspin. Als je een interrupt krijgt, controleer je of A en B gelijk zijn, zo ja draai je naar rechts toe in de tekening (A verandert, daarna zijn ze gelijk), als ze verschillen draai je naar links toe.
Ik wil een voorbeeldje
Onderstaand voorbeeld is voor PIC's, type maakt niet uit (interrupt on change moet aanwezig zijn op RB4), deze is geschreven in mikroBasic, en toont de waarde op een LCD scherm. Als je met microcontrollers bezig bent, zou je moeten in staat zijn het onderliggende ID te snappen (belangerijkste is de interrupt procerdure):
(let niet op "visual basic" hieronder, is enkel om de code gekleurd te krijgen)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'*
' * Project name: Rotary encoder
' * Description: Rotary encoder decoderen met interupts
' * Test configuration:
'     MCU:             PIC16F877A
'     Oscillator:      HS, 8.000 MHz
'     Aansluiting:     A naar RB4, B naar RB1
'     SW:              mikroBasic v5.0 or higher
' * NOTES:
'     LCD op PORTD
' *

program Rotary_encoder
dim temp as byte
dim txt as string[3]

sub procedure interrupt     ' Interrupt service routine
  If PORTB.4 = 1 then
  
'als je rot. enc. idle beide verbonden of beide niet verbonden heeft,
'moet je deze 4 regels gebruiken.
'    If PORTB.1 = 1 then
'      temp = temp + 1  ' A en B zijn gelijk
'    else
'      temp = temp - 1  ' A en B zijn niet gelijk
'    end if

  else
    If PORTB.1 = 1 then
      temp = temp - 1  ' A en B zijn niet gelijk
    else
      temp = temp + 1  ' A en B zijn gelijk
    end if
  end if
delay_ms(5)                     'enkel nodig bij mechanische rot.enc., ontdendering
INTCON.RBIF = 0             ' interrupt flag clearen
end sub

main:
  LCD_init(PORTD)        'LCD scherm inschakelen
  TRISB = %11111111      'PORTB.1 and .4 are inputs
  INTCON = %10001000     ' Enable interrupt on change
    
while 1=1            'endless loop
delay_ms(100)
bytetostr(temp,txt)  'omzetten van getalletje om op LCD te zetten
LCD_out(1,1,txt)
wend
end.

Wat zijn mogelijke problemen?
Maximaal toerental? Zonder de delay_ms(5) is de interrupt routine 44 instuctie's lang. Bij een kloksnelheid van 8MHz, bij PIC's delen door 4 voor de werkklok, duurt 1 instructie 0,5µs. Een interrupt duurt dus 22µs, de rest van je code moet ook nog draaien, dus mag de interrupt maar (als voorbeeld) de helft van de processortijd innemen, dus maximaal elke 44µs de interrupt. Dan mogen we maar 22727 interrupts per seconde hebben, bij een rot.enc. die per toer 30 pulsen geeft komen we op een maximaal toerental van 757 toeren per seconde.
Ontdendering Alle mechanische contacten (zoals in de simpele rotary encoders, duurdere optische modellen hebben dit niet) hebben last van dender. Als je een mechanisch contact sluit, zal er niet meteen perfecte elektrische verbinding zijn, er zal enkele keren wel/niet contact zijn tot hij stabiel op zijn instelling is, dat noemt men dender. Ook rotary encoders hebben dit, maar wel in beperkte mate (degene die bedoeld zijn om als knopje te dienen, hebben er last van, die om toerentallen op te pikken hebben nauwelijks/geen merkbare dender), in de datasheet staat meestal vermeld hoelang er dender is, en eventueel hoe je deze aanpakt.
Oplossing voor dender? Er zijn 2 mogelijke oplossingen, hardwarematig en softwarematig. Hardwarematig worden er gewoon enkele componentjes toegevoegd om de dender weg te werken. Het eenvoudigste is een RC filtertje, deze vertraagt de signalen in zoverre dat de snelle veranderingen tijdens het denderen volledig afgevlakt worden, google helpt je aan alle mogelijke verdere uitleg. Softwarematig zijn er ook een paar mogelijkheden, de eenvoudigste is het om gewoon een delay toe te voegen nadat je gedetecteerd hebt dat er een contact veranderd is. In de datasheet van een bepaalde rotary encoder staat dat deze maximaal 2ms dender geeft, door na elke overgang 3ms te wachten voor je de volgende begint te detecteren, voorkom je dat je de dender oppikt.


Aangezien men in het robot bouwen voor bewonderaars (beginners)-topic wat vraag naar rotary encoders heeft, heb ik even een voorstelletje gemaakt voor een HowTo.
Graag uw commentaren hieromtrent, is het niveau te eenvoudig (of te moeilijk), ontbreken er essentiële delen (of zijn er nog zaken die erbij horen), wat vinden jullie van het concept?

[ Voor 23% gewijzigd door naftebakje op 16-10-2006 23:01 ]

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:59

Onbekend

...

Er is 1 belangrijk punt nog niet genoemt.

De encoder mag niet te snel de pulsen afgeven. Als dat wel gebeurt, dan kan de PIC pulsen over het hoofd zien en dus niet meer de juiste positie aangeven.

Als de PIC op 8MHz draait, zal hij 2MiPS (2 miljoen instructies per seconde) doen.

Aangezien je minimaal 8 instructies nodig hebt om een interrupt af te handelen, betekent dat je maar 125.000 pulsen per seconde kan verwerken.

En nog iets: Een byte is maar 8 bits lang en kan maar 2^8 = 256 verschillende posities onthouden.

Als je op positie 255 staat, en je gaat 1 verder, dan is de waarde weer 0!

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 14-04 15:29

Sprite_tm

Semi-Chinees

Misschien wil je er nog even bij vermelden dat de contacten in rotary encoders als schakelaars werken, en dat je dus een pull-up-weerstand nodig hebt om er die mooie logische grafiekjes die je maakt, uit te halen?

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 25-04 15:08
@Ook onbekend: uitleg voor snelheid toegevoegd. Dat van de maximale waarde van een byte, lijkt me iets wat mensen die met microcontrollers bezig zijn zouden moeten weten. Het gaat er hier niet om wat ik exact doe in de voorbeeldcode, deze is er enkel om een voorbeeldje te geven hoe je zou kunnen een rotary encoder gebruiken.
@Sprite_tm: wat uitgebreid, ik dacht dat het duidelijk was :X

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 25-04 14:08

Atmoz

Techno!!

_/-\o_ Handig!!
Hier zal ik zeker wat aan hebben. De laatste keer dat ik met zo'n rotary encoder heb gewerkt kreeg ik hem namelijk niet helemaal netjes werkend. Als je naar links draaide (bijboorbeeld 15 "tikjes") dan zat er altijd wel 1x rechts bij...

Boven je code staat "Visual Basic". Heb je dat hiermee geschreven ofzo? Ik dacht dat VB alleen voor computer was.

Het vervelende aan de standaard rotary encoders vind ik dat ze erg "fragiel" of "gammel" zijn. Als je ergens (op een paneeltje ofzo) zo'n ding wilt maken dan zit het erg los en voelt niet erg solide aan. In tegenstelling tot versterkers waar die dingen natuurlijk ook in zitten. Daar voelen ze lekker stroef en stevig aan. Heeft iemand hier een idee op gevonden?

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 25-04 15:08
Die "visual basic" staat erbij omdat ik hem de code heb laten kleuren volgens het id van visual basic. Het programma is in Basic geschreven, das een taal, voor PC heb je visual basic, voor PIC's ken ik Ohonsoft PIC simulator IDE, MikroBasic, en Proton+ PICbasic. Ff verduidelijkt in de startpost.

De rotary encoder die ik heb, komt van www.voti.nl , ik vind hem stabiel en stevig genoeg.

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Ghannes
  • Registratie: Oktober 2002
  • Laatst online: 26-04 14:54
ah wel leuk zo'n topic
heb 2x zo'n ding uitgelezen
-met een modelportaalkraan (labview)
-een keer zat en encoder op een ander motortje en toen hebben we die met een 8051 uitgelezen.

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Je hebt het over 'schakelaartjes' en 'dender'... Maar de rotary encoders uit balmuizen werkten AFAIK optisch? Dan heb je toch geen last van dender lijkt me? :)

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 25-04 15:08
Osiris schreef op donderdag 12 oktober 2006 @ 16:44:
Je hebt het over 'schakelaartjes' en 'dender'... Maar de rotary encoders uit balmuizen werkten AFAIK optisch? Dan heb je toch geen last van dender lijkt me? :)
Stond al een beetje vermeld, nu expliciet erbij gezet.

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • kippy
  • Registratie: September 2004
  • Laatst online: 22:19
Scroll wiel van een muis is ook een roterry decoder. Heb deze zelf een keer ingelezen met een atmel. Et probleem met uitlezen van een scrol wiel is dat je meerster interupts krijgt.

Vraag me dus af of je dat hier niet bij hebt.

Voor de liefhebbers nog ff de code om je muis scroll wiel uit te lezen (alles lesgesoldeerd alleen het wiel uitlezen)
Uitlezen van scroll wheel van muis
Pagina: 1