标题:
pwm 电机调速 l298n
[打印本页]
作者:
朝朝1
时间:
2021-2-24 23:47
标题:
pwm 电机调速 l298n
#include <reg52.h>
//IO引脚定义:
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
//以上为电机驱动板输入引脚定义,
//IN1和IN2控制左轮电机,输出对应的OU1和OUT2接左轮电机,
//IN3和IN4控制右轮电机,输出对应的OU3和OUT4接右轮电机
sbit L_PWM=P1^4; //左轮调速,接驱动模块ENA使能端,在这里输入PWM信号
sbit R_PWM=P1^5; //右轮调速,接驱动模块ENB使能端,在这里输入PWM信号
//宏定义
#define L_go IN1=0;IN2=1 //左轮前进
#define L_back IN1=1;IN2=0 //左轮后退
#define L_stop IN1=0;IN2=0 //左轮停止,两个输出1也可以
#define R_go IN3=0;IN4=1 //右轮前进
#define R_back IN3=1;IN4=0 //右轮后退
#define R_stop IN3=0;IN4=0 //右轮停止,两个输出1也可以
#define car_go L_go;R_go; //小车前进
#define car_back L_back;R_back //小车后退
#define car_left R_go;L_stop //小车左转弯
#define car_right L_go;R_stop //小车右转弯
#define car_stop L_stop;R_stop //小车停车
#define car_left_360 R_go;L_back //小车向左360度转,也可以认为是大转弯
#define car_right_360 L_go;R_back //小车向右360度转,也可以认为是大转弯
//数据定义
unsigned char l_tt=0; //定时器计数用
unsigned char l_Lpwm=0; //左轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速
unsigned char l_Rpwm=0; //右轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速
//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1 using 2
{
TH0=0XFC; //定时1毫秒,10格调速,为100HZ频率,此频率下效果比较好,过大有噪声,过小振动大
TL0=0X17;
l_tt++;
if(l_tt>9)l_tt=0; //比较用,10格调速
if(l_tt<=l_Lpwm){//左调速,占空比数值越大,输出高电平时间越宽,电机转速越高,我们设计10个格,0-9,0为停止,9为全速
L_PWM=1;
}
else{
L_PWM=0;
}
if(l_tt<=l_Rpwm){//右调速,同上
R_PWM=1;
}
else{
R_PWM=0;
}
}
//延时
void Delay(unsigned int t)
{
unsigned int c;
while(t--){
c=10000;
while(c--);
}
}
//入口函数
void main(void)
{
unsigned char i;
EA=1; //首先开启总中断
TMOD|=0X11; //定时器方式1,16位计数器,用来计数时间
TH0= 0XFC; //1ms定时
TL0= 0X14;
TR0= 1;
ET0= 1;
while(1){
l_Lpwm=0;
car_go; //前进
for(i=0;i<10;i++){//慢慢提速
l_Lpwm++;
l_Rpwm++;
Delay(2);
}
Delay(5); //保持速度前进一会
for(i=0;i<10;i++){//慢慢降速
l_Lpwm--;
l_Rpwm--;
Delay(2);
}
Delay(10);
car_back; //后退,以下原理同上
for(i=0;i<10;i++){
l_Lpwm++;
l_Rpwm++;
Delay(2);
}
Delay(5);
for(i=0;i<10;i++){
l_Lpwm--;
l_Rpwm--;
Delay(2);
}
Delay(10);
}
}
作者:
马克图步
时间:
2021-5-16 14:48
谢谢提供程序 正好在找这方面的
作者:
二位分
时间:
2021-5-17 05:12
原理图能分享吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1