这次项目要求我们使用51单片机,实现红外循迹,超声波避障的功能。
我将这个几个实现的任务一步步分解开来,首先要然小车动起来,需要模块是需要电机和定时器,我们那时候用到小黄电机,驱动是用的L298N。然后就是将其他实现的功能加进去,比如先使用红外对管,可以让小车寻黑线,使用超声波躲避障碍,然后和队友一起焊遥控器,控制小车穿越规定障碍路线。当时我们51单片机的基础很差(其实就没有学),而且C语言都没有学,什么都不会,CSDN也是第一次用,搜索效率是真低啊,还好隔壁组有大佬,请教了好几次,把程序要来直接用,虽然效果不是很好,但是渐渐的我也摸索到了方法,那时候我负责红外循迹,也是三个任务里面比较难的,因为基础差,我们都没将三个任务的程序在一个main函数里面。后面的博客我会将三个程序合起来,算是弥补当时的小遗憾吧。
L298N驱动
先了解L298N驱动的工作原理,现在看它的驱动原理,有了不同的感觉,因为我也是最近学习一些数字电路的内容,回顾它还是蛮简单的,使用之前一定要看对口再接线,尤其是正负极,还有5V和12V的接口(有一个板载5V使能跳线帽:供电电压为5V时套上,12V时摘下),其次弄懂它的逻辑原理,L298N是一个两路的驱动,它可以驱动两个电机,每一路驱动都有一个使能口,两个逻辑输入口,不同情况对应电机不同的状态。
方法1:
这个方法是三个口控制一个电机,其实也可以使用两个口直接控制的,但是我先说一下前面这种吧,而且最开始我也是使用三个口的,这是基础的控制方法了。
IN1 | IN2 | ENA | 电机状态 |
---|---|---|---|
X | X | 0 | 停止 |
1 | 0 | 1 | 顺时针 |
0 | 1 | 1 | 逆时针 |
0 | 0 | 0 | 停止 |
1 | 1 | 0 | 停止 |
(1:表示高电平,0:表示低电平)
主要是还是使能口的确定,确定使能口的高低电平,然后给逻辑口1或0,就可以控制电机了。软件程序是需要使用定时器的,设置PWM值控制电机的转速。
//以定时器0和定时器1为例
#define uint unsigned int
uint PWM=0; //定义PWM值,控制电机转速
uint pwm1=0;
sbit IN11 = P1^0; //定义逻辑口
sbit IN21 = P1^1;
sbit IN31 = P1^2;
sbit IN41 = P1^3;
sbit a1=P2^1; //定义驱动使能口a1
sbit b1=P2^2; //定义驱动使能口b1
uint i=0,j=0;
void Time() //定时器0和1初始函数
{
TMOD |= 0x11; //设置定时器0方式为1 定时器1为方式1
// TMOD |= Ox01; //设置定时器0方式为1
EA=1; //打开总中断
TH0 = 0xfc; //设置定时器处置为高四位,定时1ms
TL0 = 0x18; //设置定时器设置为低四位
ET0 = 1; //打开定时器0中断允许
TR0 = 1; //打开定时器0
TH1 = 0xfc; //设置定时器处置为高四位,定时1ms
TL1 = 0x18; //设置定时器设置为低四位
ET1 = 1; //打开定时器1中断允许
TR1 = 1; //打开定时器1
}
void Timer0() interrupt 1
{
TH0=0xfc;
TL0=0x18;
if(i>PWM)a1=1;else a1=0;
i++;
if(i>=100)i=0;
}
void Timer1() interrupt 3
{
TH1=0xfc;
TL1=0x18;
if(j>pwm1)b1=1;else b1=0;
j++;
if(j>=100)j=0;
}
void forward_move() //电机正转函数,速度50,最大速度100
{
PWM = 50;
pwm1 = 50;
IN11 = 0;
IN21 = 1;
IN31 = 0;
IN41 = 1;
}
void xunji() //定义循迹函数
{
forward_move();
//这里需要用户自己写了,我们但是使用了红外对管循黑线,它很简单,使用的对管多了,逻辑就复杂一点,但是谨慎一点就好
}
void main()
{
Timer();
while(1)
{
xunji();
}
}
方法2 :
第二种方法是使用在性能更高的芯片上,比如STM32F1或F4系列的。首先要将使能口跳线帽拔掉,开启PWM调速。由于STM32的定时器有PWM模式,有模式1和模式2,这样就可以将普通口拉高或拉低,通过定时器的PWM模式(我使用的PWM模式2),赋值两个通道,直接给驱动的逻辑口输入需要的速度值即可。(这里需要对STM32定时器PWM模式有一定的理解,不然还是有点费力的,当时我就没弄明白只是会用,现在回过头才恍然大悟)
电机状态 | IN1 | IN2 |
---|---|---|
正转 | 1/PWM | 0 |
反转 | 0 | 1/PWM |
待机 | 0 | 0 |
刹车 | 1 | 1 |
(1:表示高电平;0:表示低电平;PWM:表示脉宽调制波,调节占空比改变调速)
第二种方法因为要使用到STM32系里开发板,这里我就不提供代码了,等我后面写我们校内赛的总结的时候,可以加上这方面的代码。
我的能力有限,但是希望可以帮助一些刚学习51单片机的朋友,最后呢,如有错误,还望指正,一起进步,一起努力,加油,我们不可以停止脚步哦!