First Last / Encoder

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers encoder.cpp Source File

encoder.cpp

00001 
00002 #include "encoder.h"
00003 
00004 
00005 Encoder::Encoder(PinName int_a, PinName int_b, bool speed) : pin_a(int_a), pin_b(int_b)
00006 {
00007     m_speed_enabled = speed;
00008     if(m_speed_enabled)
00009         EncoderTimer.start();
00010     pin_a.fall(this,&Encoder::encoderFalling);
00011     pin_a.rise(this,&Encoder::encoderRising);
00012     m_position = 0;
00013     m_speed = 0;
00014     zero_speed = false;
00015 }
00016  
00017 void Encoder::encoderFalling(void)
00018 {
00019     //temporary speed storage, in case higher interrupt level does stuff
00020     float temp_speed=0;
00021     int motortime_now;
00022     if(m_speed_enabled)
00023     {
00024         motortime_now = EncoderTimer.read_us();
00025         EncoderTimer.reset();
00026         EncoderTimeout.attach(this,&Encoder::timeouthandler,0.1);
00027         /*calculate as ticks per second*/
00028         if(zero_speed)
00029             temp_speed  = 0;
00030         else
00031             temp_speed = 1000000./motortime_now;
00032         zero_speed = false;
00033     }
00034     if(pin_b)
00035     {
00036         m_position++;
00037         m_speed = temp_speed;
00038     }
00039     else
00040     {
00041         m_position--;    
00042         m_speed  = -temp_speed; //negative speed
00043     }
00044 }
00045 
00046 void Encoder::encoderRising(void)
00047 {
00048     //temporary speed storage, in case higher interrupt level does stuff
00049 
00050     float temp_speed=0;
00051     int motortime_now;
00052     if(m_speed_enabled)
00053     {
00054         EncoderTimer.reset();
00055         EncoderTimeout.attach(this,&Encoder::encoderFalling,0.1);
00056         /*calculate as ticks per second*/
00057         if(zero_speed)
00058             temp_speed  = 0;
00059         else
00060             temp_speed = 1000000./motortime_now;
00061         zero_speed = false;
00062     }
00063     if(pin_b)
00064     {
00065         m_position--;
00066         m_speed = -temp_speed; //negative speed
00067     }
00068     else
00069     {
00070         m_position++;    
00071         m_speed  = temp_speed; 
00072     }
00073 }
00074 
00075 void Encoder::timeouthandler(void)
00076 {
00077     m_speed  = 0;
00078     zero_speed = true;
00079 }