51小车算是很经典的项目了,单片机入门首选,本文旨在帮助刚入门的新手了解51单片机的设计、开发流程步骤,以及一些硬件基础知识,肯定有很多不足,还望各位大佬多多包涵(

电机驱动模块相关:

电机简介:

电机(Electric machinery)俗称“马达”。是一种把电能转换为机械能的设备装置,其核心工作原理是电磁感应定律。
按工作电源种类划分:可分为直流电机和交流电机;按用途可划分:驱动用电动机和控制用电动机。
驱动用电机就是用来不断产生并提供机械能的电机,比如家用电器洗衣机、电风扇、电冰箱、电吹
风等设备中使用的电机。驱动用电机通常只能按档位设置转速,不能精确控制电机的转速和转动角度。
控制用电动机又划分:步进电动机和伺服电动机等。
直流电机是用直流电驱动的电机,电机转速跟电流大小相关,电流越大转速越快,电机转动方向跟电流方向有关。

直流电机实物图

交流电机是用交流电驱动的电机,交流电机还可划分为:单相电机和三相电机。

三相异步交流电机实物图

步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机,它可以精确控制转动角度,广泛用于工业控制系统、精密仪器、公办自动化、机器人等领域。

步进电机实物图

伺服电机也称为舵机,该电机可以精确控制转动角度,也有一定的力量去维持在某个角度(力矩)。伺服电机一般有旋转角度限制,如90度舵机、180度舵机。广泛应用于工业机械臂、智能机器人等对旋转控制要求较高的场合。

伺服电机实物图

L9110S介绍:

本小车项目使用的是直流电机,只需要通直流电就可以控制直流电机的转动。但是不能直接把直流电机接到单片机的IO口上,因为51单片机的IO口输出电流只有15mA左右,根本无法驱动直流电机。所以我们需要用电机驱动模块来驱动直流电机。
本项目采用的是L9110S电机驱动模块,电机工作电压2.5V-12V之间,最大工作电流0.8A,可以同时驱动2个直流电机。实物如图所示。

L9110S电机驱动模块实物图

电机驱动模块接线图:

L9110S电机驱动模块是一个有源器件,供电电压为2.5V~12V,我们可以使用开发板上的3V3或5V电源接口供电,并使用P0.0~P0.3作为控制、信号输出引脚。开发板部分原理图及接线图如下图所示:

部分原理图
接线图

电机驱动程序设计:

小车运动控制分析:

小车共有左右两个电机,每个电机需要两根控制信号线,我们分别命名为La、Lb、Ra、Rb。
可以分析出小车的运动轨迹与控制信号关系如下:
小车前进:
La输出高电平,Lb输出低电平;Ra输出高电平 Rb输出低电平。
小车后退:
La输出低电平,Lb输出高电平;Ra输出低电平 Rb输出高电平。
小车原地左转:
La输出低电平,Lb输出高电平;Ra输出高电平 Rb输出低电平。
小车原地右转:
La输出高电平,Lb输出低电平;Ra输出低电平 Rb输出高电平。
小车前进左转:
左轮和右轮都往前走,但右轮速度大于左轮。
小车前进右转:
左轮和右轮都往前走,但左轮速度大于右轮。

要调整电机的速度,我们需要用到PWM。

PWM技术:

PWM是指脉冲宽度调制(Pulse width modulation,PWM)。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
PWM技术把输出信号划分成连续的短暂的周期性信号。每个周期中高低电平的比例之和为100%,我们把高电平占整个周期的比例称为占空比。下面就是不同占空比的PWM表示图。

PWM信号图

PWM技术广泛应用于各种电气设备的功率控制场景,如直流电机的转速控制、LED灯的发光亮度控制、喇叭的响度控制、发热器件的温度控制等。
在本项目中,我们使用延时函数模拟PWM即可。

电机驱动程序实现:

motor.c:

#include <reg52.h> 
#include "motor.h"
sbit La = P0^0; 
sbit Lb = P0^1; 
sbit Ra = P0^2; 
sbit Rb = P0^3;

static void delay_ms(unsigned int n)
{
	unsigned char i;  
	while(n--)
		for(i=0;i<113;i++);
}

void go_stop(void)
{
	La = 0;
	Lb = 0;
	Ra = 0;
	Rb = 0;
}

void go_up(void)
{
	La = 1;
	Lb = 0;
	Ra = 1;
	Rb = 0;
}

void go_back(void)
{
	La = 0;
	Lb = 1;
	Ra = 0;
	Rb = 1;
}

void go_left(void)
{
	La = 0;
	Lb = 1;
	Ra = 1;
	Rb = 0;
}

void go_right(void)
{
	La = 1;
	Lb = 0;
	Ra = 0;
	Rb = 1;
}

void go_upleft(unsigned int n)
{
	Ra = 1;
	Rb = 0;
	Lb = 0;
	
	La = 1;
	delay_ms(n);
	La = 0;
	delay_ms(100-n);
}

void go_upright(unsigned int n)
{
	La = 1;
	Lb = 0;
	Rb = 0;
	
	Ra = 1;
	delay_ms(n);
	Ra = 0;
	delay_ms(100-n);
}

motor.h:

#ifndef __MOTOR_H__ 
#define __MOTOR_H__

extern void go_up(void);
extern void go_stop(void);
extern void go_back(void);
extern void go_left(void);
extern void go_right(void);
extern void go_upleft(unsigned int n); 
extern void go_upright(unsigned int n); 

#endif

红外循迹模块相关:

红外循迹模块功能描述:

红外循迹模块是利用红外线反射原理来实现障碍物探测的传感器设备。此模块具有一块主控板和四对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面) 时,红外线反射回来被接收管接收识别。
该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点,可以广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等众多场合。

