Code to read a PPM/PWM pulse, interrupt driven. Most useful for RC receivers. Code is non-blocking, and a poll of the stall timer can detect if a signal has been lost (signal changes will reset the timer). Code originally written by Simon Ford, modified by me to add in a lost-signal guard.

Dependents:   triforce-control usbjoystick_prg

Code is simple to use.

Will add a quick tutorial on use, and how to use the lost-signal/stall detection in due course.

Pulsewidth and period variables are:

  • Declared volatile to make sure the value read is not compiler optimised, since the values are modified through an ISR; and

Edit: WITHDRAWN:

  • Protected by mutex to make sure that values read are true (such as when an ISR is occurring, but a thread tries to read the value during the ISR). Reason:
  • Mutexes are not meant to be called in an ISR (asynchronous). They are costly and may block a thread

Files at this revision

API Documentation at this revision

Comitter:
pHysiX
Date:
Mon May 19 16:04:34 2014 +0000
Parent:
6:e1df0b4f36e4
Commit message:
Removed mutex. Bad and incorrect of mutex for an ISR

Changed in this revision

PwmIn.cpp Show annotated file Show diff for this revision Revisions of this file
PwmIn.h Show annotated file Show diff for this revision Revisions of this file
--- a/PwmIn.cpp	Mon May 19 15:43:02 2014 +0000
+++ b/PwmIn.cpp	Mon May 19 16:04:34 2014 +0000
@@ -36,18 +36,14 @@
 
 void PwmIn::rise()
 {
-    mutex_var_update.lock();
     _period = _t.read_us();
     stallTimer.reset();
-    mutex_var_update.unlock();
     _t.reset();
 }
 
 void PwmIn::fall()
 {
-    mutex_var_update.lock();
     _pulsewidth = _t.read_us();
-    mutex_var_update.unlock();
     if (!stallInit)
         stallTimer.start();
 }
--- a/PwmIn.h	Mon May 19 15:43:02 2014 +0000
+++ b/PwmIn.h	Mon May 19 16:04:34 2014 +0000
@@ -21,7 +21,6 @@
  * THE SOFTWARE.
  */
 #include "mbed.h"
-#include "rtos.h"
 
 #ifndef MBED_PWMIN_H_
 #define MBED_PWMIN_H_
@@ -67,8 +66,6 @@
      */
     Timer stallTimer;
 protected:
-    Mutex mutex_var_update;
-
     InterruptIn _p;
     Timer _t;
     volatile int _pulsewidth, _period;