Calculate Distance Using Rotary Encoder


Closed Thread
Results 1 to 18 of 18
  1. #1
    Join Date
    Nov 2005
    Posts
    19

    Default Calculate Distance Using Rotary Encoder

    Hi, I need help how to calculate distance using rotary encoder. I wanna show pulse in LCD.

    The rotary encoder spesification as follows:-

    Pulse/Revolution: 200 p/r
    output: 2 phase, A & B
    Micro C: PIC 16F877A, 4 MHz

    I try the code below, but I cannot see the pulse of rotation exactly.

    Code :


    Define LCD_DREG PORTD
    Define LCD_DBIT 4
    Define LCD_RSREG PORTE
    Define LCD_RSBIT 0
    Define LCD_EREG PORTE
    Define LCD_EBIT 1
    define PULSIN_MAX 200
    ADCON1 = 4 ' Set PortA 0, 1, 3 to A/D inputs

    pulse VAR BYTE

    loop:
    pulsin portd.2, 1, pulse
    Lcdout $fe, 1
    Lcdout #pulse
    Pause 1000

    GOTO loop

  2. #2
    Join Date
    Feb 2005
    Location
    Kolkata-India
    Posts
    563


    Did you find this post helpful? Yes | No

    Default Try to use interrupts rather

    Hi,

    You are using two time consuming statements , LCDOUT and pause. If your encoder generates pulse in this phase you would loose count. So it is best to set an interrupt and increment the value in ASM. I do this for my projects. (A particular application is a depth indicator on a old mine tub line). In fact you can also use instant basic interrupts (See Darrel's post on instant interrupts) to handle this in basic itself. It gives you fair amount of speed without the pain of asm.

    Good Luck

    Wishing the speedy recovery of our forum member steve who is hurt in a car accident.
    Best Regards
    Sougata

  3. #3
    Join Date
    Nov 2005
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    Sorry, I'm still not clear about using interupt. Please give me more details. TQ

  4. #4
    Join Date
    Feb 2005
    Location
    Kolkata-India
    Posts
    563


    Did you find this post helpful? Yes | No

    Default Post your exact problem

    Hi,

    What is the maximum expected rotation per second. And with your current setup what are you exactly experiencing.

    Regards

    Sougata

    Wishing a speedy recovery of our forum member Steve who is hurt in a car accident.

  5. #5
    Join Date
    Nov 2005
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    maximum rev / sec is 20 rps. I'm currently running a line tracer robot. I wanna know how far the robot can go. TQ

  6. #6
    Join Date
    Feb 2005
    Location
    Kolkata-India
    Posts
    563


    Did you find this post helpful? Yes | No

    Default Use Instant Interrupts by Darrel

    Hi,

    I understand that you are new to using interrupts but everybody has a first time so go ahead. This forum will always be beside you. Here http://www.picbasic.co.uk/forum/show...ant+Interrupts you will find more information. To learn more about how to setup the interrupts, read the datasheet carefully. Enable global interrupt and portb.0 interrupts (your encoder should be connected here), also set the Interrupt edge as per your encoder. Now when you are in the ISR just increment the counter variable. You should check overflow of your variable or use a comparison to increment a pulse/meter (another variable). It is sure you will find problems but do write some code and test.

    Good Luck

    Sougata

  7. #7
    Join Date
    Nov 2005
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    I try using this code. But only get forward and backward only. The value of pulse is totaly depend on rotation per second. How I need to maintain pulse / rotation regardless how fast I rotate the encoder. So the distance are varies depend on speed, although the distance is same. Please help



    DEFINE LOADER_USED 1

    ' Define LCD pins
    Define LCD_DREG PORTD
    Define LCD_DBIT 4
    Define LCD_RSREG PORTE
    Define LCD_RSBIT 0
    Define LCD_EREG PORTE
    Define LCD_EBIT 1
    define PULSIN_MAX 200
    ADCON1 = 4 ' Set PortA 0, 1, 3 to A/D inputs

    old var word
    new var word
    dir var byte
    cnt var word ' pulse/rotation

    Encoder: ' Routine to read rotary encoder
    old = PortB & %00000011 ' Read PortB.0 and PortB.1

    pause 2 ' Add some time between reads
    new = PortB & %00000011 ' Read PortB.0 and PortB.1


    if old = new then goto Encoder ' If old and new equal, read again

    old = old & %00000001 ' Only need PortB.0

    new = new >> 1 ' Only need PortB.1

    dir = old ^ new ' Dir equals PortB.0 XOR PortB.1

    If dir = 1 then ' If Dir = 1 then...
    cnt = cnt + 1 ' ...Count up
    else ' Otherwise
    cnt = cnt - 1 ' ...Count down
    endif ' End If statement
    Lcdout $fe, 1 ' Clear LCD screen
    Lcdout #cnt ' Display Hello
    Lcdout $fe,$C0, 1 ' Clear LCD screen
    Lcdout #dir
    pause 10
    goto encoder ' Do it forever (I hope)

    End

  8. #8
    Join Date
    Oct 2004
    Location
    Italy
    Posts
    695


    Did you find this post helpful? Yes | No

    Default

    Hi,

    See this thread.
    http://www.picbasic.co.uk/forum/showthread.php?t=1552

    Read all the posts first.

    Best regards,

    Luciano

  9. #9
    Join Date
    Nov 2005
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    I was so wonder by counter result is deferent. When I turn the encoder slower I get more count and when I turn the encoder faster I get less count. Count refers to variable cnt. Can someone explain?

    ------code--------------

    old var word
    new var word
    dir var byte
    cnt var word ' pulse/rotation

    Encoder: ' Routine to read rotary encoder
    old = PortB & %00000011 ' Read PortB.0 and PortB.1

    pause 2 ' Add some time between reads
    new = PortB & %00000011 ' Read PortB.0 and PortB.1


    if old = new then goto Encoder ' If old and new equal, read again

    old = old & %00000001 ' Only need PortB.0

    new = new >> 1 ' Only need PortB.1

    dir = old ^ new ' Dir equals PortB.0 XOR PortB.1

    If dir = 1 then ' If Dir = 1 then...
    cnt = cnt + 1 ' ...Count up
    else ' Otherwise
    cnt = cnt - 1 ' ...Count down
    endif ' End If statement
    Lcdout $fe, 1 ' Clear LCD screen
    Lcdout #cnt ' Display Hello
    Lcdout $fe,$C0, 1 ' Clear LCD screen
    Lcdout #dir
    pause 10
    goto encoder ' Do it forever (I hope)

    End

  10. #10
    Join Date
    Feb 2005
    Location
    Kolkata-India
    Posts
    563


    Did you find this post helpful? Yes | No

    Default Have read the asm examle by Luciano

    Hi there,

    When you are turning the rotary encoder slower you get good results:

    Reason : Your loop has enough time to "PAUSE" or "LCDOUT" and does not miss pulse.

    When you are turning the encoder faster:

    It is missing pulses while you are doing other tasks. It is always reliable to use an asm interrupt. No other way out perhaps.

    Regards

    Sougata

  11. #11
    Join Date
    Nov 2005
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by sougata
    Hi there,

    When you are turning the rotary encoder slower you get good results:

    Reason : Your loop has enough time to "PAUSE" or "LCDOUT" and does not miss pulse.

    When you are turning the encoder faster:

    It is missing pulses while you are doing other tasks. It is always reliable to use an asm interrupt. No other way out perhaps.

    Regards

    Sougata

    Can anybody tell me how to use ASM interupt. What are the advantages? TQ

  12. #12
    Join Date
    Feb 2005
    Location
    Kolkata-India
    Posts
    563


    Did you find this post helpful? Yes | No

    Default Can you post the full schematic

    Hi,

    I do not have a 16F877A lying around still I would try to one. I basically design with PIC18F452. The memory bank is different than 16F877A. At least I will try to simulate it.

    Regards

    Sougata

  13. #13
    Join Date
    Nov 2005
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    I think you can just post the code because I just wanna some idea....TQ

  14. #14


    Did you find this post helpful? Yes | No

    Default aliasing

    You need to UP your sample rate or use interrupts (on change) to prevent aliasing.

    If you MUST display the current values on an LCD, I believe you'll need to use interrupts as others have said.

    I'm currently working with an encoder with 50 slots, rotating at 1rps (200 positions per second in grey code) and need to sample at <1mS to ensure no errors. This is because there are no absolute guarantees that each of the 4 phases (codes) are equal in length, due to quality control issues with soldering and placement of the LEDs and Photodiodes. Thus, although technically you expect 200 codes per second in this scenario, "normal" oversampling rules dictate 2x that sampling rate, and the error factor that I'm encountering with component placement suggests 5x instead. If you cut your sampling time back, or miss one of these, it can result in an incorrect count.

    Thus you're pretty much bound to use interrupts: either on change, or on timer to sample (change is more efficient for obvious reasons).

    -------------Picster-----------------------

  15. #15
    Join Date
    May 2012
    Posts
    2


    Did you find this post helpful? Yes | No

    Default Re: Calculate Distance Using Rotary Encoder

    Please help me....
    I have a encoder of 1024 PPR and i want to have a Calculation of RPM.... Gear Ration is 150:1
    Please help me with

  16. #16
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,611


    Did you find this post helpful? Yes | No

    Default Re: Calculate Distance Using Rotary Encoder

    Hi, Rishab - ( Bashir ! )

    It's quite simple : distance is number of pulses, multiplied by perimeter of the wheel, multiplied by 150 and divided by 1024 ...

    no, no ... no need any thanks .

    any other Homework to give us ???

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  17. #17
    Join Date
    May 2012
    Posts
    2


    Did you find this post helpful? Yes | No

    Default Re: Calculate Distance Using Rotary Encoder

    Thanks a Lot but m Using Modicon PLC m218 and need to configure HSC counter for that also i need to convert it to MM for the movement of motor please help if you can!!!

  18. #18
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,611


    Did you find this post helpful? Yes | No

    Default Re: Calculate Distance Using Rotary Encoder

    Are you very sure you are on the right forum ???

    Here it is the Picbasic Pro for Microchip PICs forum ... not "abcelectronique" with the great and unique " Doudi" san ...

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

Similar Threads

  1. Quadrature encoder and ASM Interrupts. questions..
    By godfodder in forum mel PIC BASIC Pro
    Replies: 10
    Last Post: - 17th March 2013, 15:45
  2. Rotary encoder help (not 'counting steps)
    By Elnino in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 26th October 2009, 23:03
  3. encoder wowes
    By wallaby in forum mel PIC BASIC Pro
    Replies: 16
    Last Post: - 6th December 2005, 22:56
  4. Farnell's Rotary Encoder 733-726
    By crematory in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 12th October 2005, 14:51
  5. Automotive quality rotary encoder
    By d1camero in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 8th October 2004, 16:46

Members who have read this thread : 2

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts