Library for MAX14871 Shield, MAXREFDES89#

Dependencies:   MAX5387 MAX7300

Dependents:   MAXREFDES89_MAX14871_Shield_Demo MAXREFDES89_Test_Program Line_Following_Bot Line_Following_Bot_Pololu

MAXREFDES89# Component Page

Revision:
5:a206f6505109
Parent:
3:89bf07b855e5
Child:
6:dc06cc75c1c8
--- a/max14871_shield.cpp	Mon Aug 24 17:11:41 2015 +0000
+++ b/max14871_shield.cpp	Tue Dec 22 04:24:07 2015 +0000
@@ -385,6 +385,114 @@
 
 
 //*********************************************************************
+int16_t Max14871_Shield::set_pwm_channel(max14871_motor_driver_t md, PinName ch)
+{
+    
+    int16_t result = 0;
+    float pwm_duty_cycle;
+    float pwm_period;
+    
+    
+    if((ch != D3) && (ch != D4) && (ch != D5) && (ch != D6) &&
+       (ch != D8) && (ch != D9) && (ch != D10) && (ch != D11))
+    {
+        result = -1;
+    }
+    else
+    {        
+        switch(md)
+        {
+            case MD1:
+                if((ch != D3) && (ch != D4))
+                {
+                    result = -1;
+                }
+                else
+                {
+                    pwm_duty_cycle = get_pwm_duty_cycle(md);
+                    pwm_period = get_pwm_period(md);
+                    
+                    _p_pwm1->pulsewidth_us(0);
+                    
+                    delete _p_pwm1;
+                    _p_pwm1 = new PwmOut(ch);
+                    
+                    set_pwm_period(md, pwm_period);
+                    set_pwm_duty_cycle(md, pwm_duty_cycle);
+                }
+            break;
+            
+            case MD2:
+                if((ch != D5) && (ch != D6))
+                {
+                    result = -1;
+                }
+                else
+                {
+                    pwm_duty_cycle = get_pwm_duty_cycle(md);
+                    pwm_period = get_pwm_period(md);
+                    
+                    _p_pwm2->pulsewidth_us(0);
+                    
+                    delete _p_pwm2;
+                    _p_pwm2 = new PwmOut(ch);
+                    
+                    set_pwm_period(md, pwm_period);
+                    set_pwm_duty_cycle(md, pwm_duty_cycle);
+                }
+            break;
+            
+            case MD3:
+                if((ch != D8) && (ch != D9))
+                {
+                    result = -1;
+                }
+                else
+                {
+                    pwm_duty_cycle = get_pwm_duty_cycle(md);
+                    pwm_period = get_pwm_period(md);
+                    
+                    _p_pwm3->pulsewidth_us(0);
+                    
+                    delete _p_pwm3;
+                    _p_pwm3 = new PwmOut(ch);
+                    
+                    set_pwm_period(md, pwm_period);
+                    set_pwm_duty_cycle(md, pwm_duty_cycle);
+                }
+            break;
+            
+            case MD4:
+                if((ch != D10) && (ch != D11))
+                {
+                    result = -1;
+                }
+                else
+                {
+                    pwm_duty_cycle = get_pwm_duty_cycle(md);
+                    pwm_period = get_pwm_period(md);
+                    
+                    _p_pwm4->pulsewidth_us(0);
+                    
+                    delete _p_pwm4;
+                    _p_pwm4 = new PwmOut(ch);
+                    
+                    set_pwm_period(md, pwm_period);
+                    set_pwm_duty_cycle(md, pwm_duty_cycle);
+                }
+            break;
+            
+            default:
+                result = -1;
+            break;
+        }
+    }
+    
+    return result;
+}
+
+
+//*********************************************************************
 int16_t Max14871_Shield::set_pwm_period(max14871_motor_driver_t md, float period)
 {
     int16_t result = 0;
@@ -399,18 +507,22 @@
         {
             case MD1:
                 _p_pwm1->period(period);
+                _motor_data_array[(md - 1)].period = period;
             break;
             
             case MD2:
                 _p_pwm2->period(period);
+                _motor_data_array[(md - 1)].period = period;
             break;
             
             case MD3:
                 _p_pwm3->period(period);
+                _motor_data_array[(md - 1)].period = period;
             break;
             
             case MD4:
                 _p_pwm4->period(period);
+                _motor_data_array[(md - 1)].period = period;
             break;
             
             default:
@@ -481,6 +593,13 @@
 
 
 //*********************************************************************
+float Max14871_Shield::get_pwm_period(max14871_motor_driver_t md)
+{
+    return(_motor_data_array[(md - 1)].period);
+}
+
+
+//*********************************************************************
 float Max14871_Shield::get_external_voltage_ref(max14871_motor_driver_t md)
 {
     return(_motor_data_array[(md - 1)].v_ref);
@@ -529,6 +648,7 @@
         _motor_data_array[idx].op_mode = COAST;
         _motor_data_array[idx].i_reg_mode = RIPPLE_25_INTERNAL_REF;
         _motor_data_array[idx].duty_cycle = 0.0f;
+        _motor_data_array[idx].period = MIN_PERIOD;
         _motor_data_array[idx].v_ref = 0.0f;
     }
 }