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

Committer:
kenjiArai
Date:
Sat Aug 23 11:18:06 2014 +0000
Revision:
0:05db098cf4f8
Child:
1:a9b58bc85be0
DRV8830/Texas Instruments H-Bridge Voltage-Controlled Motor Driver library for Brushed DC Motor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:05db098cf4f8 1 /*
kenjiArai 0:05db098cf4f8 2 * mbed library program
kenjiArai 0:05db098cf4f8 3 * Texas Instruments / DRV8830 H-Bridge Voltage-Controlled Motor Driver
kenjiArai 0:05db098cf4f8 4 * http://www.ti.com/product/drv8830
kenjiArai 0:05db098cf4f8 5 *
kenjiArai 0:05db098cf4f8 6 * Copyright (c) 2014 Kenji Arai / JH1PJL
kenjiArai 0:05db098cf4f8 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:05db098cf4f8 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:05db098cf4f8 9 * Created: August 6th, 2014
kenjiArai 0:05db098cf4f8 10 * Revised: August 16th, 2014
kenjiArai 0:05db098cf4f8 11 *
kenjiArai 0:05db098cf4f8 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:05db098cf4f8 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:05db098cf4f8 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:05db098cf4f8 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:05db098cf4f8 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:05db098cf4f8 17 */
kenjiArai 0:05db098cf4f8 18
kenjiArai 0:05db098cf4f8 19 #include "mbed.h"
kenjiArai 0:05db098cf4f8 20 #include "DRV8830.h"
kenjiArai 0:05db098cf4f8 21
kenjiArai 0:05db098cf4f8 22 // motor status
kenjiArai 0:05db098cf4f8 23 #define DRV8830_FREE 0x00
kenjiArai 0:05db098cf4f8 24 #define DRV8830_CW 0x01
kenjiArai 0:05db098cf4f8 25 #define DRV8830_CCW 0x02
kenjiArai 0:05db098cf4f8 26 #define DRV8830_BREAK 0x03
kenjiArai 0:05db098cf4f8 27
kenjiArai 0:05db098cf4f8 28 // register address
kenjiArai 0:05db098cf4f8 29 #define DRV8830_CONTROL 0x00
kenjiArai 0:05db098cf4f8 30 #define DRV8830_FAULT 0x01
kenjiArai 0:05db098cf4f8 31
kenjiArai 0:05db098cf4f8 32 // voltage data
kenjiArai 0:05db098cf4f8 33 #define DRV8830_V_R48 0x06
kenjiArai 0:05db098cf4f8 34 #define DRV8830_V_R56 0x07
kenjiArai 0:05db098cf4f8 35 #define DRV8830_V_R64 0x08
kenjiArai 0:05db098cf4f8 36 #define DRV8830_V_R72 0x09
kenjiArai 0:05db098cf4f8 37 // (no definition from 0.82V to 4.74V)
kenjiArai 0:05db098cf4f8 38 #define DRV8830_V_4R82 0x3c
kenjiArai 0:05db098cf4f8 39 #define DRV8830_V_4R90 0x3d
kenjiArai 0:05db098cf4f8 40 #define DRV8830_V_4R98 0x3e
kenjiArai 0:05db098cf4f8 41 #define DRV8830_V_5R06 0x3f
kenjiArai 0:05db098cf4f8 42
kenjiArai 0:05db098cf4f8 43 #define DRV8830_V_MIN 0x06
kenjiArai 0:05db098cf4f8 44 #define DRV8830_V_MAX 0x3f
kenjiArai 0:05db098cf4f8 45 #define DRV8830_V_RANGE (DRV8830_V_MAX - DRV8830_V_MIN)
kenjiArai 0:05db098cf4f8 46
kenjiArai 0:05db098cf4f8 47 // fault status
kenjiArai 0:05db098cf4f8 48 #define DRV8830_F_CLEAR 0x80
kenjiArai 0:05db098cf4f8 49
kenjiArai 0:05db098cf4f8 50 DRV8830::DRV8830 (PinName p_sda, PinName p_scl, uint8_t addr) : i2c(p_sda, p_scl){
kenjiArai 0:05db098cf4f8 51 DRV8830_addr = (char)addr;
kenjiArai 0:05db098cf4f8 52 }
kenjiArai 0:05db098cf4f8 53
kenjiArai 0:05db098cf4f8 54 DRV8830::DRV8830 (I2C& p_i2c, uint8_t addr) : i2c(p_i2c){
kenjiArai 0:05db098cf4f8 55 DRV8830_addr = (char)addr;
kenjiArai 0:05db098cf4f8 56 }
kenjiArai 0:05db098cf4f8 57
kenjiArai 0:05db098cf4f8 58 void DRV8830::speed(float speed) {
kenjiArai 0:05db098cf4f8 59 uint8_t direction = 0;
kenjiArai 0:05db098cf4f8 60 uint8_t pwm_rate = 0;
kenjiArai 0:05db098cf4f8 61 uint8_t dt[2];
kenjiArai 0:05db098cf4f8 62
kenjiArai 0:05db098cf4f8 63 if (speed == 0.0 ){
kenjiArai 0:05db098cf4f8 64 pwm_rate = DRV8830_V_MIN;
kenjiArai 0:05db098cf4f8 65 direction = DRV8830_FREE;
kenjiArai 0:05db098cf4f8 66 } else if (speed > 0.0){
kenjiArai 0:05db098cf4f8 67 pwm_rate = (uint8_t)(DRV8830_V_RANGE * speed) + DRV8830_V_MIN;
kenjiArai 0:05db098cf4f8 68 direction = DRV8830_CW;
kenjiArai 0:05db098cf4f8 69 } else if (speed < 0.0){
kenjiArai 0:05db098cf4f8 70 speed *= -1;
kenjiArai 0:05db098cf4f8 71 pwm_rate = (uint8_t)(DRV8830_V_RANGE * speed) + DRV8830_V_MIN;
kenjiArai 0:05db098cf4f8 72 direction = DRV8830_CCW;
kenjiArai 0:05db098cf4f8 73 }
kenjiArai 0:05db098cf4f8 74 if (pwm_rate > DRV8830_V_MAX){
kenjiArai 0:05db098cf4f8 75 pwm_rate = DRV8830_V_MAX;
kenjiArai 0:05db098cf4f8 76 } else if (pwm_rate < DRV8830_V_MIN){
kenjiArai 0:05db098cf4f8 77 pwm_rate = DRV8830_V_MIN;
kenjiArai 0:05db098cf4f8 78 }
kenjiArai 0:05db098cf4f8 79 dt[0] = DRV8830_CONTROL;
kenjiArai 0:05db098cf4f8 80 dt[1] = (pwm_rate << 2) + direction;
kenjiArai 0:05db098cf4f8 81 i2c.write((int)DRV8830_addr, (char *)dt, 2);
kenjiArai 0:05db098cf4f8 82 }
kenjiArai 0:05db098cf4f8 83
kenjiArai 0:05db098cf4f8 84 uint8_t DRV8830::status() {
kenjiArai 0:05db098cf4f8 85 uint8_t dt[2];
kenjiArai 0:05db098cf4f8 86
kenjiArai 0:05db098cf4f8 87 dt[0] = DRV8830_FAULT;
kenjiArai 0:05db098cf4f8 88 i2c.write((int)DRV8830ADDR_00, (char *)dt, 1); // write register address
kenjiArai 0:05db098cf4f8 89 i2c.read((int)DRV8830ADDR_00, (char *)dt, 1); // read register content
kenjiArai 0:05db098cf4f8 90 return dt[0];
kenjiArai 0:05db098cf4f8 91 }
kenjiArai 0:05db098cf4f8 92
kenjiArai 0:05db098cf4f8 93 void DRV8830::reset() {
kenjiArai 0:05db098cf4f8 94 uint8_t dt[2];
kenjiArai 0:05db098cf4f8 95
kenjiArai 0:05db098cf4f8 96 dt[0] = DRV8830_FAULT;
kenjiArai 0:05db098cf4f8 97 dt[1] = DRV8830_F_CLEAR;
kenjiArai 0:05db098cf4f8 98 i2c.write((int)DRV8830ADDR_00, (char *)dt, 2);
kenjiArai 0:05db098cf4f8 99 }