a

Dependencies:   mbed mbed-rtos

Committer:
alexpirciu
Date:
Thu Mar 28 07:44:42 2019 +0000
Revision:
1:ceee5a608e7c
assa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alexpirciu 1:ceee5a608e7c 1 /**
alexpirciu 1:ceee5a608e7c 2 ******************************************************************************
alexpirciu 1:ceee5a608e7c 3 * @file Encoder.cpp
alexpirciu 1:ceee5a608e7c 4 * @author RBRO/PJ-IU
alexpirciu 1:ceee5a608e7c 5 * @version V1.0.0
alexpirciu 1:ceee5a608e7c 6 * @date day-month-year
alexpirciu 1:ceee5a608e7c 7 * @brief This file contains the class implementations for the encoder
alexpirciu 1:ceee5a608e7c 8 * functionality.
alexpirciu 1:ceee5a608e7c 9 ******************************************************************************
alexpirciu 1:ceee5a608e7c 10 */
alexpirciu 1:ceee5a608e7c 11
alexpirciu 1:ceee5a608e7c 12 #include <Encoders/encoder.hpp>
alexpirciu 1:ceee5a608e7c 13
alexpirciu 1:ceee5a608e7c 14 /** \brief Constructor for the CCounter class
alexpirciu 1:ceee5a608e7c 15 *
alexpirciu 1:ceee5a608e7c 16 * Constructor method
alexpirciu 1:ceee5a608e7c 17 *
alexpirciu 1:ceee5a608e7c 18 * @param f_pin digital pin connected to encoder output
alexpirciu 1:ceee5a608e7c 19 */
alexpirciu 1:ceee5a608e7c 20 CCounter::CCounter(PinName f_pin)
alexpirciu 1:ceee5a608e7c 21 :m_interrupt(f_pin)
alexpirciu 1:ceee5a608e7c 22 ,m_count(0)
alexpirciu 1:ceee5a608e7c 23 {
alexpirciu 1:ceee5a608e7c 24 m_interrupt.rise(mbed::callback(CCounter::staticIncrement,this));
alexpirciu 1:ceee5a608e7c 25 m_interrupt.fall(mbed::callback(CCounter::staticIncrement,this));
alexpirciu 1:ceee5a608e7c 26 }
alexpirciu 1:ceee5a608e7c 27
alexpirciu 1:ceee5a608e7c 28 /** \brief Counter reset method
alexpirciu 1:ceee5a608e7c 29 *
alexpirciu 1:ceee5a608e7c 30 *
alexpirciu 1:ceee5a608e7c 31 *
alexpirciu 1:ceee5a608e7c 32 */
alexpirciu 1:ceee5a608e7c 33 void CCounter::reset(){
alexpirciu 1:ceee5a608e7c 34 m_count=0;
alexpirciu 1:ceee5a608e7c 35 }
alexpirciu 1:ceee5a608e7c 36
alexpirciu 1:ceee5a608e7c 37 /** \brief Counter increment method
alexpirciu 1:ceee5a608e7c 38 *
alexpirciu 1:ceee5a608e7c 39 *
alexpirciu 1:ceee5a608e7c 40 *
alexpirciu 1:ceee5a608e7c 41 */
alexpirciu 1:ceee5a608e7c 42 void CCounter::increment(){
alexpirciu 1:ceee5a608e7c 43 m_count++;
alexpirciu 1:ceee5a608e7c 44 }
alexpirciu 1:ceee5a608e7c 45
alexpirciu 1:ceee5a608e7c 46 /** \brief Get counts method
alexpirciu 1:ceee5a608e7c 47 *
alexpirciu 1:ceee5a608e7c 48 *
alexpirciu 1:ceee5a608e7c 49 * @return counts
alexpirciu 1:ceee5a608e7c 50 */
alexpirciu 1:ceee5a608e7c 51 int32_t CCounter::getCount(){
alexpirciu 1:ceee5a608e7c 52 return m_count;
alexpirciu 1:ceee5a608e7c 53 }
alexpirciu 1:ceee5a608e7c 54
alexpirciu 1:ceee5a608e7c 55 /** \brief Get counts method
alexpirciu 1:ceee5a608e7c 56 *
alexpirciu 1:ceee5a608e7c 57 * Method attaches the increment method to an object.
alexpirciu 1:ceee5a608e7c 58 *
alexpirciu 1:ceee5a608e7c 59 * @param obj object
alexpirciu 1:ceee5a608e7c 60 *
alexpirciu 1:ceee5a608e7c 61 */
alexpirciu 1:ceee5a608e7c 62 void CCounter::staticIncrement(void* obj){
alexpirciu 1:ceee5a608e7c 63 CCounter* self=static_cast<CCounter*>(obj);
alexpirciu 1:ceee5a608e7c 64 self->increment();
alexpirciu 1:ceee5a608e7c 65 }
alexpirciu 1:ceee5a608e7c 66
alexpirciu 1:ceee5a608e7c 67 /** \brief Constructor for the CEncoder class
alexpirciu 1:ceee5a608e7c 68 *
alexpirciu 1:ceee5a608e7c 69 * Constructor method
alexpirciu 1:ceee5a608e7c 70 *
alexpirciu 1:ceee5a608e7c 71 * @param f_period period value
alexpirciu 1:ceee5a608e7c 72 * @param f_period_sec period value in seconds
alexpirciu 1:ceee5a608e7c 73 * @param f_cpr counts per revolution (rise and fall edges)
alexpirciu 1:ceee5a608e7c 74 * @param f_pinName digital pin connected to encoder output
alexpirciu 1:ceee5a608e7c 75 */
alexpirciu 1:ceee5a608e7c 76 CEncoder::CEncoder(uint32_t f_period
alexpirciu 1:ceee5a608e7c 77 ,float f_period_sec
alexpirciu 1:ceee5a608e7c 78 ,uint32_t f_cpr
alexpirciu 1:ceee5a608e7c 79 ,PinName f_pinName)
alexpirciu 1:ceee5a608e7c 80 :task::CTask(f_period)
alexpirciu 1:ceee5a608e7c 81 ,m_counter(f_pinName)
alexpirciu 1:ceee5a608e7c 82 ,m_period_sec(f_period_sec)
alexpirciu 1:ceee5a608e7c 83 ,m_cpr(f_cpr)
alexpirciu 1:ceee5a608e7c 84 ,m_rps(0)
alexpirciu 1:ceee5a608e7c 85 {
alexpirciu 1:ceee5a608e7c 86 }
alexpirciu 1:ceee5a608e7c 87
alexpirciu 1:ceee5a608e7c 88 /** \brief Get rps method
alexpirciu 1:ceee5a608e7c 89 *
alexpirciu 1:ceee5a608e7c 90 * Returns the value of the rotations per second value
alexpirciu 1:ceee5a608e7c 91 *
alexpirciu 1:ceee5a608e7c 92 *
alexpirciu 1:ceee5a608e7c 93 * @return rps
alexpirciu 1:ceee5a608e7c 94 */
alexpirciu 1:ceee5a608e7c 95 float CEncoder::getSpeedRps()
alexpirciu 1:ceee5a608e7c 96 {
alexpirciu 1:ceee5a608e7c 97 return m_rps;
alexpirciu 1:ceee5a608e7c 98 }
alexpirciu 1:ceee5a608e7c 99
alexpirciu 1:ceee5a608e7c 100 /** \brief Get count
alexpirciu 1:ceee5a608e7c 101 *
alexpirciu 1:ceee5a608e7c 102 * Returns the value of the count
alexpirciu 1:ceee5a608e7c 103 *
alexpirciu 1:ceee5a608e7c 104 *
alexpirciu 1:ceee5a608e7c 105 * @return rps
alexpirciu 1:ceee5a608e7c 106 */
alexpirciu 1:ceee5a608e7c 107 int16_t CEncoder::getCount()
alexpirciu 1:ceee5a608e7c 108 {
alexpirciu 1:ceee5a608e7c 109 return m_rps*m_period_sec*m_cpr;
alexpirciu 1:ceee5a608e7c 110 }
alexpirciu 1:ceee5a608e7c 111
alexpirciu 1:ceee5a608e7c 112
alexpirciu 1:ceee5a608e7c 113
alexpirciu 1:ceee5a608e7c 114 /** \brief Run method
alexpirciu 1:ceee5a608e7c 115 *
alexpirciu 1:ceee5a608e7c 116 * Method executed at predefined time intervals.
alexpirciu 1:ceee5a608e7c 117 * Method called each f_period
alexpirciu 1:ceee5a608e7c 118 *
alexpirciu 1:ceee5a608e7c 119 *
alexpirciu 1:ceee5a608e7c 120 */
alexpirciu 1:ceee5a608e7c 121 void CEncoder::_run()
alexpirciu 1:ceee5a608e7c 122 {
alexpirciu 1:ceee5a608e7c 123 float l_count=m_counter.getCount();
alexpirciu 1:ceee5a608e7c 124 m_counter.reset();
alexpirciu 1:ceee5a608e7c 125 m_rps=l_count/m_period_sec/m_cpr;
alexpirciu 1:ceee5a608e7c 126 }
alexpirciu 1:ceee5a608e7c 127
alexpirciu 1:ceee5a608e7c 128 /** \brief Constructor for the CMagEncoderTime class
alexpirciu 1:ceee5a608e7c 129 *
alexpirciu 1:ceee5a608e7c 130 * Constructor method
alexpirciu 1:ceee5a608e7c 131 *
alexpirciu 1:ceee5a608e7c 132 * @param f_pin digital pin connected to encoder output
alexpirciu 1:ceee5a608e7c 133 */
alexpirciu 1:ceee5a608e7c 134 CMagEncoderTime::CMagEncoderTime(PinName f_pin)
alexpirciu 1:ceee5a608e7c 135 :m_interrupt(f_pin)
alexpirciu 1:ceee5a608e7c 136 {
alexpirciu 1:ceee5a608e7c 137 m_interrupt.rise(mbed::callback(CMagEncoderTime::staticRise,this));
alexpirciu 1:ceee5a608e7c 138 // m_interrupt.fall(mbed::callback(CMagEncoderTime::staticFall,this));
alexpirciu 1:ceee5a608e7c 139 m_Timer.start();
alexpirciu 1:ceee5a608e7c 140 }
alexpirciu 1:ceee5a608e7c 141
alexpirciu 1:ceee5a608e7c 142 /** \brief Callback method for rising edge interrupt
alexpirciu 1:ceee5a608e7c 143 *
alexpirciu 1:ceee5a608e7c 144 *
alexpirciu 1:ceee5a608e7c 145 */
alexpirciu 1:ceee5a608e7c 146 void CMagEncoderTime::riseCallback()
alexpirciu 1:ceee5a608e7c 147 {
alexpirciu 1:ceee5a608e7c 148 m_Timer.stop();
alexpirciu 1:ceee5a608e7c 149 m_lowTime=m_Timer.read();
alexpirciu 1:ceee5a608e7c 150 m_Timer.reset();
alexpirciu 1:ceee5a608e7c 151 m_Timer.start();
alexpirciu 1:ceee5a608e7c 152 }
alexpirciu 1:ceee5a608e7c 153
alexpirciu 1:ceee5a608e7c 154 /** \brief Callback method for rising edge interrupt
alexpirciu 1:ceee5a608e7c 155 *
alexpirciu 1:ceee5a608e7c 156 *
alexpirciu 1:ceee5a608e7c 157 */
alexpirciu 1:ceee5a608e7c 158 void CMagEncoderTime::fallCallback()
alexpirciu 1:ceee5a608e7c 159 {
alexpirciu 1:ceee5a608e7c 160 m_Timer.stop();
alexpirciu 1:ceee5a608e7c 161 m_highTime=m_Timer.read();
alexpirciu 1:ceee5a608e7c 162 m_Timer.reset();
alexpirciu 1:ceee5a608e7c 163 m_Timer.start();
alexpirciu 1:ceee5a608e7c 164 }
alexpirciu 1:ceee5a608e7c 165
alexpirciu 1:ceee5a608e7c 166 /** \brief Callback method for rising edge interrupt attached to pbject
alexpirciu 1:ceee5a608e7c 167 *
alexpirciu 1:ceee5a608e7c 168 * @param obj object
alexpirciu 1:ceee5a608e7c 169 */
alexpirciu 1:ceee5a608e7c 170 void CMagEncoderTime::staticRise(void* obj)
alexpirciu 1:ceee5a608e7c 171 {
alexpirciu 1:ceee5a608e7c 172 CMagEncoderTime* self=static_cast<CMagEncoderTime*>(obj);
alexpirciu 1:ceee5a608e7c 173 self->riseCallback();
alexpirciu 1:ceee5a608e7c 174 }
alexpirciu 1:ceee5a608e7c 175
alexpirciu 1:ceee5a608e7c 176 /** \brief Callback method for rising edge interrupt attached to pbject
alexpirciu 1:ceee5a608e7c 177 *
alexpirciu 1:ceee5a608e7c 178 * @param obj object
alexpirciu 1:ceee5a608e7c 179 * @return None
alexpirciu 1:ceee5a608e7c 180 */
alexpirciu 1:ceee5a608e7c 181 void CMagEncoderTime::staticFall(void* obj)
alexpirciu 1:ceee5a608e7c 182 {
alexpirciu 1:ceee5a608e7c 183 CMagEncoderTime* self=static_cast<CMagEncoderTime*>(obj);
alexpirciu 1:ceee5a608e7c 184 self->fallCallback();
alexpirciu 1:ceee5a608e7c 185 }
alexpirciu 1:ceee5a608e7c 186
alexpirciu 1:ceee5a608e7c 187 /** \brief Callback method for rising edge interrupt
alexpirciu 1:ceee5a608e7c 188 *
alexpirciu 1:ceee5a608e7c 189 *
alexpirciu 1:ceee5a608e7c 190 * @return High period value
alexpirciu 1:ceee5a608e7c 191 */
alexpirciu 1:ceee5a608e7c 192 float CMagEncoderTime::getHighTime()
alexpirciu 1:ceee5a608e7c 193 {
alexpirciu 1:ceee5a608e7c 194 return m_highTime;
alexpirciu 1:ceee5a608e7c 195 }
alexpirciu 1:ceee5a608e7c 196
alexpirciu 1:ceee5a608e7c 197 /** \brief Callback method for rising edge interrupt
alexpirciu 1:ceee5a608e7c 198 *
alexpirciu 1:ceee5a608e7c 199 * @return Low period value
alexpirciu 1:ceee5a608e7c 200 */
alexpirciu 1:ceee5a608e7c 201 float CMagEncoderTime::getLowTime()
alexpirciu 1:ceee5a608e7c 202 {
alexpirciu 1:ceee5a608e7c 203 return m_lowTime;
alexpirciu 1:ceee5a608e7c 204 }