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:
- 0:05db098cf4f8
- Child:
- 1:a9b58bc85be0
diff -r 000000000000 -r 05db098cf4f8 DRV8830.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DRV8830.cpp Sat Aug 23 11:18:06 2014 +0000 @@ -0,0 +1,99 @@ +/* + * mbed library program + * Texas Instruments / DRV8830 H-Bridge Voltage-Controlled Motor Driver + * http://www.ti.com/product/drv8830 + * + * Copyright (c) 2014 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * Created: August 6th, 2014 + * Revised: August 16th, 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 + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mbed.h" +#include "DRV8830.h" + +// motor status +#define DRV8830_FREE 0x00 +#define DRV8830_CW 0x01 +#define DRV8830_CCW 0x02 +#define DRV8830_BREAK 0x03 + +// register address +#define DRV8830_CONTROL 0x00 +#define DRV8830_FAULT 0x01 + +// voltage data +#define DRV8830_V_R48 0x06 +#define DRV8830_V_R56 0x07 +#define DRV8830_V_R64 0x08 +#define DRV8830_V_R72 0x09 + // (no definition from 0.82V to 4.74V) +#define DRV8830_V_4R82 0x3c +#define DRV8830_V_4R90 0x3d +#define DRV8830_V_4R98 0x3e +#define DRV8830_V_5R06 0x3f + +#define DRV8830_V_MIN 0x06 +#define DRV8830_V_MAX 0x3f +#define DRV8830_V_RANGE (DRV8830_V_MAX - DRV8830_V_MIN) + +// fault status +#define DRV8830_F_CLEAR 0x80 + +DRV8830::DRV8830 (PinName p_sda, PinName p_scl, uint8_t addr) : i2c(p_sda, p_scl){ + DRV8830_addr = (char)addr; +} + +DRV8830::DRV8830 (I2C& p_i2c, uint8_t addr) : i2c(p_i2c){ + DRV8830_addr = (char)addr; +} + +void DRV8830::speed(float speed) { +uint8_t direction = 0; +uint8_t pwm_rate = 0; +uint8_t dt[2]; + + if (speed == 0.0 ){ + pwm_rate = DRV8830_V_MIN; + direction = DRV8830_FREE; + } else if (speed > 0.0){ + pwm_rate = (uint8_t)(DRV8830_V_RANGE * speed) + DRV8830_V_MIN; + direction = DRV8830_CW; + } else if (speed < 0.0){ + speed *= -1; + pwm_rate = (uint8_t)(DRV8830_V_RANGE * speed) + DRV8830_V_MIN; + direction = DRV8830_CCW; + } + if (pwm_rate > DRV8830_V_MAX){ + pwm_rate = DRV8830_V_MAX; + } else if (pwm_rate < DRV8830_V_MIN){ + pwm_rate = DRV8830_V_MIN; + } + 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 + return dt[0]; +} + +void DRV8830::reset() { +uint8_t dt[2]; + + dt[0] = DRV8830_FAULT; + dt[1] = DRV8830_F_CLEAR; + i2c.write((int)DRV8830ADDR_00, (char *)dt, 2); +}