Pulse Width Modulation RC Servomotor Library compatible with classic and extended models. Models limit are customizable

Dependents:   FRC_2018 0hackton_08_06_18 0hackton_08_06_18_publish Kenya_2019 ... more

Revision:
6:cf65fc8b0de1
Parent:
1:8482eba4d652
Child:
7:014d36c33b73
diff -r 9b1e318db5f1 -r cf65fc8b0de1 RC_Servo.cpp
--- a/RC_Servo.cpp	Thu May 31 17:26:54 2018 +0000
+++ b/RC_Servo.cpp	Tue Jun 05 07:25:09 2018 +0000
@@ -1,21 +1,40 @@
 #include "RC_Servo.h"
 
-RC_Servo::RC_Servo(PinName PWM, int _extended) : _pwm(PWM)
+RC_Servo::RC_Servo(PinName PWM, int _extended) : _RCpwm(PWM)
 {
-    _pwm.period(0.02);
+    _tickRC.attach(callback(this,&RC_Servo::generatePwm),0.02);
     if (_extended) {
-        _pMin = 400;
-        _pMax = 2400;
+        _RCpMin = 400;
+        _RCpMax = 2400;
     } else {
-        _pMin = 1000;
-        _pMax = 2000;
+        _RCpMin = 1000;
+        _RCpMax = 2000;
     }
 }
 
-int RC_Servo::setLimits (int Tmin, int Tmax) {
-    if ((Tmin > 400) && (Tmin < Tmax))  _pMin = Tmin;
+void RC_Servo::generatePwm (void)
+{
+
+    static int  output = 0;
+    static long pulseWidthTime = 0;
+
+    if (pulseWidthTime == 0) pulseWidthTime = _RCpMin;
+    _tickRC.detach();
+    output = !output;
+    _RCpwm = output;
+
+    if (output == 1)    _tickRC.attach (callback(this,&RC_Servo::generatePwm), pulseWidthTime);
+    else {
+        _tickRC.attach (callback(this,&RC_Servo::generatePwm), 20000-pulseWidthTime);
+        pulseWidthTime = RCdelay;
+    }
+}
+
+int RC_Servo::setLimits (int Tmin, int Tmax)
+{
+    if ((Tmin > 400) && (Tmin < Tmax))  _RCpMin = Tmin;
     else return Tmin;
-    if ((Tmax < 2400) && (Tmin < Tmax)) _pMax = Tmax;
+    if ((Tmax < 2400) && (Tmin < Tmax)) _RCpMax = Tmax;
     else return Tmax;
     return 0;
 }
@@ -23,7 +42,7 @@
 void RC_Servo::write (float position)
 {
     if ((position >= 0) && (position <= 1))
-        _pwm.pulsewidth_us (_pMin + (int)(position * (_pMax - _pMin)));
+        RCdelay = _RCpMin + (long)((_RCpMax - _RCpMin) * position);
 }
 
 RC_Servo& RC_Servo::operator= (float position)