红外循迹模块实物图

红外循迹模块使用说明:

当模块接收到前方障碍物反射回来的红外线时,电路板上红色指示灯点亮,同时对应OUT端口持续输出低电平信号,反之输出高电平信号。
该模块检测距离为 2~60cm,检测角度 35°,检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。红外循迹模块与单片机的连接方式如图所示:

红外模块接线示意图

小车循迹功能实现:

循迹功能的工作原理:

小车的循迹功能是指小车按照地面黑色的轨道线行走到目的地。我们需要两个红外探头并朝向地面,把黑色轨道线夹在中间,通过实时检测红外模块的输出信号变化,以控制小车的运动方向。

循迹功能工作原理示意图

可以分析得出:
1)左右探头都不在黑线中 ==> 小车直行;
2)左右探头都在黑线中(到达目的地) ==> 小车停止;
3)左探头在黑线中且右探头不在黑线中 ==> 小车左转;
4)右探头在黑线中且左探头不在黑线中 ==> 小车右转。

小车循迹功能程序设计:

infrared.c:

#include <reg52.h>
#include "infrared.h"
#include "motor.h"
sbit IN1 = P0^4;//避障左
sbit IN2 = P0^5;//循迹左
sbit IN3 = P0^6;//循迹右
sbit IN4 = P0^7;//避障右
void search_path(void)
{
	while(1)
	{
		if(IN2 == 0 && IN3 == 0 )//左右探头都不在黑线中,直走
		{
			go_up();
		}
		else if(IN2 == 1 && IN3 == 1) //左右探头都在黑线中,停止
		{
			go_stop();
		}
		else if(IN2 == 1 && IN3 == 0)//左探头在黑线中,右探头没有在黑线中
		{
			go_left();
		}
		else if(IN2 == 0 && IN3 == 1)//右探头在黑线中,左探头没有在黑线中
		{
			go_right();
		}
	}
}

infrared.h:

#ifndef __INFRARED_H__
#define __INFRARED_H__

extern void search_path(void);

#endif

main.c:

#include <reg52.h>
#include "motor.h" 
#include "infrared.h"
void main()
{
	while(1)
	{
		search_path();//自动循迹功能
	}
}

小车循迹测试:

项目测试是项目开发流程中的十分重要的一环,嵌入式产品测试可分为硬件测试、软件测试和软硬联调。
硬件测试:
1)测试各个硬件模块是否损坏,参数指标和精度是否满足要求;
2)测试各个硬件模块的连接是否正确,是否存在虚焊、短路或接触不良的地方。
软件测试:
黑盒测试:
也称功能测试,将软件看成黑盒子,在完全不考虑软件内部结构和特性的情况下,测试软件的外部特性和功能。
白盒测试:
也称结构测试,它将软件看成透明的白盒,根据程序的内部结构和逻辑来设计测试用例,检查是否满足设计的需求。
软硬联调:
把编译好的程序烧录到开发板中,用手去分别去遮挡左、右红外探头,检查对应的指示灯点亮状况是否正确,小车的运动方向是否正确,最后找到一处白色地面(或反光的浅色瓷砖地面),在地面上贴上黑色电工胶布模拟轨迹,进行现场测试。


逸一时,误一世