这里的小车由于电机安装时是对称的,所以可以看得出来在代码上两个电机的方向是相反的。 上代码之前先介绍一下用到的配件及端口。
电机: 我采用的是JBGB37-520电机(当然别的也可以),用的编码器是霍尔编码器,有6条线,电机Vcc,Gnd,编码器Vcc,Gnd,还有编码器A,B相(这次没用到,但后面写PID算法就需要)。排列顺序不固定。
芯片: 控制芯片采用的是TA6586.使用它的原因是因为从单片机串口输出的PWM波最多就3V多一些,这样的一个电压是不足以驱动带有编码器的直流减速电机的。所以芯片的作用有点类似于光耦,低压信号转化为其他电压的信号。 这是它的引脚图以及对应的输出关系。 接下来上代码: /*
- Electromotor.c
- Created on: 2021年9月12日
- Author: feidao
*/
#include “MSP430F5529.h” #include “Electromotor.h” void PWM_right(void) { WDTCTL = WDTPW | WDTHOLD; P1DIR |=BIT4; P1SEL |=BIT4; P1DIR |=BIT5; P1SEL |=BIT5; TA0CCR0=650; TA0CCTL3=OUTMOD_7; TA0CCR3=0TA0CCR0/100; TA0CCTL4=OUTMOD_7; TA0CCR4=0TA0CCR0/100; TA0CTL =TASSEL_1+MC_1+TACLR; } void PWM_left(void) { WDTCTL = WDTPW | WDTHOLD; P2DIR |=BIT4; P2SEL |=BIT4; P2DIR |=BIT5; P2SEL |=BIT5; TA2CCR0=650; TA2CCTL1=OUTMOD_7; TA2CCR1=0TA2CCR0/100; TA2CCTL2=OUTMOD_7; TA2CCR2=0TA2CCR0/100; TA2CTL =TASSEL_1+MC_1+TACLR; } void move(volatile int speed_left_1,volatile int speed_left_2,volatile int speed_right_1,volatile int speed_right_2) { TA0CCR3=speed_left_1TA0CCR0/100; TA0CCR4=speed_left_2TA0CCR0/100; TA2CCR1=speed_right_2TA2CCR0/100; TA2CCR2=speed_right_1TA2CCR0/100; }
因为两个电机各需要前进后退,所以一共设计到四路PWM波的输出。从代码中可以看出,这两个电机的信号来源分别是P1.4和P1.5;以及P2.4和P2.5 ,如果接口不同的话可以参考本人另一篇文章。 电机分别是用:
PWM_right(); PWM_left();
这两个函数调用,但是由于我将占空比初始值设置成了0,所以并不会开动,这只是开机时的一种设置。那么在运行中要开动,或者是改动电机的速度或是方向就要用到下面这个函数:
move(a,b,c,d);
这里的a,b,c,d分别是左电机的前进,后退PWM的占空比,和右电机的前进和后退PWM的占空比。 简单的说就是左进,左退,右进,右退。这样一来就不一定同进同退,也可以是一进一停,一进一退,或是一退一停,一快一慢等。 数值因为已经在代码里百分化,所以输入0~100的数字(注意是整数,别用小数刁难它)就代表0~100%的占空比。当然如果一个电机你让他又进又退,可能会抵消掉一部分PWM波,但我不建议这样子做。
|