Alex Pirciu
/
BFMC
a
src/Encoders/encoder.cpp@1:ceee5a608e7c, 2019-03-28 (annotated)
- Committer:
- alexpirciu
- Date:
- Thu Mar 28 07:44:42 2019 +0000
- Revision:
- 1:ceee5a608e7c
assa
Who changed what in which revision?
User | Revision | Line number | New 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 | } |