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.cpp@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 | #include "mbed.h" |
salarian | 0:b0ec6b86deaa | 2 | #include "pulse_decoder.h" |
salarian | 0:b0ec6b86deaa | 3 | |
salarian | 0:b0ec6b86deaa | 4 | pulse_decoder::pulse_decoder(PinName pin) |
salarian | 0:b0ec6b86deaa | 5 | : interrupt(pin), high_period(0), low_period(false) |
salarian | 0:b0ec6b86deaa | 6 | { |
salarian | 0:b0ec6b86deaa | 7 | interrupt.rise(this, &pulse_decoder::rising_edge); |
salarian | 0:b0ec6b86deaa | 8 | interrupt.fall(this, &pulse_decoder::falling_edge); |
salarian | 0:b0ec6b86deaa | 9 | } |
salarian | 0:b0ec6b86deaa | 10 | |
salarian | 0:b0ec6b86deaa | 11 | void pulse_decoder::rising_edge() |
salarian | 0:b0ec6b86deaa | 12 | { |
salarian | 0:b0ec6b86deaa | 13 | high_timer.start(); |
salarian | 0:b0ec6b86deaa | 14 | low_timer.stop(); |
salarian | 0:b0ec6b86deaa | 15 | |
salarian | 0:b0ec6b86deaa | 16 | low_period = low_timer.read_us(); |
salarian | 0:b0ec6b86deaa | 17 | low_timer.reset(); |
salarian | 0:b0ec6b86deaa | 18 | } |
salarian | 0:b0ec6b86deaa | 19 | |
salarian | 0:b0ec6b86deaa | 20 | void pulse_decoder::falling_edge() |
salarian | 0:b0ec6b86deaa | 21 | { |
salarian | 0:b0ec6b86deaa | 22 | high_timer.stop(); |
salarian | 0:b0ec6b86deaa | 23 | low_timer.start(); |
salarian | 0:b0ec6b86deaa | 24 | |
salarian | 0:b0ec6b86deaa | 25 | high_period = high_timer.read_us(); |
salarian | 0:b0ec6b86deaa | 26 | high_timer.reset(); |
salarian | 0:b0ec6b86deaa | 27 | } |