MSP430F5529-编码器电机控制小车的进退

这里的小车由于电机安装时是对称的,所以可以看得出来在代码上两个电机的方向是相反的。 上代码之前先介绍一下用到的配件及端口。

电机: 我采用的是JBGB37-520电机(当然别的也可以),用的编码器是霍尔编码器,有6条线,电机Vcc,Gnd,编码器Vcc,Gnd,还有编码器A,B相(这次没用到,但后面写PID算法就需要)。排列顺序不固定。

芯片: 控制芯片采用的是TA6586.使用它的原因是因为从单片机串口输出的PWM波最多就3V多一些,这样的一个电压是不足以驱动带有编码器的直流减速电机的。所以芯片的作用有点类似于光耦,低压信号转化为其他电压的信号。 这是它的引脚图以及对应的输出关系。 2022.3.20 更新:TA6586可以勇做电机驱动,但它占据较长时间的上升和下降沿使得他的性能远不如4082等电机驱动,不过sop-8的小封装也是它的一个优点。

接下来上代码:

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=0*TA0CCR0/100;
TA0CCTL4=OUTMOD_7;
TA0CCR4=0*TA0CCR0/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=0*TA2CCR0/100;
 TA2CCTL2=OUTMOD_7;
 TA2CCR2=0*TA2CCR0/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_1*TA0CCR0/100;
 TA0CCR4=speed_left_2*TA0CCR0/100;
 TA2CCR1=speed_right_2*TA2CCR0/100;
 TA2CCR2=speed_right_1*TA2CCR0/100;
}
PWM_right();
PWM_left();

这两个函数调用,但是由于我将占空比初始值设置成了0,所以并不会开动,这只是开机时的一种设置。那么在运行中要开动,或者是改动电机的速度或是方向就要用到下面这个函数:

move(a,b,c,d);

这里的a,b,c,d分别是左电机的前进,后退PWM的占空比,和右电机的前进和后退PWM的占空比。 简单的说就是左进,左退,右进,右退。这样一来就不一定同进同退,也可以是一进一停,一进一退,或是一退一停,一快一慢等。 数值因为已经在代码里百分化,所以输入0~100的数字(注意是整数,别用小数刁难它)就代表0~100%的占空比。当然如果一个电机你让他又进又退,可能会抵消掉一部分PWM波,但我不建议这样子做。

经验分享 程序员 微信小程序 职场和发展