A simple PWM decoder class. It is based on using 2 interrupts, one for rising and another for falling edges of the input pulse. This is a very simple approach, possibly accurate enough to decode RC receiver pulses.
pulse_decoder.h@0:b0ec6b86deaa, 2016-05-15 (annotated)
- Committer:
- salarian
- Date:
- Sun May 15 11:08:46 2016 +0000
- Revision:
- 0:b0ec6b86deaa
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
salarian | 0:b0ec6b86deaa | 1 | #ifndef PULSE_DECODER_H |
salarian | 0:b0ec6b86deaa | 2 | #define PULSE_DECODER_H |
salarian | 0:b0ec6b86deaa | 3 | |
salarian | 0:b0ec6b86deaa | 4 | /// @file pulse_decoder.h This library provides a simple PWM decoder class. |
salarian | 0:b0ec6b86deaa | 5 | /// |
salarian | 0:b0ec6b86deaa | 6 | /// The approach is based on installing two interrupt routines for the rising and |
salarian | 0:b0ec6b86deaa | 7 | /// falling edges of an input pin and measuring the time between the two events. |
salarian | 0:b0ec6b86deaa | 8 | /// |
salarian | 0:b0ec6b86deaa | 9 | /// Example: |
salarian | 0:b0ec6b86deaa | 10 | /// @code |
salarian | 0:b0ec6b86deaa | 11 | /// #include "mbed.h" |
salarian | 0:b0ec6b86deaa | 12 | /// void main() |
salarian | 0:b0ec6b86deaa | 13 | /// { |
salarian | 0:b0ec6b86deaa | 14 | /// pulse_decoder pulse(D7); |
salarian | 0:b0ec6b86deaa | 15 | /// |
salarian | 0:b0ec6b86deaa | 16 | /// while(true) { |
salarian | 0:b0ec6b86deaa | 17 | /// printf("Pulse high = %5d low = %5d (us) Period = %5d\n", |
salarian | 0:b0ec6b86deaa | 18 | /// pulse.get_high_period(), pulse.get_low_period(), |
salarian | 0:b0ec6b86deaa | 19 | /// pulse.get_high_period() + pulse.get_low_period()); |
salarian | 0:b0ec6b86deaa | 20 | /// wait(.2); |
salarian | 0:b0ec6b86deaa | 21 | /// } |
salarian | 0:b0ec6b86deaa | 22 | /// } |
salarian | 0:b0ec6b86deaa | 23 | /// @endcode |
salarian | 0:b0ec6b86deaa | 24 | |
salarian | 0:b0ec6b86deaa | 25 | class pulse_decoder { |
salarian | 0:b0ec6b86deaa | 26 | public: |
salarian | 0:b0ec6b86deaa | 27 | ///Creates a pulse_decoder |
salarian | 0:b0ec6b86deaa | 28 | ///@param[in] pin the input pin on the microcontroller |
salarian | 0:b0ec6b86deaa | 29 | pulse_decoder(PinName pin); |
salarian | 0:b0ec6b86deaa | 30 | |
salarian | 0:b0ec6b86deaa | 31 | ///Get the period of time that the pulse was in high state |
salarian | 0:b0ec6b86deaa | 32 | ///@return the period in us |
salarian | 0:b0ec6b86deaa | 33 | int get_high_period() const |
salarian | 0:b0ec6b86deaa | 34 | { |
salarian | 0:b0ec6b86deaa | 35 | return high_period; |
salarian | 0:b0ec6b86deaa | 36 | } |
salarian | 0:b0ec6b86deaa | 37 | |
salarian | 0:b0ec6b86deaa | 38 | ///Get the period of time that the pulse was in low state |
salarian | 0:b0ec6b86deaa | 39 | ///@return the period in us |
salarian | 0:b0ec6b86deaa | 40 | int get_low_period() const |
salarian | 0:b0ec6b86deaa | 41 | { |
salarian | 0:b0ec6b86deaa | 42 | return low_period; |
salarian | 0:b0ec6b86deaa | 43 | } |
salarian | 0:b0ec6b86deaa | 44 | |
salarian | 0:b0ec6b86deaa | 45 | private: |
salarian | 0:b0ec6b86deaa | 46 | InterruptIn interrupt; |
salarian | 0:b0ec6b86deaa | 47 | Timer high_timer; |
salarian | 0:b0ec6b86deaa | 48 | Timer low_timer; |
salarian | 0:b0ec6b86deaa | 49 | volatile int high_period; |
salarian | 0:b0ec6b86deaa | 50 | volatile int low_period; |
salarian | 0:b0ec6b86deaa | 51 | |
salarian | 0:b0ec6b86deaa | 52 | void rising_edge(); |
salarian | 0:b0ec6b86deaa | 53 | void falling_edge(); |
salarian | 0:b0ec6b86deaa | 54 | }; |
salarian | 0:b0ec6b86deaa | 55 | |
salarian | 0:b0ec6b86deaa | 56 | #endif //PULSE_DECODER_H |