L9110S H-Bridge Driver

Fork of L9110S by Hochschule München

Files at this revision

API Documentation at this revision

Comitter:
HMFK03LST1
Date:
Wed Jul 20 14:12:29 2016 +0000
Parent:
4:d2fb1359716e
Commit message:
first

Changed in this revision

L9110S.cpp Show annotated file Show diff for this revision Revisions of this file
L9110S.h Show annotated file Show diff for this revision Revisions of this file
--- a/L9110S.cpp	Tue Feb 09 07:46:23 2016 +0000
+++ b/L9110S.cpp	Wed Jul 20 14:12:29 2016 +0000
@@ -32,7 +32,7 @@
   * @param ccw_r is the pin for counter clockwise rotate
   */
   L9110S::L9110S(PinName cw_r, PinName ccw_r):
-    cw_min(14), cw_max(70), ccw_min(14), ccw_max(70), _cw(cw_r), _ccw(ccw_r), periode(1000)
+    cw_min(14), cw_max(70), ccw_min(14), ccw_max(70), _cw(cw_r), _ccw(ccw_r), periode(1000), power_act(0)
    {
     _cw.period_us( periode);
     _ccw.period_us(periode);
@@ -54,7 +54,8 @@
     // Limit PWM -100 to 100
     if (power >  100) power =  100;
     if (power < -100) power = -100; 
-
+    power_act = power;
+    
     // Calc PWM in us 
     if        (power > 0) {power = ((power * ( cw_max -  cw_min)) + ( cw_min * 100)) * periode / 10000;}
     else { if (power < 0) {power = ((power * (ccw_max - ccw_min)) - (ccw_min * 100)) * periode / 10000;}
@@ -78,7 +79,8 @@
    {
     // Limit PWM  0 to 100 and Stop
     if ((power > 100) || (power < 0) || (dir == 0)) power = 0; 
-
+    power_act = power;
+    
     // Calc PWM in us 
     if      (dir > 0) {power = ((power * (cw_max - cw_min )) + (cw_min  * 100)) * periode / 100000;}
     else { if (dir < 0) {power = ((power * (ccw_max- ccw_min)) + (ccw_min * 100)) * periode / 100000;}
@@ -109,15 +111,26 @@
 
   void L9110S::drive_diff(float Soll, float Ist, int kp ,int i_lim, int trash)
    {
-    int p = deg_diff(Soll, Ist) * kp;
- 
-    if (abs(p) < ((kp * trash)/10)) {p = 0;}
-    else
-    {
-     drive_i = drive_i + (p/16);
-     if (drive_i >  i_lim) drive_i =  i_lim;
-     if (drive_i < -i_lim) drive_i = -i_lim;
-    }
+    
+    int     p = 0;                                    //Leistungsvariable
+    
+    float   diff = deg_diff(Soll, Ist      );            //Winkeldiffernz
+            diff = diff - (power_act / 20.0);            //Winkeldiffernz - D Anteil aus Motorleistung 10° bei 100%        
+    
+    if ( fabs(diff) < (trash / 10.0)) {p = 0; drive_i *= 0.9;}        //Leistung 0, wenn innerhalb Threshold
+     else
+      {
+       p    = diff * kp;                              //Leistungsbedarf aus Winkeldifferenz mal Kp
+       drive_i = drive_i + ( p / 20.0);               //Berechnung I Anteil 
+       if (drive_i >  i_lim) drive_i =  i_lim;
+       if (drive_i < -i_lim) drive_i = -i_lim;
+      }
+
+    if (p >  100) (p =  100);
+    if (p < -100) (p = -100);
+    
+    power_act = (6 * power_act + p) / 7;
+     
     drive(drive_i/10 + p);   
    }
     
--- a/L9110S.h	Tue Feb 09 07:46:23 2016 +0000
+++ b/L9110S.h	Wed Jul 20 14:12:29 2016 +0000
@@ -116,7 +116,8 @@
         PwmOut _cw;
         PwmOut _ccw;
         int periode;
-        int drive_i;
+        int power_act;
+        float drive_i;
         float deg_diff(float Soll, float Ist);
         
 };
\ No newline at end of file