C51--小车——PWM调速
2023-12-18 23:45:56
如何进行小车PWM调速:
原理:
全速前进:LeftCon1A = 0;LeftCon1B = 1;
完全停止:LeftCon1A = 0;LeftCon1B = 0;
单位时间内,例如20ms,有15ms是全速,5ms是停止,速度就会比15ms是停止,5ms是全速的功率多,速度快。
要用到PWM的舵机控制代码。
设置定时器:
#include "motor.h"
#include "reg52.h"
char speed;
char cnt = 0;
void Time0Init()
{
TMOD = 0x01; //配置定时器0工作模式位16位时
TL0 = 0x33; //给初值,定一个0.5ms
TH0 = 0xFE;
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
TR0 = 1; //开始计时
TF0 = 0;
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数
TL0 = 0x33; //重新给初值
TH0 = 0xFE;
if(cnt < speed){ //PWM波形控制
go_Forward(); //前进
}else{
go_Storp(); //停止
}
if(cnt == 40){ //爆表40次,经过20ms
cnt = 0; //重新计算cnt
}
}
主函数:
#include "motor.h"
#include "Delay.h"
#include "uart.h"
#include "time.h"
extern char speed;
void main()
{
Time0Init(); //定时器0初始化
UartInit(); //串口初始化
while(1){
speed = 10; //10份(5ms)全速,30份停止。20ms是40份的0.5ms
Delay1000ms();
Delay1000ms();
speed = 20;
Delay1000ms();
Delay1000ms();
speed = 40;
Delay1000ms();
Delay1000ms();
}
}
PWM调速实现小车转向:
原理:
左轮定时器0,右轮定时器1;
左转:右轮速度大于左轮
右转:左轮速度大于右轮
重新封装函数:
//左前进
void go_ForwardLeft()
{
LeftCon1A = 0;
LeftCon1B = 1;
}
//左停止
void go_StopLeft()
{
LeftCon1A = 0;
LeftCon1B = 0;
}
//右前进
void go_ForwardRight()
{
RightCon1A = 0;
RightCon1B = 1;
}
//右停止
void go_StopRight()
{
RightCon1A = 0;
RightCon1B = 0;
}
定时器0和1 :
#include "motor.h"
#include "reg52.h"
char speedLeft;
char cntLeft = 0;
char speedRight;
char cntRight = 0;
//定时器0
void Time0Init()
{
TMOD = 0x01; //配置定时器0工作模式位16位时
TL0 = 0x33; //给初值,定一个0.5ms
TH0 = 0xFE;
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
TR0 = 1; //开始计时
TF0 = 0;
}
//定时器1
void Time1Init()
{
TMOD &= 0x0F; //配置定时器1工作模式位16位时
TMOD |= 0x1 << 4;
TL1 = 0x33; //给初值,定一个0.5ms
TH1 = 0xFE;
ET1 = 1; //打开定时器1中断
EA = 1; //打开总中断EA
TR1 = 1; //开始计时
TF1 = 0;
}
//定时器0的中断
void Time0Handler() interrupt 1
{
cntLeft++; //统计爆表的次数
TL0 = 0x33; //重新给初值
TH0 = 0xFE;
if(cntLeft < speedLeft){ //PWM波形控制
go_ForwardLeft(); //左前进
}else{
go_StopLeft(); //左停止
}
if(cntLeft == 40){ //爆表40次,经过20ms
cntLeft = 0; //重新计算cnt
}
}
//定时器1的中断
void Time1Handler() interrupt 3
{
cntRight++; //统计爆表的次数
TL1 = 0x33; //重新给初值
TH1 = 0xFE;
if(cntRight < speedRight){ //PWM波形控制
go_ForwardRight(); //右前进
}else{
go_StopRight(); //右停止
}
if(cntRight == 40){ //爆表40次,经过20ms
cntRight = 0; //重新计算cnt
}
}
主函数:
#include "motor.h"
#include "Delay.h"
#include "uart.h"
#include "time.h"
extern char speedLeft;
extern char speedRight;
void main()
{
Time0Init(); //定时器0初始化
Time1Init(); //定时器1初始化
UartInit(); //串口初始化
while(1){
speedLeft = 10; //10份(5ms)全速,30份停止。20ms是40份的0.5ms
speedRight = 40;
Delay1000ms();
Delay1000ms();
speedLeft = 40;
speedRight = 10;
Delay1000ms();
Delay1000ms();
}
}
文章来源:https://blog.csdn.net/weixin_48208102/article/details/135068390
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!