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
Diff: DRV8830.cpp
- Revision:
- 1:a9b58bc85be0
- Parent:
- 0:05db098cf4f8
- Child:
- 3:98a9369ed390
diff -r 05db098cf4f8 -r a9b58bc85be0 DRV8830.cpp --- 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); } +