Alex Pirciu
/
BFMC
a
src/Encoders/quadratureencodertask.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 | * @file quadratureencodertask.cpp |
alexpirciu | 1:ceee5a608e7c | 3 | * @author RBRO/PJ-IU |
alexpirciu | 1:ceee5a608e7c | 4 | * @brief |
alexpirciu | 1:ceee5a608e7c | 5 | * @version 0.1 |
alexpirciu | 1:ceee5a608e7c | 6 | * @date 2018-10-23 |
alexpirciu | 1:ceee5a608e7c | 7 | * |
alexpirciu | 1:ceee5a608e7c | 8 | * @copyright Copyright (c) 2018 |
alexpirciu | 1:ceee5a608e7c | 9 | * |
alexpirciu | 1:ceee5a608e7c | 10 | */ |
alexpirciu | 1:ceee5a608e7c | 11 | #include <Encoders/Quadratureencodertask.hpp> |
alexpirciu | 1:ceee5a608e7c | 12 | |
alexpirciu | 1:ceee5a608e7c | 13 | |
alexpirciu | 1:ceee5a608e7c | 14 | namespace encoders{ |
alexpirciu | 1:ceee5a608e7c | 15 | |
alexpirciu | 1:ceee5a608e7c | 16 | |
alexpirciu | 1:ceee5a608e7c | 17 | |
alexpirciu | 1:ceee5a608e7c | 18 | /** |
alexpirciu | 1:ceee5a608e7c | 19 | * @brief Construct a new CQuadratureEncoderTask::CQuadratureEncoderTask object |
alexpirciu | 1:ceee5a608e7c | 20 | * |
alexpirciu | 1:ceee5a608e7c | 21 | * @param f_period_sec Period of the task |
alexpirciu | 1:ceee5a608e7c | 22 | * @param f_Quadratureencoder The counter object |
alexpirciu | 1:ceee5a608e7c | 23 | * @param f_resolution The resolution of the rotation encoder. (Cpr count per revolution) |
alexpirciu | 1:ceee5a608e7c | 24 | */ |
alexpirciu | 1:ceee5a608e7c | 25 | CQuadratureEncoderTask::CQuadratureEncoderTask( float f_period_sec |
alexpirciu | 1:ceee5a608e7c | 26 | ,encoders::CQuadratureEncoder_TIMX* f_Quadratureencoder |
alexpirciu | 1:ceee5a608e7c | 27 | ,uint16_t f_resolution) |
alexpirciu | 1:ceee5a608e7c | 28 | :m_Quadratureencoder(f_Quadratureencoder) |
alexpirciu | 1:ceee5a608e7c | 29 | ,m_taskperiod_s(f_period_sec) |
alexpirciu | 1:ceee5a608e7c | 30 | ,m_resolution(f_resolution) |
alexpirciu | 1:ceee5a608e7c | 31 | ,m_timer(mbed::callback(CQuadratureEncoderTask::static_callback,this)) |
alexpirciu | 1:ceee5a608e7c | 32 | { |
alexpirciu | 1:ceee5a608e7c | 33 | } |
alexpirciu | 1:ceee5a608e7c | 34 | |
alexpirciu | 1:ceee5a608e7c | 35 | |
alexpirciu | 1:ceee5a608e7c | 36 | /** |
alexpirciu | 1:ceee5a608e7c | 37 | * @brief Start the RosTimer to periodically apply the _run function. |
alexpirciu | 1:ceee5a608e7c | 38 | * |
alexpirciu | 1:ceee5a608e7c | 39 | */ |
alexpirciu | 1:ceee5a608e7c | 40 | void CQuadratureEncoderTask::startTimer(){ |
alexpirciu | 1:ceee5a608e7c | 41 | m_timer.start(static_cast<int>(m_taskperiod_s*1000)); |
alexpirciu | 1:ceee5a608e7c | 42 | } |
alexpirciu | 1:ceee5a608e7c | 43 | |
alexpirciu | 1:ceee5a608e7c | 44 | |
alexpirciu | 1:ceee5a608e7c | 45 | /** |
alexpirciu | 1:ceee5a608e7c | 46 | * @brief The private run function, which will be applied periodically. |
alexpirciu | 1:ceee5a608e7c | 47 | * |
alexpirciu | 1:ceee5a608e7c | 48 | */ |
alexpirciu | 1:ceee5a608e7c | 49 | void CQuadratureEncoderTask::_run(){ |
alexpirciu | 1:ceee5a608e7c | 50 | m_encoderCnt = m_Quadratureencoder->getCount(); |
alexpirciu | 1:ceee5a608e7c | 51 | m_Quadratureencoder->reset(); |
alexpirciu | 1:ceee5a608e7c | 52 | } |
alexpirciu | 1:ceee5a608e7c | 53 | /** |
alexpirciu | 1:ceee5a608e7c | 54 | * @brief Static callback function for applying the run function. |
alexpirciu | 1:ceee5a608e7c | 55 | * |
alexpirciu | 1:ceee5a608e7c | 56 | * @param obj CQuadratureEncoderTask object |
alexpirciu | 1:ceee5a608e7c | 57 | */ |
alexpirciu | 1:ceee5a608e7c | 58 | void CQuadratureEncoderTask::static_callback(void* obj){ |
alexpirciu | 1:ceee5a608e7c | 59 | CQuadratureEncoderTask* self = static_cast<CQuadratureEncoderTask*>(obj); |
alexpirciu | 1:ceee5a608e7c | 60 | self->_run(); |
alexpirciu | 1:ceee5a608e7c | 61 | } |
alexpirciu | 1:ceee5a608e7c | 62 | |
alexpirciu | 1:ceee5a608e7c | 63 | /** |
alexpirciu | 1:ceee5a608e7c | 64 | * @brief Getter function for counted value. |
alexpirciu | 1:ceee5a608e7c | 65 | * |
alexpirciu | 1:ceee5a608e7c | 66 | * @return int16_t counted impulse |
alexpirciu | 1:ceee5a608e7c | 67 | */ |
alexpirciu | 1:ceee5a608e7c | 68 | int16_t CQuadratureEncoderTask::getCount(){ |
alexpirciu | 1:ceee5a608e7c | 69 | return m_encoderCnt; |
alexpirciu | 1:ceee5a608e7c | 70 | } |
alexpirciu | 1:ceee5a608e7c | 71 | /** |
alexpirciu | 1:ceee5a608e7c | 72 | * @brief Getter function for the rotation per second |
alexpirciu | 1:ceee5a608e7c | 73 | * |
alexpirciu | 1:ceee5a608e7c | 74 | * @return rotation speed (rotation per second) |
alexpirciu | 1:ceee5a608e7c | 75 | */ |
alexpirciu | 1:ceee5a608e7c | 76 | |
alexpirciu | 1:ceee5a608e7c | 77 | float CQuadratureEncoderTask::getSpeedRps(){ |
alexpirciu | 1:ceee5a608e7c | 78 | return static_cast<float>(m_encoderCnt)/ m_resolution / m_taskperiod_s; |
alexpirciu | 1:ceee5a608e7c | 79 | } |
alexpirciu | 1:ceee5a608e7c | 80 | |
alexpirciu | 1:ceee5a608e7c | 81 | /** |
alexpirciu | 1:ceee5a608e7c | 82 | * @brief Construct a new CQuadratureEncoderWithFilterTask::CQuadratureEncoderWithFilterTask object |
alexpirciu | 1:ceee5a608e7c | 83 | * |
alexpirciu | 1:ceee5a608e7c | 84 | * @param f_period_sec Period of the task |
alexpirciu | 1:ceee5a608e7c | 85 | * @param f_Quadratureencoder The counter object |
alexpirciu | 1:ceee5a608e7c | 86 | * @param f_resolution The resolution of the rotation encoder. (Cpr count per revolution) |
alexpirciu | 1:ceee5a608e7c | 87 | * @param f_filter The reference to the filter. |
alexpirciu | 1:ceee5a608e7c | 88 | */ |
alexpirciu | 1:ceee5a608e7c | 89 | CQuadratureEncoderWithFilterTask::CQuadratureEncoderWithFilterTask( float f_period_sec |
alexpirciu | 1:ceee5a608e7c | 90 | ,encoders::CQuadratureEncoder_TIMX* f_Quadratureencoder |
alexpirciu | 1:ceee5a608e7c | 91 | ,uint16_t f_resolution |
alexpirciu | 1:ceee5a608e7c | 92 | ,filter::CFilterFunction<float>& f_filter) |
alexpirciu | 1:ceee5a608e7c | 93 | :CQuadratureEncoderTask(f_period_sec,f_Quadratureencoder,f_resolution) |
alexpirciu | 1:ceee5a608e7c | 94 | ,m_filter(f_filter) |
alexpirciu | 1:ceee5a608e7c | 95 | { |
alexpirciu | 1:ceee5a608e7c | 96 | } |
alexpirciu | 1:ceee5a608e7c | 97 | |
alexpirciu | 1:ceee5a608e7c | 98 | /** |
alexpirciu | 1:ceee5a608e7c | 99 | * @brief Private run method for getting the value from the counter, reseting it. In the last step it filters the readed values. |
alexpirciu | 1:ceee5a608e7c | 100 | * |
alexpirciu | 1:ceee5a608e7c | 101 | */ |
alexpirciu | 1:ceee5a608e7c | 102 | void CQuadratureEncoderWithFilterTask::_run(){ |
alexpirciu | 1:ceee5a608e7c | 103 | m_encoderCnt = m_Quadratureencoder->getCount(); |
alexpirciu | 1:ceee5a608e7c | 104 | m_Quadratureencoder->reset(); |
alexpirciu | 1:ceee5a608e7c | 105 | float temp = m_encoderCnt; |
alexpirciu | 1:ceee5a608e7c | 106 | m_encoderCntFiltered = static_cast<int16_t>(m_filter(temp)); |
alexpirciu | 1:ceee5a608e7c | 107 | |
alexpirciu | 1:ceee5a608e7c | 108 | } |
alexpirciu | 1:ceee5a608e7c | 109 | |
alexpirciu | 1:ceee5a608e7c | 110 | /** |
alexpirciu | 1:ceee5a608e7c | 111 | * @brief Getter function for the last filtered value. |
alexpirciu | 1:ceee5a608e7c | 112 | * |
alexpirciu | 1:ceee5a608e7c | 113 | */ |
alexpirciu | 1:ceee5a608e7c | 114 | int16_t CQuadratureEncoderWithFilterTask::getCount(){ |
alexpirciu | 1:ceee5a608e7c | 115 | return m_encoderCntFiltered; |
alexpirciu | 1:ceee5a608e7c | 116 | } |
alexpirciu | 1:ceee5a608e7c | 117 | |
alexpirciu | 1:ceee5a608e7c | 118 | /** |
alexpirciu | 1:ceee5a608e7c | 119 | * @brief Getter function for the last filtered rotation speed. |
alexpirciu | 1:ceee5a608e7c | 120 | * |
alexpirciu | 1:ceee5a608e7c | 121 | */ |
alexpirciu | 1:ceee5a608e7c | 122 | float CQuadratureEncoderWithFilterTask::getSpeedRps(){ |
alexpirciu | 1:ceee5a608e7c | 123 | return static_cast<double>(m_encoderCntFiltered)/m_resolution / m_taskperiod_s; |
alexpirciu | 1:ceee5a608e7c | 124 | |
alexpirciu | 1:ceee5a608e7c | 125 | } |
alexpirciu | 1:ceee5a608e7c | 126 | |
alexpirciu | 1:ceee5a608e7c | 127 | /** |
alexpirciu | 1:ceee5a608e7c | 128 | * @brief Getter function for the last non-filtered value. |
alexpirciu | 1:ceee5a608e7c | 129 | * |
alexpirciu | 1:ceee5a608e7c | 130 | */ |
alexpirciu | 1:ceee5a608e7c | 131 | int16_t CQuadratureEncoderWithFilterTask::getNonFilteredCount(){ |
alexpirciu | 1:ceee5a608e7c | 132 | return m_encoderCntFiltered; |
alexpirciu | 1:ceee5a608e7c | 133 | } |
alexpirciu | 1:ceee5a608e7c | 134 | |
alexpirciu | 1:ceee5a608e7c | 135 | /** |
alexpirciu | 1:ceee5a608e7c | 136 | * @brief Getter function for the last non-filtered rotation speed. |
alexpirciu | 1:ceee5a608e7c | 137 | * |
alexpirciu | 1:ceee5a608e7c | 138 | */ |
alexpirciu | 1:ceee5a608e7c | 139 | float CQuadratureEncoderWithFilterTask::getNonFilteredSpeedRps(){ |
alexpirciu | 1:ceee5a608e7c | 140 | return static_cast<double>(m_encoderCntFiltered)/m_resolution / m_taskperiod_s; |
alexpirciu | 1:ceee5a608e7c | 141 | |
alexpirciu | 1:ceee5a608e7c | 142 | } |
alexpirciu | 1:ceee5a608e7c | 143 | |
alexpirciu | 1:ceee5a608e7c | 144 | |
alexpirciu | 1:ceee5a608e7c | 145 | }; // namespace encoders |