小车PWM调速
PWM调速的原理是,一个周期内如50ms,一直调用GoForward(),则小车全速前进,不能调速;如果前30ms调用GoForward()让小车前进,后20ms调用Stop()让小车停止,那么获得到的功率就比让小车全速前进的功率小,相应的速度也要小
可参考舵机PWM旋转的程序
程序
程序文件:
1.main.c:调用定时器0初始化函数,while循环内隔一段时间改变speed的值,让小车以不同的速度前进
2.Motor.c:小车前进、后退、左转、右转和停止的函数
3.Delay.c:延时函数
4.Timer.c:定时器0初始化函数,中断函数中实现PWM控制前进
1.因为要用到定时器来计算周期,所以先定义定时器0初始化函数
void Timer0Init(void) //0.5毫秒@11.0592MHz
{
TMOD &= 0xF0;
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1; //开启总中断
ET0 = 1; //开启定时器0中断
}
2.定时溢出中断处理函数中让小车前进和停止
/**
* @brief Timer0中断处理函数,每隔0.5毫秒进入一次中断
* @param 无
* @retval无
*/
void Timer0_Rountine() interrupt 1
{
count++;
TL0 = 0x33;
TH0 = 0xFE;
if(count < speed)
{
//前进
GoForward();
}
else
{
//停止
Stop();
}
if(count == 40) //每次count+1是0.5ms,加了40次,是20ms
{
count = 0;
}
}
3.最后在主函数中引入定时器头文件,修改speed的值来调整小车速度
//因为变量speed在Timer0.c文件中定义,这里要引用其他文件变量,加extern关键字
extern unsigned char speed;
void main()
{
Timer0Init();
UartInit();
while(1)
{
speed = 15; //慢速
Delay1ms(2000);
speed = 25; //中速
Delay1ms(2000);
speed = 35; //快速
Delay1ms(2000);
}
}
程序现象是:小车车轮先慢速旋转两秒,再中速旋转两秒,最后快速旋转两秒,再回到慢速旋转