Library to read out speed and position from a quadrature encoder. This library uses X2 decoding.

Dependents:   BMT-K9_encoder BMT-K9-Regelaar K9motoraansturing_copy EMGverwerking ... more

Committer:
vsluiter
Date:
Mon Sep 29 15:45:09 2014 +0000
Revision:
3:dcb7bdc73882
Parent:
0:c90b36abcbf8
Child:
4:69be34f39c9f
Changed to make speed readout optional

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:c90b36abcbf8 1
vsluiter 0:c90b36abcbf8 2 #include "encoder.h"
vsluiter 0:c90b36abcbf8 3
vsluiter 3:dcb7bdc73882 4 Encoder::Encoder(PinName int_a, PinName int_b, bool speed=false) : pin_a(int_a), pin_b(int_b)
vsluiter 0:c90b36abcbf8 5 {
vsluiter 3:dcb7bdc73882 6 m_speed_enabled = speed;
vsluiter 3:dcb7bdc73882 7 if(m_speed_enabled)
vsluiter 3:dcb7bdc73882 8 EncoderTimer.start();
vsluiter 0:c90b36abcbf8 9 pin_a.fall(this,&Encoder::encoderFalling);
vsluiter 0:c90b36abcbf8 10 pin_a.rise(this,&Encoder::encoderRising);
vsluiter 0:c90b36abcbf8 11 m_position = 0;
vsluiter 0:c90b36abcbf8 12 m_speed = 0;
vsluiter 0:c90b36abcbf8 13 zero_speed = false;
vsluiter 0:c90b36abcbf8 14 }
vsluiter 0:c90b36abcbf8 15
vsluiter 0:c90b36abcbf8 16 void Encoder::encoderFalling(void)
vsluiter 0:c90b36abcbf8 17 {
vsluiter 0:c90b36abcbf8 18 //temporary speed storage, in case higher interrupt level does stuff
vsluiter 3:dcb7bdc73882 19 float temp_speed=0;
vsluiter 3:dcb7bdc73882 20 int motortime_now
vsluiter 3:dcb7bdc73882 21 if(m_speed_enabled)
vsluiter 3:dcb7bdc73882 22 {
vsluiter 3:dcb7bdc73882 23 motortime_now = EncoderTimer.read_us();
vsluiter 3:dcb7bdc73882 24 EncoderTimer.reset();
vsluiter 3:dcb7bdc73882 25 EncoderTimeout.attach(this,&Encoder::timeouthandler,0.1);
vsluiter 3:dcb7bdc73882 26 /*calculate as ticks per second*/
vsluiter 3:dcb7bdc73882 27 if(zero_speed)
vsluiter 3:dcb7bdc73882 28 temp_speed = 0;
vsluiter 3:dcb7bdc73882 29 else
vsluiter 3:dcb7bdc73882 30 temp_speed = 1000000./motortime_now;
vsluiter 3:dcb7bdc73882 31 zero_speed = false;
vsluiter 3:dcb7bdc73882 32 }
vsluiter 0:c90b36abcbf8 33 if(pin_b)
vsluiter 0:c90b36abcbf8 34 {
vsluiter 0:c90b36abcbf8 35 m_position++;
vsluiter 0:c90b36abcbf8 36 m_speed = temp_speed;
vsluiter 0:c90b36abcbf8 37 }
vsluiter 0:c90b36abcbf8 38 else
vsluiter 0:c90b36abcbf8 39 {
vsluiter 0:c90b36abcbf8 40 m_position--;
vsluiter 0:c90b36abcbf8 41 m_speed = -temp_speed; //negative speed
vsluiter 0:c90b36abcbf8 42 }
vsluiter 0:c90b36abcbf8 43 }
vsluiter 0:c90b36abcbf8 44
vsluiter 0:c90b36abcbf8 45 void Encoder::encoderRising(void)
vsluiter 0:c90b36abcbf8 46 {
vsluiter 0:c90b36abcbf8 47 //temporary speed storage, in case higher interrupt level does stuff
vsluiter 3:dcb7bdc73882 48 float temp_speed=0;
vsluiter 3:dcb7bdc73882 49 int motortime_now;
vsluiter 3:dcb7bdc73882 50 if(m_speed_enabled)
vsluiter 3:dcb7bdc73882 51 {
vsluiter 3:dcb7bdc73882 52 EncoderTimer.reset();
vsluiter 3:dcb7bdc73882 53 EncoderTimeout.attach(this,&Encoder::encoderFalling,0.1);
vsluiter 3:dcb7bdc73882 54 /*calculate as ticks per second*/
vsluiter 3:dcb7bdc73882 55 if(zero_speed)
vsluiter 3:dcb7bdc73882 56 temp_speed = 0;
vsluiter 3:dcb7bdc73882 57 else
vsluiter 3:dcb7bdc73882 58 temp_speed = 1000000./motortime_now;
vsluiter 3:dcb7bdc73882 59 zero_speed = false;
vsluiter 3:dcb7bdc73882 60 }
vsluiter 3:dcb7bdc73882 61
vsluiter 0:c90b36abcbf8 62 if(pin_b)
vsluiter 0:c90b36abcbf8 63 {
vsluiter 0:c90b36abcbf8 64 m_position--;
vsluiter 0:c90b36abcbf8 65 m_speed = -temp_speed; //negative speed
vsluiter 0:c90b36abcbf8 66 }
vsluiter 0:c90b36abcbf8 67 else
vsluiter 0:c90b36abcbf8 68 {
vsluiter 0:c90b36abcbf8 69 m_position++;
vsluiter 0:c90b36abcbf8 70 m_speed = temp_speed;
vsluiter 0:c90b36abcbf8 71 }
vsluiter 0:c90b36abcbf8 72 }
vsluiter 0:c90b36abcbf8 73
vsluiter 0:c90b36abcbf8 74 void Encoder::timeouthandler(void)
vsluiter 0:c90b36abcbf8 75 {
vsluiter 0:c90b36abcbf8 76 m_speed = 0;
vsluiter 0:c90b36abcbf8 77 zero_speed = true;
vsluiter 0:c90b36abcbf8 78 }