博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
循迹小车
阅读量:3950 次
发布时间:2019-05-24

本文共 2894 字,大约阅读时间需要 9 分钟。

循迹小车,顾名思义就是沿着已定的线路跑的小车,循迹小车在可以代替人工进行固定地点的搬运、传递信息等…

一个循迹小车主要有以下几个模块组成:

  • 电机驱动模块
  • PWM调速模块
  • 红外循迹模块

剩下的就是在主函数中对这几个模块进行相互配合,让小车能够在红外寻迹模块的反馈下,通过PWM模块的调速,使电机驱动, 寻迹小车的大体运作过程就是这样,接下来详细说明一下几个模块的配合。

电机驱动模块

电机驱动模块是L293D,只要将相应接口使用杜邦线连接在单片机上,再由程序控制相应接口的电平高低,就可以控制俩个电机的转动,实现小车前进、后退、左转、右转等动作。

如下是电机驱动模块头文件,利用六根杜邦线连接电机与单片机,控制相应引脚的电平输出就可以控制电机的转动。

sbit L_back = P1^2; //为1 左电机反转sbit L_advance = P1^3; //为1 左电机正转sbit R_advance = P1^6; //为1 右电机正转sbit R_back = P1^7; //为1 右电机反转sbit L_en = P1^4; //为1 左电机使能sbit R_en = P1^5; //为1 右电机使能#define Left_forward()   	 L_back=0,L_advance=1#define Left_back()      	 L_back=1,L_advance=0#define Left_stop()     	 L_back=0,L_advance=0#define Left_en()            L_en=1#define Right_forward()      R_back=0,R_advance=1#define Right_back()      	 R_back=1,R_advance=0#define Right_stop()      	 R_back=0,R_advance=0#define Right_en()       	 R_en=1

下面是具体实现小车前进、后退、左转、右转的函数:

/* 小车前进:左右电机同时前进 */void Forward(void){	Left_forward();	Right_forward();	}/* 小车后退:左右电机同时倒转 */void Back(void){	Left_back();	Right_back();}/* 小车左转:右电机前进,左电机不转 */void Left_motor_go(void){	Left_stop();	Right_forward();	}/* 小车右转:左电机前进,右电机不转 */void Right_motor_go(void){	Right_stop();	Left_forward();	}

然后就是再程序中直接调用这些,小车的驱动函数即可。

PWM调速模块

关于PWM调速的内容之前的博客中已经做了详细的介绍,链接:

在此程序中对电机调速至关重要,因为如果电机产生的扭矩不够的话,小车可能停止不前,如果电机转速过快的话,小车可能失去控制

定时器的配置如示:    TMOD |= 0x02;//8位自动重装模块	TH0 = 220;	TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ	TR0 = 1;//启动定时器0	ET0 = 1;//允许定时器0中断	EA	= 1;//总中断允许	/* 定义全局变量作为PWM的参数 */unsigned char pwm_t,pwm_k=70;	/* 在中断里进行PWM调速 */void timer0() interrupt 1{	pwm_t++;	if(255 == pwm_t)	{		L_en=1;		R_en=1;		pwm_t=0;	}		if(pwm_t == pwm_k)	{		L_en=0;		R_en=0;	}}

解释一下pwm_t和pwm_k的含义(简称t、k):t是计数,计满255(从0开始)为一个周期,k大小代表占空比大小,256/t就是占空比,k越大电机转速越快,但k小于70时电机难以维持正常转动。

红外循迹模块

首先了解一下红外循迹的原理:

红外循迹是通过判断黑白线来完成的,利用了红外光的反光特性,当红外光遇到黑色不反光物体时,反射回的红外光大大减少,同理,当红外光遇到白色反光物体时,反射会的红外光较多。红外循迹的传感器就是利用这个特性,判断反射回红外光的多少来判断,小车下面是黑线还是地面。从而反馈给程序,程序会依据返回的数据进行调整小车的下一步行动。
利用杜邦线连接相应的引脚,使传感器将信息传回单片机:

sbit Left_led = P3^3;//左寻迹信号 为0 没有识别到黑线 为1识别到黑线sbit Right_led = P3^2;//右寻迹信号	为0 没有识别到黑线 为1识别到黑线

(左右各有一个红外传感器)

要使小车沿着黑线走,只要小车偏离黑线红外传感器就会传回1,所以在程序中要不断的检测红外传感器的状态。当小车在黑线路线上时,就直走;当小车向左偏时,让小车右转;当小车向右偏时,让小车左转;当小车踩到黑线上时,让小车后退。 实现代码如下:

while(1)	{		if((1==Left_led)&&(1==Right_led))		{			Back();			Forward();		}		if((0==Left_led)&&(1==Right_led))		{			Right_motor_go();		}		if((1==Left_led)&&(0==Right_led))		{			Left_motor_go();		}		if((0==Left_led)&&(0==Right_led))		{			Forward();		}	}

最后附上主函数:

int main(void){	TMOD |= 0x02;//8位自动重装模块	TH0 = 220;	TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ	TR0 = 1;//启动定时器0	ET0 = 1;//允许定时器0中断	EA	= 1;//总中断允许	while(1)	{		if((1==Left_led)&&(1==Right_led))		{			Back();			Forward();		}		if((0==Left_led)&&(1==Right_led))		{			Right_motor_go();		}		if((1==Left_led)&&(0==Right_led))		{			Left_motor_go();		}		if((0==Left_led)&&(0==Right_led))		{			Forward();		}	}}

代码亲测可以运行

有需要的朋友可以联系博主
qq:2723808286
有完整的循迹小车、红外遥控、各种传感的模块

转载地址:http://nowzi.baihongyu.com/

你可能感兴趣的文章
【UML】四大关系篇
查看>>
行是知之始,知是行之成
查看>>
软件开发文档小结
查看>>
【UML】开发文档应用
查看>>
【UML】类图与用例图关系解析
查看>>
【SLA】理论学习阶段小结
查看>>
【C#】视频学习笔记(三)
查看>>
Power English 初始学习篇
查看>>
Mini Story 的正确打开方式
查看>>
【设计模式】基础篇
查看>>
【设计模式】六大设计原则篇
查看>>
【设计模式】理论整合+应用场景(一)
查看>>
【设计模式】理论整合+应用场景(二)
查看>>
《操作系统概论》调度算法小总
查看>>
二叉树遍历
查看>>
原码、反码、补码、移码举例
查看>>
Web Form框架(UI+BLL+DAL)学习
查看>>
【设计模式】比较篇
查看>>
【SQL Server】备份数据库失败:备份集中的数据库备份与现有的数据库不同
查看>>
【SQL Server】还原数据库失败:因为某些数据库功能在当前版本中不可用
查看>>