動作確認済み
GMD_impl.hpp@10:2fa9eeafd727, 2016-08-25 (annotated)
- Committer:
- inst
- Date:
- Thu Aug 25 04:59:47 2016 +0000
- Revision:
- 10:2fa9eeafd727
- Parent:
- 9:0d8dbe2671cd
????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
inst | 1:b85088467ae0 | 1 | #include <algorithm> |
inst | 1:b85088467ae0 | 2 | #include "GMD.hpp" |
inst | 1:b85088467ae0 | 3 | |
inst | 1:b85088467ae0 | 4 | template <size_t MIN, size_t MAX> |
inst | 1:b85088467ae0 | 5 | const float GMD<MIN, MAX>::_frequency_to_tick_coeff = 3300.0f; |
inst | 1:b85088467ae0 | 6 | |
inst | 1:b85088467ae0 | 7 | template <size_t MIN, size_t MAX> |
inst | 5:b3c1c5db8489 | 8 | const uint32_t GMD<MIN, MAX>::_default_frequency_kHz = 20; |
inst | 1:b85088467ae0 | 9 | |
inst | 1:b85088467ae0 | 10 | template <size_t MIN, size_t MAX> |
inst | 10:2fa9eeafd727 | 11 | const float GMD<MIN, MAX>::_threshold = 0.02f; |
inst | 10:2fa9eeafd727 | 12 | |
inst | 10:2fa9eeafd727 | 13 | template <size_t MIN, size_t MAX> |
inst | 1:b85088467ae0 | 14 | GMD<MIN, MAX>::GMD(PinName p0, PinName p1, PinName shut_down) : _shut_down(shut_down, 1) { |
inst | 1:b85088467ae0 | 15 | _pwm[0] = new FastPWM(p0); |
inst | 1:b85088467ae0 | 16 | _pwm[1] = new FastPWM(p1); |
inst | 1:b85088467ae0 | 17 | |
inst | 4:aa4eca6acb60 | 18 | _pwm[0]->write(0.0f); |
inst | 4:aa4eca6acb60 | 19 | _pwm[1]->write(0.0f); |
inst | 4:aa4eca6acb60 | 20 | |
inst | 1:b85088467ae0 | 21 | set_frequency_kHz(_default_frequency_kHz); |
inst | 1:b85088467ae0 | 22 | } |
inst | 1:b85088467ae0 | 23 | |
inst | 1:b85088467ae0 | 24 | template <size_t MIN, size_t MAX> |
inst | 1:b85088467ae0 | 25 | void GMD<MIN, MAX>::set_frequency_kHz(float f_kHz) { |
inst | 1:b85088467ae0 | 26 | _pwm[0]->period_ticks(_frequency_to_tick_coeff / f_kHz); |
inst | 1:b85088467ae0 | 27 | _pwm[1]->period_ticks(_frequency_to_tick_coeff / f_kHz); |
inst | 1:b85088467ae0 | 28 | } |
inst | 1:b85088467ae0 | 29 | |
inst | 2:3d70888e91c6 | 30 | float sign(float n) { |
inst | 2:3d70888e91c6 | 31 | if (n < 0.0f) { |
inst | 1:b85088467ae0 | 32 | return -1.0f; |
inst | 1:b85088467ae0 | 33 | } |
inst | 1:b85088467ae0 | 34 | return 1.0f; |
inst | 1:b85088467ae0 | 35 | } |
inst | 1:b85088467ae0 | 36 | |
inst | 1:b85088467ae0 | 37 | template <size_t MIN, size_t MAX> |
inst | 1:b85088467ae0 | 38 | float GMD<MIN, MAX>::set(float p) { |
inst | 10:2fa9eeafd727 | 39 | if (abs(p) < _threshold) { |
inst | 10:2fa9eeafd727 | 40 | _pwm[0]->write(0.0f); |
inst | 10:2fa9eeafd727 | 41 | _pwm[1]->write(0.0f); |
inst | 10:2fa9eeafd727 | 42 | _shut_down = 1; |
inst | 10:2fa9eeafd727 | 43 | return p; |
inst | 10:2fa9eeafd727 | 44 | } |
inst | 10:2fa9eeafd727 | 45 | |
inst | 1:b85088467ae0 | 46 | p = std::max(-1.0f, std::min(p, 1.0f)); |
inst | 2:3d70888e91c6 | 47 | |
inst | 2:3d70888e91c6 | 48 | p = (abs(p) * (MAX - MIN) + MIN) * sign(p); |
inst | 1:b85088467ae0 | 49 | p *= 0.01f; |
inst | 1:b85088467ae0 | 50 | |
inst | 1:b85088467ae0 | 51 | if (p < 0.0f) { |
inst | 2:3d70888e91c6 | 52 | _pwm[0]->write(-p); |
inst | 1:b85088467ae0 | 53 | _pwm[1]->write(0.0f); |
inst | 1:b85088467ae0 | 54 | } else { |
inst | 1:b85088467ae0 | 55 | _pwm[0]->write(0.0f); |
inst | 1:b85088467ae0 | 56 | _pwm[1]->write(p); |
inst | 1:b85088467ae0 | 57 | } |
inst | 1:b85088467ae0 | 58 | _shut_down = 1; |
inst | 1:b85088467ae0 | 59 | return p; |
inst | 1:b85088467ae0 | 60 | } |
inst | 1:b85088467ae0 | 61 | |
inst | 1:b85088467ae0 | 62 | template <size_t MIN, size_t MAX> |
inst | 1:b85088467ae0 | 63 | void GMD<MIN, MAX>::release() { |
inst | 1:b85088467ae0 | 64 | _shut_down = 0; |
inst | 1:b85088467ae0 | 65 | } |
inst | 1:b85088467ae0 | 66 | |
inst | 1:b85088467ae0 | 67 | template <size_t MIN, size_t MAX> |
inst | 1:b85088467ae0 | 68 | float GMD<MIN, MAX>::operator=(float p) { |
inst | 1:b85088467ae0 | 69 | return set(p); |
inst | 1:b85088467ae0 | 70 | } |
inst | 1:b85088467ae0 | 71 |