栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

电机:
我采用的是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=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=0TA2CCR0/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_1TA0CCR0/100;
TA0CCR4=speed_left_2
TA0CCR0/100;
TA2CCR1=speed_right_2TA2CCR0/100;
TA2CCR2=speed_right_1
TA2CCR0/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波,但我不建议这样子做。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297830.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号