小车循迹壁障等流程图.docx
- 文档编号:4186998
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:13
- 大小:197.42KB
小车循迹壁障等流程图.docx
《小车循迹壁障等流程图.docx》由会员分享,可在线阅读,更多相关《小车循迹壁障等流程图.docx(13页珍藏版)》请在冰豆网上搜索。
小车循迹壁障等流程图
#include
int sbit en1=P1^0; /* L298 的 Enable A */ sbit en2=P1^1; /* L298 的 Enable B */ sbit
s1=P1^2; /* L298 的 Input 1 */ sbit s2=P1^3; /* L298 的 Input 2 */ sbit s3=P1^4; /* L298
的 Input 3 */ sbit s4=P1^5; /* L298 的 Input 4 */ uchar t=0; /* 中断计数器 */ uchar
m1=0; /* 电机 1 速度值 */ uchar m2=0; /* 电机 2 速度值 */ uchar tmp1,tmp2; /* 电机当
前速度值 */ /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */ void
motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) /*
电机 1 的处理 */ { m1=abs(speed); /* 取速度的绝对值 */ if(speed<0) /* 速度值为负
则反转 */ { s1=0; s2=1; } else /* 不为负数则正转 */ { s1=1; s2=0; } }
if(index==2)/*电机 2 的处理*/ { m2=abs(speed);/*电机 2 的速度控制*/
if(speed<0) /* 电机 2 的方向控制 */ { s3=0; s4=1; } else { s3=1; s4=0; } } } }
void delay(uint j) /* 简易延时函数 */ { for(j;j>0;j--); } void main() { uchar i;
TMOD=0x02; /*设定 T0 的工作模式为 2 */ TH0=0x9B; /*装入定时器的初值*/
TL0=0x9B; EA=1; /* 开中断 */ ET0=1; /* 定时器 0 允许中断 */ TR0=1; /* 启动定时
器 0 */ while
(1) /* 电机实际控制演示 */ { for(i=0;i<=100;i++) /* 正转加速 */ {
motor(1,i); motor(2,i); delay(5000); } for(i=100;i>0;i--) /*正转减速*/ {
motor(1,i); motor(2,i); delay(5000); } for(i=0;i<=100;i++) /*反转加速*/ {
motor(1,-i); motor(2,-i); delay(5000); } for(i=100;i>0;i--) /* 反转减速 */ {
motor(1,-i); motor(2,-i); delay(5000); } } } void timer0() interrupt 1 /* T0 中断
服务程序 */ { if(t==0) /* 1 个 PWM 周期完成后才会接受新数值 */ { tmp1=m1;
tmp2=m2; } if(t en2=1; else en2=0; /* 产生电机 2 的 PWM 信号 */ t++; if(t>=100) t=0; /* 1 个 PWM 信号 由 100 次中断产生 */ 有两路 PWM,希望对你有帮助! #include"reg52.H" #include"MyType.h" //=============L298 端口定义 =============== 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 细分等份 100 uchar MOTO_speed1;//左边电机转速 uchar MOTO_speed2;//右边电机转速 uchar PWM_abs1;//左边电机取绝对值后占空比 uchar PWM_abs2;//左边电机取绝对值后占空比 uchar PWM_var1=20;//左边电机直 走速度 (不同的电机,此参数不同) uchar PWM_var2=20;//右边电机直走速度 uchar PWMAnd=0;//PWM 自增变量 /****************************************************************** 名称: motor(char speed1,char speed2); 功能: 同时调节电机的转速 参数: speed1: 电机 1 的 PWM 值;speed2: 电机 2 的 PWM 值 speed>0.正转;speed<0.反转(-100~100) 调 用: externintabs(intval);取绝对值 返回: /******************************************************************/ 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;//反转 } } /****************************************************************** 名称: motor_PWM(); 功能: PWM 占空比输出 参数: 无 调用: 无 返回: 无 /******************************************************************/ 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(); 功能: 定时器初始化 指令: 调用: 无 返回: 无 /******************************************************************/ void TIME_Init () { //=========定时器 T2 初始化 PWM================== TCON = 0x00; TMOD = 0x00; RCAPH = 0xff;//定时 0.1ms RCAPL = 0x47; TH0 = 0xff; TL0 = 0x47; ET0 = 1; //定时器 2 中断开 TR0 = 1; //PWM 定时 器关,PWM 周期为 10ms } /****************************************************************** 名称: void PWM_Time2 () interrupt 5 功能: T2 中断,PWM 控制 参数: 调用: motor_PWM(); //PWM 占空比输出 返回: /******************************************************************/ 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 } 图 3-1ST188实物图图 3-2ST188管脚图及内部电路 通过ST188检测黑线,输出接收到的信号给LM324 ,接收电压与比较电压 比较后,输出信号变为高低电平,再输入到单片机中,用以判定是否检测到黑 线。 图3-5传感器模块电路图 PWM1为1,PWM2为1时,Q1和Q2导通,节点1和节点2都是低电平,Q15 和Q16导通,电机不工作。 PWM1为0,PWM2为0时,Q1和Q2导通,节点1和节点2都是高电平,Q13 和Q14导通,电机不工作。 PWM1为1,PWM2为0时,Q1导通但Q2不导通,节点1是低电平而节点2是 高电平,Q14和Q15导通,电机逆时针转动。 PWM1为0,PWM2为1时,Q1不导通但Q2导通,节点1是高电平而节点2是 低电平,Q13和Q16导通,电机顺时针转动。 传感器循迹 检测 信息采集 STC89C52 主控系统 交替超车 控制行进 通信协同 无线通信 小车运行 图 2-1 系统实现原理结构图 开始 甲乙两 车在起始点 行驶 检测第1条转 弯标志线 检测第2条转 弯标志线 检测超车标 志区 左转直行 200cm右转驶 于起始点 甲乙两 车在起始点 行驶 检测第1条转 弯标志线 甲车左转直 行120cm停止 检测第2条转 弯标志线 检测超车标 志区 甲车开始直 行80cm右转 驶于起始点 无线通信 乙车左转进 入超车区 直行120cm 甲乙两 车在起始点 行驶 检测第1条转 弯标志线 检测第2条转 弯标志线 乙车右转驶 于起始点 检测超车标 志区 乙车左转直 行120cm停止 乙车开始直 行80cm右转 驶于起始点 无线通信 甲车左转进 入超车区 直行120cm 甲车右转驶 于起始点 开始 系统初始化 任务计数器归零 是否完成全部 任务? N 循迹子函数 Y N 图 4-1 主程序流程图 是否完成本次 任务? Y 结束 小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机 I/O 口, 一旦检测到某个 I/O 口有信号,即进入判断处理程序,先确定 4 个探测器中的 哪一个探测到了黑线,如果左面第一级传感器或者左面第二级传感器探测到黑 线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是 右面第一级传感器或右面第二级传感器探测到了黑线,即车身右半部压住黑线, 小车向左偏出了轨迹,则应使小车向右转。 在经过了方向调整后,小车再继续 向前行走,并继续探测黑线重复上述动作。 循迹流程图如图 4-2 所示 N 启动循迹模式 探测黑线 是否检测到黑 线 Y 判断处理程序 向左转 Turn _left2 向左转 Turn _left1 向右转 Turn_ right1 向右转 Turn_ Lright2 继续前进 图 4-2 循迹流程图 上电运行后,放到没有障碍物的空地上,小车直走。 当前方没有障碍 物的的时候车就一直直走。 如果前方遇到障碍物,则小车做左转运动。 直至前方没有障碍物,这时小车恢复直走。 如果前方有障碍物的时候,左边同时也有障碍物,则小车右转。 直 至左边没有障碍物或者前方没有障碍物。 这时小车恢复左转,或者直 走。 如果前面没有障碍物,则先执行直走。 如果前方,左方,右方均有障碍物,则小车后退,直至前方,左方, 右方任一方向没有障碍,则此时小车开始以前方,左方,右方的优先 级开始执行转向。 也就是说如果前方没有障碍物,即使其他任意方向 都有障碍则小车依然直走,如果前方有障碍,左边没有则右转,前方 左方都有障碍,则小车右转。 否则小车后退。 避障及寻光源子程序 在没有检测到障碍物时调用光源检测子程序,寻找光源。 当检测到障碍物 时,控制小车左转一定时间后,再右转一定时间,再次判断前方是否有障碍物, 直到没有障碍物的信号再调用寻光源子程序。 绕障碍物程序流程图如图 6。 外避障传感器,这是一种集发射与接收于一 体的光电传感器。 检测距离可以根据要求进行调节,调节范围为 3~80cm。 该 传 感器具有探测距离远、受可见光干扰小、价格便宜、易于装配、使用方便等特 点, 可以广泛应用于机器人避障、流水线计件等众多场合。 应用如图 2.1.3. 红 传+ (5V) 感 黄 信号输出 器 绿 — 图 2.1.3 传感器应用图示 红 + 黄 信号输出 绿 —
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小车 循迹壁障 流程图
![提示](https://static.bdocx.com/images/bang_tan.gif)