这里的小车由于电机安装时是对称的,所以可以看得出来在代码上两个电机的方向是相反的。
上代码之前先介绍一下用到的配件及端口。
电机:
我采用的是JBGB37-520电机(当然别的也可以),用的编码器是霍尔编码器,有6条线,电机Vcc,Gnd,编码器Vcc,Gnd,还有编码器A,B相(这次没用到,但后面写PID算法就需要)。排列顺序不固定。
芯片:
控制芯片采用的是TA6586.使用它的原因是因为从单片机串口输出的PWM波最多就3V多一些,这样的一个电压是不足以驱动带有编码器的直流减速电机的。所以芯片的作用有点类似于光耦,低压信号转化为其他电压的信号。
这是它的引脚图以及对应的输出关系。
接下来上代码:
#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波,但我不建议这样子做。



