概要
昨天我们让小车的四个电机转了起来,今天来利用pwm对电机进行调速。
对PWM的理解
让蓝线递增,比红线高的部分直接转化为高电平,低的则为低电平。基本原理就是一个周期内,通电的时间越多,最终呈现出来的效果就是电机就转的越快,这可以抽象为一个重要参数--占空比,占空比越大,也就是说一个周期内通电越多,电机转的越快。
这里还要用到L298N的ENA和ENB口,基本原理如图:
也就是说给ENA口赋值1,就相当于打开了OUT口,电机就会根据相应的指令转动,赋值0,OUT口则关闭,不管IN口是什么指令电机都会停止转动;
代码细节
#include <REGX52.H>
#include "motor.h"
void Timer0Init(void);
sbit EN1A=P0^2;//前轮
sbit EN1B=P0^7;//前轮
sbit EN2A=P3^2;//后轮
sbit EN2B=P3^7;//后轮
unsigned int counter1,speed;
void Timer0Init(void) //100微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |=0x01; //设置定时器模式
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //定时器0中断允许开关
EA=1; //定时器总开关
PT0=0; //定时器0中断优先级
}
void Timer0_Routine() interrupt 1
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
counter1++;
counter1%=100;
if(counter1<speed)
{
EN1A=1;
EN1B=1;
EN2A=1;
EN2B=1;
}
else
{
EN1A=0;
EN1B=0;
EN2A=0;
EN2B=0;
}
}
代码中有两个重要参数,一个是counter1,另一个是speed,让counter1递增,也就是上面图中递增的蓝线,红线就是speed,这里的周期就是100um×100。占空比在这就为speed/100,也就是说speed越大,电机转速则越快,调速的效果就达到啦!
每日小结
今天主要是代码,调试中也出现了一些问题,有个别轮子会不动,可能是接马达的电线接口接触不良,于是重新换了一根线,重新焊上去了。明天继续加油!!!