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
DRV8830.cpp@0:05db098cf4f8, 2014-08-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |