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 #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 }