DRV8830/TI Motor Driver sample program.\\ This program can control two motors.

Dependencies:   DRV8830 mbed

Committer:
kenjiArai
Date:
Sun Aug 24 00:52:11 2014 +0000
Revision:
4:58734155cd29
Parent:
3:db817fb05ba7
DRV8830/TI Motor Driver sample program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 2:e0b9fd6126d1 1 /*
kenjiArai 4:58734155cd29 2 * mbed Application program for the mbed
kenjiArai 4:58734155cd29 3 * Brushed DC Motor control
kenjiArai 4:58734155cd29 4 * Texas Instruments / DRV8830 H-Bridge Voltage-Controlled Motor Driver
kenjiArai 4:58734155cd29 5 * http://www.ti.com/product/drv8830
kenjiArai 2:e0b9fd6126d1 6 *
kenjiArai 2:e0b9fd6126d1 7 * Copyright (c) 2014 Kenji Arai / JH1PJL
kenjiArai 2:e0b9fd6126d1 8 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 2:e0b9fd6126d1 9 * http://mbed.org/users/kenjiArai/
kenjiArai 2:e0b9fd6126d1 10 * Created: July 12th, 2014
kenjiArai 4:58734155cd29 11 * Revised: August 24th, 2014
kenjiArai 2:e0b9fd6126d1 12 *
kenjiArai 2:e0b9fd6126d1 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 2:e0b9fd6126d1 14 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 2:e0b9fd6126d1 15 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 2:e0b9fd6126d1 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 2:e0b9fd6126d1 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 2:e0b9fd6126d1 18 */
kenjiArai 2:e0b9fd6126d1 19
kenjiArai 2:e0b9fd6126d1 20 // Include ---------------------------------------------------------------------------------------
bcostm 0:028fac66239d 21 #include "mbed.h"
kenjiArai 4:58734155cd29 22 #include "DRV8830.h"
bcostm 1:e9d1c42a73ae 23
kenjiArai 2:e0b9fd6126d1 24 // Object ----------------------------------------------------------------------------------------
kenjiArai 4:58734155cd29 25 DigitalOut myled(LED1);
kenjiArai 4:58734155cd29 26 DigitalIn usr_sw(PC_13);
kenjiArai 4:58734155cd29 27 Serial pc(USBTX, USBRX); // Communication with Host
kenjiArai 4:58734155cd29 28 I2C i2c(PB_9,PB_8); // SDA, SCL
kenjiArai 4:58734155cd29 29 DRV8830 right_mtr(i2c, (uint8_t)DRV8830ADDR_00);
kenjiArai 4:58734155cd29 30 DRV8830 left_mtr(i2c, (uint8_t)DRV8830ADDR_01);
kenjiArai 4:58734155cd29 31
kenjiArai 4:58734155cd29 32 // Definition ------------------------------------------------------------------------------------
kenjiArai 4:58734155cd29 33 #define BAUD(x) pc.baud(x)
kenjiArai 4:58734155cd29 34 #define GETC(x) pc.getc(x)
kenjiArai 4:58734155cd29 35 #define PUTC(x) pc.putc(x)
kenjiArai 4:58734155cd29 36 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 4:58734155cd29 37 #define READABLE(x) pc.readable(x)
kenjiArai 4:58734155cd29 38
kenjiArai 4:58734155cd29 39 #define DO_DEBUG
kenjiArai 4:58734155cd29 40 #ifdef DO_DEBUG
kenjiArai 4:58734155cd29 41 #define DEBUG(...) printf(__VA_ARGS__)
kenjiArai 4:58734155cd29 42 #else
kenjiArai 4:58734155cd29 43 #define DEBUG(...) {;}
kenjiArai 4:58734155cd29 44 #endif
kenjiArai 4:58734155cd29 45
kenjiArai 4:58734155cd29 46 // RAM -------------------------------------------------------------------------------------------
kenjiArai 4:58734155cd29 47 char lb[32];
kenjiArai 4:58734155cd29 48
kenjiArai 4:58734155cd29 49 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 4:58734155cd29 50 static char *const msg0 = "Brushed DC Motor Control by JH1PJL, created on "__DATE__"";
kenjiArai 3:db817fb05ba7 51
kenjiArai 3:db817fb05ba7 52 // Function prototypes ---------------------------------------------------------------------------
bcostm 1:e9d1c42a73ae 53
kenjiArai 2:e0b9fd6126d1 54 //-------------------------------------------------------------------------------------------------
kenjiArai 2:e0b9fd6126d1 55 // Control Program
kenjiArai 2:e0b9fd6126d1 56 //-------------------------------------------------------------------------------------------------
kenjiArai 4:58734155cd29 57 // Communication with Host PC ---------------------------------------------------------------------
kenjiArai 4:58734155cd29 58 // Put \r\n
kenjiArai 4:58734155cd29 59 void put_rn ( void ){ PUTC('\r'); PUTC('\n');}
kenjiArai 4:58734155cd29 60
kenjiArai 4:58734155cd29 61 // Put \r
kenjiArai 4:58734155cd29 62 void put_r ( void ){ PUTC('\r');}
kenjiArai 4:58734155cd29 63
kenjiArai 4:58734155cd29 64 // Put ", "
kenjiArai 4:58734155cd29 65 void put_lin ( void ){ PRINTF(", ");}
kenjiArai 4:58734155cd29 66
kenjiArai 4:58734155cd29 67 // Put space n
kenjiArai 4:58734155cd29 68 void put_spc( uint8_t n){ for(;n > 0; n--){ PUTC(' '); }}
kenjiArai 4:58734155cd29 69
kenjiArai 4:58734155cd29 70 // Change string -> number
kenjiArai 4:58734155cd29 71 int xatoi (char **str, int32_t *res){
kenjiArai 4:58734155cd29 72 unsigned long val;
kenjiArai 4:58734155cd29 73 unsigned char c, radix, s = 0;
kenjiArai 4:58734155cd29 74
kenjiArai 4:58734155cd29 75 while ((c = **str) == ' '){ (*str)++;}
kenjiArai 4:58734155cd29 76 if (c == '-') {
kenjiArai 4:58734155cd29 77 s = 1;
kenjiArai 4:58734155cd29 78 c = *(++(*str));
kenjiArai 4:58734155cd29 79 } else if (c == '+') {
kenjiArai 4:58734155cd29 80 s = 0;
kenjiArai 4:58734155cd29 81 c = *(++(*str));
kenjiArai 4:58734155cd29 82 }
kenjiArai 4:58734155cd29 83 if (c == '0') {
kenjiArai 4:58734155cd29 84 c = *(++(*str));
kenjiArai 4:58734155cd29 85 if (c <= ' ') { *res = 0; return 1; }
kenjiArai 4:58734155cd29 86 if (c == 'x') {
kenjiArai 4:58734155cd29 87 radix = 16;
kenjiArai 4:58734155cd29 88 c = *(++(*str));
kenjiArai 4:58734155cd29 89 } else {
kenjiArai 4:58734155cd29 90 if (c == 'b') {
kenjiArai 4:58734155cd29 91 radix = 2;
kenjiArai 4:58734155cd29 92 c = *(++(*str));
kenjiArai 4:58734155cd29 93 } else {
kenjiArai 4:58734155cd29 94 if ((c >= '0')&&(c <= '9')){
kenjiArai 4:58734155cd29 95 radix = 8;
kenjiArai 4:58734155cd29 96 } else {
kenjiArai 4:58734155cd29 97 return 0;
kenjiArai 4:58734155cd29 98 }
kenjiArai 4:58734155cd29 99 }
kenjiArai 4:58734155cd29 100 }
kenjiArai 4:58734155cd29 101 } else {
kenjiArai 4:58734155cd29 102 if ((c < '1')||(c > '9')){ return 0;}
kenjiArai 4:58734155cd29 103 radix = 10;
kenjiArai 4:58734155cd29 104 }
kenjiArai 4:58734155cd29 105 val = 0;
kenjiArai 4:58734155cd29 106 while (c > ' ') {
kenjiArai 4:58734155cd29 107 if (c >= 'a'){ c -= 0x20;}
kenjiArai 4:58734155cd29 108 c -= '0';
kenjiArai 4:58734155cd29 109 if (c >= 17){
kenjiArai 4:58734155cd29 110 c -= 7;
kenjiArai 4:58734155cd29 111 if (c <= 9){ return 0;}
kenjiArai 4:58734155cd29 112 }
kenjiArai 4:58734155cd29 113 if (c >= radix){ return 0;}
kenjiArai 4:58734155cd29 114 val = val * radix + c;
kenjiArai 4:58734155cd29 115 c = *(++(*str));
kenjiArai 4:58734155cd29 116 }
kenjiArai 4:58734155cd29 117 if (s){ val = -val;}
kenjiArai 4:58734155cd29 118 *res = val;
kenjiArai 4:58734155cd29 119 return 1;
kenjiArai 3:db817fb05ba7 120 }
kenjiArai 3:db817fb05ba7 121
kenjiArai 4:58734155cd29 122 // Get key input data
kenjiArai 4:58734155cd29 123 void get_line (char *buff, int len){
kenjiArai 4:58734155cd29 124 char c;
kenjiArai 4:58734155cd29 125 int idx = 0;
kenjiArai 4:58734155cd29 126
kenjiArai 4:58734155cd29 127 for (;;) {
kenjiArai 4:58734155cd29 128 c = GETC();
kenjiArai 4:58734155cd29 129 if (c == '\r') {
kenjiArai 4:58734155cd29 130 buff[idx++] = c;
kenjiArai 4:58734155cd29 131 break;
kenjiArai 4:58734155cd29 132 }
kenjiArai 4:58734155cd29 133 if ((c == '\b') && idx) {
kenjiArai 4:58734155cd29 134 idx--;
kenjiArai 4:58734155cd29 135 PUTC(c);
kenjiArai 4:58734155cd29 136 PUTC(' ');
kenjiArai 4:58734155cd29 137 PUTC(c);
kenjiArai 4:58734155cd29 138 }
kenjiArai 4:58734155cd29 139 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 4:58734155cd29 140 buff[idx++] = c;
kenjiArai 4:58734155cd29 141 PUTC(c);
kenjiArai 4:58734155cd29 142 }
kenjiArai 4:58734155cd29 143 }
kenjiArai 4:58734155cd29 144 buff[idx] = 0;
kenjiArai 4:58734155cd29 145 PUTC('\n');
kenjiArai 4:58734155cd29 146 }
kenjiArai 4:58734155cd29 147
kenjiArai 4:58734155cd29 148 void help(void){
kenjiArai 4:58734155cd29 149 PRINTF("0 -> select Right motor");
kenjiArai 4:58734155cd29 150 put_rn();
kenjiArai 4:58734155cd29 151 PRINTF("1 -> select Left motor");
kenjiArai 4:58734155cd29 152 put_rn();
kenjiArai 4:58734155cd29 153 PRINTF("2 -> select Both motors");
kenjiArai 4:58734155cd29 154 put_rn();
kenjiArai 4:58734155cd29 155 PRINTF("m +/-<speed> x100, e.g. -0.35 -> enter -35");
kenjiArai 4:58734155cd29 156 put_rn();
kenjiArai 4:58734155cd29 157 PRINTF("c -> Change spped automatically");
kenjiArai 4:58734155cd29 158 put_rn();
kenjiArai 4:58734155cd29 159 PRINTF("s -> Stop");
kenjiArai 4:58734155cd29 160 put_rn();
kenjiArai 4:58734155cd29 161 PRINTF("e -> Check error status");
kenjiArai 4:58734155cd29 162 put_rn();
kenjiArai 4:58734155cd29 163 PRINTF("r -> Reset error");
kenjiArai 4:58734155cd29 164 put_rn();
kenjiArai 4:58734155cd29 165 }
kenjiArai 4:58734155cd29 166
kenjiArai 4:58734155cd29 167 // Motor control ----------------------------------------------------------------------------------
kenjiArai 4:58734155cd29 168 void ctrl_speed(float spd, uint8_t mtr_selct){
kenjiArai 4:58734155cd29 169 switch (mtr_selct){
kenjiArai 4:58734155cd29 170 case 0 :
kenjiArai 4:58734155cd29 171 right_mtr.speed(spd);
kenjiArai 4:58734155cd29 172 break;
kenjiArai 4:58734155cd29 173 case 1 :
kenjiArai 4:58734155cd29 174 left_mtr.speed(spd);
kenjiArai 4:58734155cd29 175 break;
kenjiArai 4:58734155cd29 176 case 2 :
kenjiArai 4:58734155cd29 177 right_mtr.speed(spd);
kenjiArai 4:58734155cd29 178 wait(0.001);
kenjiArai 4:58734155cd29 179 left_mtr.speed(spd);
kenjiArai 4:58734155cd29 180 break;
kenjiArai 4:58734155cd29 181 default:
kenjiArai 4:58734155cd29 182 ;
kenjiArai 4:58734155cd29 183 }
kenjiArai 3:db817fb05ba7 184 }
kenjiArai 3:db817fb05ba7 185
kenjiArai 4:58734155cd29 186 void show_status(uint8_t status){
kenjiArai 4:58734155cd29 187 PRINTF("Status:0x%02x ->", status);
kenjiArai 4:58734155cd29 188 if (status & DRV8830_F_FAULT){
kenjiArai 4:58734155cd29 189 PRINTF("Faulted ");
kenjiArai 4:58734155cd29 190 if (status & DRV8830_F_ILIMIT){
kenjiArai 4:58734155cd29 191 PRINTF("/Current limit ");
kenjiArai 4:58734155cd29 192 }
kenjiArai 4:58734155cd29 193 if (status & DRV8830_F_OTS){
kenjiArai 4:58734155cd29 194 PRINTF("/Over temp. ");
kenjiArai 4:58734155cd29 195 }
kenjiArai 4:58734155cd29 196 if (status & DRV8830_F_UVLO){
kenjiArai 4:58734155cd29 197 PRINTF("/Under V lockout ");
kenjiArai 4:58734155cd29 198 }
kenjiArai 4:58734155cd29 199 if (status & DRV8830_F_OCP){
kenjiArai 4:58734155cd29 200 PRINTF("/Over current ");
kenjiArai 4:58734155cd29 201 }
kenjiArai 4:58734155cd29 202 } else {
kenjiArai 4:58734155cd29 203 PRINTF(" No fault");
kenjiArai 4:58734155cd29 204 }
kenjiArai 4:58734155cd29 205 put_rn();
kenjiArai 4:58734155cd29 206 }
kenjiArai 3:db817fb05ba7 207
kenjiArai 4:58734155cd29 208 // Main control -----------------------------------------------------------------------------------
bcostm 0:028fac66239d 209 int main() {
kenjiArai 4:58734155cd29 210 int32_t p1;
kenjiArai 4:58734155cd29 211 char *ptr;
kenjiArai 4:58734155cd29 212 float spd = 0.0;
kenjiArai 4:58734155cd29 213 uint8_t status;
kenjiArai 4:58734155cd29 214 uint8_t stop_flag = 0;
kenjiArai 4:58734155cd29 215 uint8_t mtr_selct = 0;
kenjiArai 4:58734155cd29 216
kenjiArai 4:58734155cd29 217 put_rn();
kenjiArai 4:58734155cd29 218 PRINTF(msg0);
kenjiArai 4:58734155cd29 219 put_rn();
kenjiArai 4:58734155cd29 220 for (;;) {
kenjiArai 4:58734155cd29 221 put_r();
kenjiArai 4:58734155cd29 222 PUTC('>');
kenjiArai 4:58734155cd29 223 myled = 0;
kenjiArai 4:58734155cd29 224 ptr = lb;
kenjiArai 4:58734155cd29 225 get_line(ptr, sizeof(lb));
kenjiArai 4:58734155cd29 226 myled = 1;
kenjiArai 4:58734155cd29 227 switch (*ptr++){
kenjiArai 4:58734155cd29 228 case '0' :
kenjiArai 4:58734155cd29 229 put_r();
kenjiArai 4:58734155cd29 230 mtr_selct = 0;
kenjiArai 4:58734155cd29 231 PRINTF("Select Right Motor");
kenjiArai 4:58734155cd29 232 put_rn();
kenjiArai 4:58734155cd29 233 break;
kenjiArai 4:58734155cd29 234 case '1' :
kenjiArai 4:58734155cd29 235 put_r();
kenjiArai 4:58734155cd29 236 mtr_selct = 1;
kenjiArai 4:58734155cd29 237 PRINTF("Select Left Motor");
kenjiArai 4:58734155cd29 238 put_rn();
kenjiArai 4:58734155cd29 239 break;
kenjiArai 4:58734155cd29 240 case '2' :
kenjiArai 4:58734155cd29 241 put_r();
kenjiArai 4:58734155cd29 242 mtr_selct = 2;
kenjiArai 4:58734155cd29 243 PRINTF("Select Both Motors");
kenjiArai 4:58734155cd29 244 put_rn();
kenjiArai 4:58734155cd29 245 break;
kenjiArai 4:58734155cd29 246 case 'e' :
kenjiArai 4:58734155cd29 247 put_r();
kenjiArai 4:58734155cd29 248 PRINTF("Right ");
kenjiArai 4:58734155cd29 249 status = right_mtr.status();
kenjiArai 4:58734155cd29 250 show_status(status);
kenjiArai 4:58734155cd29 251 PRINTF("Left ");
kenjiArai 4:58734155cd29 252 status = left_mtr.status();
kenjiArai 4:58734155cd29 253 show_status(status);
kenjiArai 4:58734155cd29 254 break;
kenjiArai 4:58734155cd29 255 case 'm' :
kenjiArai 4:58734155cd29 256 if (xatoi(&ptr, &p1)) {
kenjiArai 4:58734155cd29 257 spd = (float)p1 / 100;
kenjiArai 4:58734155cd29 258 }
kenjiArai 4:58734155cd29 259 ctrl_speed(spd, mtr_selct);
kenjiArai 4:58734155cd29 260 put_r();
kenjiArai 4:58734155cd29 261 PRINTF("Run ");
kenjiArai 4:58734155cd29 262 put_rn();
kenjiArai 4:58734155cd29 263 break;
kenjiArai 4:58734155cd29 264 case 'r' :
kenjiArai 4:58734155cd29 265 put_r();
kenjiArai 4:58734155cd29 266 left_mtr.reset();
kenjiArai 4:58734155cd29 267 PRINTF("Reset error");
kenjiArai 4:58734155cd29 268 put_rn();
kenjiArai 4:58734155cd29 269 right_mtr.reset();
kenjiArai 4:58734155cd29 270 break;
kenjiArai 4:58734155cd29 271 case 'c' :
kenjiArai 4:58734155cd29 272 put_r();
kenjiArai 4:58734155cd29 273 PRINTF("CW ++speed");
kenjiArai 4:58734155cd29 274 put_rn();
kenjiArai 4:58734155cd29 275 for (spd = 0.0; spd <= 1.0; spd += 0.02){
kenjiArai 4:58734155cd29 276 ctrl_speed(spd, mtr_selct);
kenjiArai 4:58734155cd29 277 if (READABLE()){ GETC(); stop_flag =1; break;}
kenjiArai 4:58734155cd29 278 wait(0.1);
kenjiArai 4:58734155cd29 279 }
kenjiArai 4:58734155cd29 280 if (stop_flag){ stop_flag =0; break;}
kenjiArai 4:58734155cd29 281 PRINTF("CW --speed");
kenjiArai 4:58734155cd29 282 put_rn();
kenjiArai 4:58734155cd29 283 for (spd = 1.0; spd >= 0.1; spd -= 0.02){
kenjiArai 4:58734155cd29 284 ctrl_speed(spd, mtr_selct);
kenjiArai 4:58734155cd29 285 if (READABLE()){ GETC(); stop_flag =1; break;}
kenjiArai 4:58734155cd29 286 wait(0.1);
kenjiArai 4:58734155cd29 287 }
kenjiArai 4:58734155cd29 288 if (stop_flag){ stop_flag =0; break;}
kenjiArai 4:58734155cd29 289 PRINTF("CCW ++speed");
kenjiArai 4:58734155cd29 290 put_rn();
kenjiArai 4:58734155cd29 291 for (spd = 0.0; spd >= -1.0; spd -= 0.02){
kenjiArai 4:58734155cd29 292 ctrl_speed(spd, mtr_selct);
kenjiArai 4:58734155cd29 293 if (READABLE()){ GETC(); stop_flag =1; break;}
kenjiArai 4:58734155cd29 294 wait(0.1);
kenjiArai 4:58734155cd29 295 }
kenjiArai 4:58734155cd29 296 if (stop_flag){ stop_flag =0; break;}
kenjiArai 4:58734155cd29 297 PRINTF("CCW --speed");
kenjiArai 4:58734155cd29 298 put_rn();
kenjiArai 4:58734155cd29 299 for (spd = -1.0; spd <= 0.0; spd += 0.02){
kenjiArai 4:58734155cd29 300 ctrl_speed(spd, mtr_selct);
kenjiArai 4:58734155cd29 301 if (READABLE()){ GETC(); stop_flag =1; break;}
kenjiArai 4:58734155cd29 302 wait(0.1);
kenjiArai 4:58734155cd29 303 }
kenjiArai 4:58734155cd29 304 if (stop_flag){ stop_flag =0; break;}
kenjiArai 4:58734155cd29 305 // break;
kenjiArai 4:58734155cd29 306 case 's' :
kenjiArai 4:58734155cd29 307 ctrl_speed(0.0, mtr_selct);
kenjiArai 4:58734155cd29 308 put_r();
kenjiArai 4:58734155cd29 309 PRINTF("Stop");
kenjiArai 4:58734155cd29 310 put_rn();
kenjiArai 4:58734155cd29 311 break;
kenjiArai 4:58734155cd29 312 case '?' :
kenjiArai 4:58734155cd29 313 put_r();
kenjiArai 4:58734155cd29 314 help();
kenjiArai 4:58734155cd29 315 break;
kenjiArai 4:58734155cd29 316 default:
kenjiArai 4:58734155cd29 317 put_r();
kenjiArai 4:58734155cd29 318 PRINTF("Help ->?");
kenjiArai 4:58734155cd29 319 put_rn();
kenjiArai 4:58734155cd29 320 help();
kenjiArai 4:58734155cd29 321 }
kenjiArai 3:db817fb05ba7 322 }
bcostm 0:028fac66239d 323 }