【C语言学习】51单片机L298N驱动电机调速
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【C语⾔学习】51单⽚机L298N驱动电机调速51单⽚机L298N驱动电机调速
//=============L298N端⼝定义===============
sbit ENA = P3^6; //左轮驱动使能
sbit IN1 = P0^3; //左轮⿊线(-)
sbit IN2 = P0^4; //左轮红线(+)
sbit IN3 = P0^5; //右轮红线(-)
sbit IN4 = P0^6; //右轮⿊线(+)
sbit ENB = P3^7; //右轮驱动使能
//=============PWM================
#define PWM_COUST 100 //PWM细分等份
uchar MOTO_speed1; //左边电机转速
uchar MOTO_speed2; //右边电机转速
uchar PWM_abs1; //左边电机取绝对值后占空⽐
uchar PWM_abs2; //左边电机取绝对值后占空⽐
uchar PWM_var1=20; //左边电机直⾛速度(不同的电机,此参数不同)
uchar PWM_var2=20; //右边电机直⾛速度
uchar PWMAnd = 0; //PWM⾃增变量
void motor(char speed1,char speed2)
{
//==============左边电机=============
if (speed1>0)
{
IN1 =0;IN2 =1;//正转
}
else if (speed1<0)
{
IN1 =1;IN2 =0;//反转
}
//==============右边电机=============
if (speed2>0)
{
IN3 =1;IN4 =0;//正转
}
else if (speed2<0)
{
IN3 =0;IN4 =1;//反转
}
}
void motor_PWM ()
{
uchar PWM_abs1;
uchar PWM_abs2;
PWM_abs1=MOTO_speed1;
PWM_abs2=MOTO_speed2;
if (PWM_abs1>PWMAnd) ENA=1; //左边电机占空⽐输出 else ENA=0;
if (PWM_abs2>PWMAnd) ENB=1; //右边电机占空⽐输出 else ENB=0;
if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM计数清零 else PWMAnd+=1;
}
void TIME_Init ()
{
//=========定时器T2初始化 PWM================== T2CON = 0x00;
T2MOD = 0x00;
RCAP2H = 0xff; //定时0.1ms
RCAP2L = 0x47;
TH2 = 0xff;
TL2 = 0x47;
ET2 = 1; //定时器2中断开
TR2 = 1; //PWM定时器关,PWM周期为10ms
}
void PWM_Time2 () interrupt 5
{
TR2 = 0;
TF2 = 0;
ET2 = 0; //定时器0中断禁⽌
motor_PWM();//PWM占空⽐输出
ET2 = 1; //定时中断0开启
TR2 = 1;
}
main()
{
TIME_Init () ;
motor(50,50);//左右电机的转速都是50
}。