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.

Committer:
salarian
Date:
Sun May 15 11:08:46 2016 +0000
Revision:
0:b0ec6b86deaa
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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