DRV8830/Texas Instruments H-Bridge Voltage-Controlled Motor Driver library for Brushed DC Motor

Dependents:   NucleoF401_motor_test_simple Frequency_Counter_w_GPS_1PPS Nucleo_ACM1602_I2C_DC_Angle Frequency_Cntr_1PPS_F746ZG

Revision:
1:a9b58bc85be0
Parent:
0:05db098cf4f8
Child:
3:98a9369ed390
--- a/DRV8830.cpp	Sat Aug 23 11:18:06 2014 +0000
+++ b/DRV8830.cpp	Thu Nov 27 21:25:10 2014 +0000
@@ -7,7 +7,7 @@
  *  http://www.page.sannet.ne.jp/kenjia/index.html
  *  http://mbed.org/users/kenjiArai/
  *      Created: August      6th, 2014 
- *      Revised: August     16th, 2014
+ *      Revised: November   28th, 2014
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
@@ -47,6 +47,29 @@
 //  fault status
 #define DRV8830_F_CLEAR         0x80
 
+// Voltage Control
+#define DRV8830_FREE            0x00
+#define DRV8830_POSI            0x01
+#define DRV8830_NEGA            0x02
+#define DRV8830_BREAK           0x03
+
+// Voltage table
+#define TBL_OFFSET              0x06
+#define TBL_SIZE                58
+#define TBL_MAX_VALUE           (5.06f)
+#define TBL_MIN_VALUE           (0.48f)
+
+const float voltage_table [] = {
+    0.48,    0.56,    0.64,    0.72,    0.80,    0.88,    0.96,    1.04,
+    1.12,    1.20,    1.29,    1.37,    1.45,    1.53,    1.61,    1.69,
+    1.77,    1.85,    1.93,    2.01,    2.09,    2.17,    2.25,    2.33,
+    2.41,    2.49,    2.57,    2.65,    2.73,    2.81,    2.89,    2.97,
+    3.05,    3.13,    3.21,    3.29,    3.37,    3.45,    3.53,    3.61,
+    3.69,    3.77,    3.86,    3.94,    4.02,    4.10,    4.18,    4.26,
+    4.34,    4.42,    4.50,    4.58,    4.66,    4.74,    4.82,    4.90,
+    4.98,    5.06
+};
+
 DRV8830::DRV8830 (PinName p_sda, PinName p_scl, uint8_t addr) : i2c(p_sda, p_scl){
     DRV8830_addr = (char)addr;
 }
@@ -81,12 +104,45 @@
     i2c.write((int)DRV8830_addr, (char *)dt, 2);
 }
 
+void DRV8830::set_voltage(float volt) {
+uint8_t direction = 0;
+uint8_t pwm_rate = 0;
+uint8_t dt[2];
+
+    if (volt < 0){
+        direction = DRV8830_NEGA;
+        volt *= -1;
+    } else {
+        direction = DRV8830_POSI; 
+    }
+    if (volt >= TBL_MAX_VALUE) {
+        pwm_rate = TBL_SIZE + TBL_OFFSET - 1;
+    } else {
+        for (uint32_t i = 0; i < TBL_SIZE; i++){ 
+            if (volt < voltage_table[i]) {
+                //printf("n=%d, voltage_table[i]=%f\r\n", i, voltage_table[i]);
+                if (i == 0){
+                    pwm_rate = 0;
+                    direction = DRV8830_FREE;
+                } else {
+                    pwm_rate = i + TBL_OFFSET;
+                }
+                break;
+            }
+        } 
+    }
+    //printf("volt=%f, pwm=0x%x, dir=%d\r\n", volt, pwm_rate, direction);
+    dt[0] = DRV8830_CONTROL;
+    dt[1] = (pwm_rate << 2) + direction;
+    i2c.write((int)DRV8830_addr, (char *)dt, 2);
+}
+
 uint8_t DRV8830::status() {
 uint8_t dt[2];
 
     dt[0] = DRV8830_FAULT;
-    i2c.write((int)DRV8830ADDR_00, (char *)dt, 1);  // write register address
-    i2c.read((int)DRV8830ADDR_00, (char *)dt, 1);   // read register content
+    i2c.write((int)DRV8830_addr, (char *)dt, 1);  // write register address
+    i2c.read((int)DRV8830_addr, (char *)dt, 1);   // read register content
     return dt[0];
 }
 
@@ -95,5 +151,6 @@
 
     dt[0] = DRV8830_FAULT;
     dt[1] = DRV8830_F_CLEAR;
-    i2c.write((int)DRV8830ADDR_00, (char *)dt, 2);
+    i2c.write((int)DRV8830_addr, (char *)dt, 2);
 }
+