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 * @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