一.pwm波的产生
驱动电机,舵机的运动,肯定要用到pwm波,所以我们先来分享一下如何来产生pwm波,产生pwm波的话一定是要用到单片机里带的定时器。msp430f5529这款芯片有TIME A, TIME B定时器。首先我们先查阅数据手册,查看可以使用定时器的管脚。
我们看到P1.2 P1.3 P1.4 P1.5可以使用timeA定时器,在翻看翻看官方给的定时器例程,我们就能写出pwm波的程序了
void initpwm()
{
P1DIR |=BIT2+BIT3+BIT4+BIT5; //设置P1.2,3,4,5口为输出
P1SEL |=BIT2+BIT3+BIT4+BIT5; //开启1.2,3,4,5口的io口的第二功能,即启用定时器
TA0CCR0 =3000; //设置PWM波的周期
TA0CTL=TASSEL_2+MC_1; //设置定时器A0采用TASSEL时钟源和增计数模式
TA0CCTL1 = OUTMOD_7; //设置TA0CCR1,2,34,的PWM的输出模式为7模式
TA0CCTL2 = OUTMOD_7;
TA0CCTL3 = OUTMOD_7;
TA0CCTL4 = OUTMOD_7;
}
此时P1.2和P1.5控制一个电机,P1.3和P1.4控制一个电机,然后在主程序中只需要给TA0CCR1,TA0CCR2,TA0CCR3,TA0CCR4分别对应P1.2,P1.3,P1.4,P1.5赋值即可.记得赋值时控制一个电机的一组定时器一个给0,另一个给的值除以TA0CCR0的值即为pwm波的占空比。如:TA0CCTL1=0;TA0CCTL4=1000;其占空比就为1000/3000。
二.舵机的运用,舵机这个玩意很神奇,控制它的话是采用pwm波控制。基本原理什么的就不仔细讲了,想要详细了解的,大家可以在csdn上查看一下。首先在百度上搜了一张舵机的图
差不多就是这样,那我们的pwm波就是通过占空比来控制舵机的相对转动的角度和方向。具体关系的话可以到买舵机的商家问一问。然后我们上代码。
int umotor(void)
{
P2DIR |=BIT0 ; //设置P2.0口为输出
P2SEL |=BIT0; //开启2.0口的第二功能,因为要用来输出pwm
TA1CCR0 =10000; //设置PWM周期(此周期要根据舵机的频率计算,舵机频率转换为此周期)
TA1CTL=TASSEL_2+MC_1; //设置定时器A1采用TASSEL时钟源和增计数模式
TA1CCTL1 =OUTMOD_7; //设置TA0CCR1的PWM的输出模式为7模式
}
同样的给TA1CCTL1赋值 ,TA1CCTL1/TA1CCR0即为舵机的占空比,通过控制舵机的占空比即可以控制舵机的转向。
三.电机的运用,电机就直接上驱动板,驱动板上接上pwm波,把电机接在驱动板上即可,如果发现正反转不一,可以把接一组pwm波的线交换一下,也可以把电机接驱动板的正负极交换一下。
四.红外对管的应用
红外对管呢,是通过发射红外光和接受红外光的设备,所以可以用来循迹和避障,那么一般红外管在接收障碍物反射的信号后就会给一个高电平(低电平),接收不到会给已给低电平(高电平),所以就要用到单片机判断输入信号的高低电平。
P6SEL|=0x00;
P6DIR|=0x00;//设置P6.0 P6.1 P6.2 P6.3 P6.4红外管脚输入定义
while(1)
{
switch(P6IN&0x0f)
{
case 0x0f:TA1CCTL1=1550;break;//1550为我使用舵机所的中值
case 0x01:TA1CCTL1=1550;break;
case 0x03:TA1CCTL1=1350;break;
case 0x02:TA1CCTL1=1750;break;
case 0x04:TA1CCTL1=1650;break;
default:TA1CCTL1=1550; break;
}; //舵机转向控制
}
这里的0x0f是P6.1.2.3.4管口转换为十六进制,通过输入的口高低电平和0x0f做与运算,再用switch语句来执行转向操作。