It is based on https://developer.mbed.org/users/gregeric/code/Nucleo_Hello_Encoder/
rotary_encoder_abz_phase/rotary_encoder_abz_phase.cpp@3:65021ea3fae5, 2016-03-31 (annotated)
- Committer:
- inst
- Date:
- Thu Mar 31 04:42:31 2016 +0000
- Revision:
- 3:65021ea3fae5
- Parent:
- 2:4580c3869b7b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
inst | 0:caf1d0bc4b90 | 1 | #include "mbed.h" |
inst | 0:caf1d0bc4b90 | 2 | #include "rotary_encoder_abz_phase.hpp" |
inst | 0:caf1d0bc4b90 | 3 | #include "rotary_encoder_base.hpp" |
inst | 0:caf1d0bc4b90 | 4 | |
inst | 2:4580c3869b7b | 5 | namespace mbed_stl { |
inst | 2:4580c3869b7b | 6 | |
inst | 0:caf1d0bc4b90 | 7 | rotary_encoder_abz_phase::rotary_encoder_abz_phase(TIM_TypeDef* timer_type, PinName z_pin, size_t resolution) : |
inst | 0:caf1d0bc4b90 | 8 | rotary_encoder_base(timer_type, TIM_ENCODERMODE_TI12, resolution), |
inst | 0:caf1d0bc4b90 | 9 | z_phase_intr_(z_pin), |
inst | 0:caf1d0bc4b90 | 10 | counts_in_prev_intr_(0) { |
inst | 0:caf1d0bc4b90 | 11 | z_phase_intr_.fall(this, &rotary_encoder_abz_phase::intr_z_phase_first); |
inst | 0:caf1d0bc4b90 | 12 | } |
inst | 0:caf1d0bc4b90 | 13 | |
inst | 0:caf1d0bc4b90 | 14 | int32_t rotary_encoder_abz_phase::get_counts() const { |
inst | 3:65021ea3fae5 | 15 | int32_t counts = timer_handler_.Instance->CNT; |
inst | 0:caf1d0bc4b90 | 16 | |
inst | 0:caf1d0bc4b90 | 17 | if (counts > (max_counts_ >> 1)) { |
inst | 0:caf1d0bc4b90 | 18 | return counts - max_counts_; |
inst | 0:caf1d0bc4b90 | 19 | } |
inst | 0:caf1d0bc4b90 | 20 | return counts; |
inst | 0:caf1d0bc4b90 | 21 | } |
inst | 0:caf1d0bc4b90 | 22 | |
inst | 0:caf1d0bc4b90 | 23 | void rotary_encoder_abz_phase::intr_z_phase_first() { |
inst | 3:65021ea3fae5 | 24 | counts_in_prev_intr_ = timer_handler_.Instance->CNT; |
inst | 0:caf1d0bc4b90 | 25 | z_phase_intr_.fall(this, &rotary_encoder_abz_phase::intr_z_phase); |
inst | 0:caf1d0bc4b90 | 26 | } |
inst | 0:caf1d0bc4b90 | 27 | |
inst | 0:caf1d0bc4b90 | 28 | void rotary_encoder_abz_phase::intr_z_phase() { |
inst | 3:65021ea3fae5 | 29 | uint32_t counts = timer_handler_.Instance->CNT; |
inst | 0:caf1d0bc4b90 | 30 | // Z相の割り込みが入る時は、前回とのカウントの差は分解能で割り切れるはず |
inst | 0:caf1d0bc4b90 | 31 | int64_t error = (counts - counts_in_prev_intr_) % resolution_; |
inst | 3:65021ea3fae5 | 32 | timer_handler_.Instance->CNT -= error; |
inst | 0:caf1d0bc4b90 | 33 | |
inst | 0:caf1d0bc4b90 | 34 | counts_in_prev_intr_ = counts; |
inst | 0:caf1d0bc4b90 | 35 | } |
inst | 0:caf1d0bc4b90 | 36 | |
inst | 0:caf1d0bc4b90 | 37 | void rotary_encoder_abz_phase::reset() { |
inst | 0:caf1d0bc4b90 | 38 | counts_in_prev_intr_ = 0; |
inst | 3:65021ea3fae5 | 39 | timer_handler_.Instance->CNT = 0; |
inst | 0:caf1d0bc4b90 | 40 | } |
inst | 2:4580c3869b7b | 41 | |
inst | 2:4580c3869b7b | 42 | } /* namespace mbed_stl */ |