完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
循迹小车
由于要准备明年的恩智浦飞思卡尔智能车比赛,飞思卡尔智能车用的是K60系列的单片机,以我目前的阶段来说还处于学习阶段,所以先试着用51单片机做一个智能循迹小车。学习一下小车硬件以及软件程序,这也是对我前一段时间来51单片机和C语言学习的总结。 在小车的前面有一个超声波传感器和一个金属齿轮的舵机,因为想再加一个避障,但在本程序中我只实现了一个红外循迹加调速的功能,没有使用超声波传感器和舵机。 视频 循迹小车 硬件部分 **1、**车模底板我是用以前学长做过的废车模,我用热熔胶粘上去两个直流减速电机和一个万向轮。 **2、**使用的芯片是stc89c52rc,控制系统用的是51最小系统,本来想用自己焊接的最小系统,因为考虑到车模搭建好后写程序时需要多次调试就使用了现成的51最小系统,避免了stc89c52rc芯片引脚的折损。 **3、**选用的电机驱动是L298N L298N可以控制两个电机,而且还具有降压的功能,可以将12V的电降成5V来给最小系统供电。如果使用tb6612电机驱动或没有降压功能的电机驱动,则需要接稳压模块。 L298N上有6个信号端口,其中有两个是控制两个电机的使能端,在本程序中没有使用使能端。类外还有四个信号端是是用来驱动两个电机正转、反转、停止的。 **4、**考虑到电机驱动在运行的时候会发热,我在电机驱动后面装了一个小风扇主要起散热的作用。 **5、**使用了4个红外传感器,两边的用来控制方向,中间放了两个主要用来上坡,上坡时用于前头会抬起来导致最前面两边的得传感器检测不到白色,这时候中间的两个传感器还会检测到白色,使小车继续前进。 **6、**电池用的是11.1v3000ma的锂电池。 **7、**因为感觉车有点丑,我在后面装了两块电路板在上面焊接了一些LED灯,最开始的构想是当小车左转时左边的灯亮,右转时右边的灯亮,前进时两边的灯亮,结果在调试程序的时候发现和电机调速的定时器有冲突,只好选择了在运行程序时所有的LED灯都给低电平,让LED灯常亮。 软件部分 转弯采用的是差速转弯,通过控制左右电机的速度来实现转弯。 1、**左轮调速 void motor_left(bit left_core,uchar ENA) //左电机正反转 占空比 { if(left_core==1) //left_core==1 左电机正转 小车直走 { in1=1; if(cut<=ENA) { in2=0; } else { in2=1; } } else //left_core==0 左电机反转转 小车倒退 { in2=1; if(cut<=ENA) { in1=0; } else { in1=1; } } } **2、**右轮调速 void motor_right(bit right_core,uchar ENB) //右电机正反转 占空比 { if(right_core==1) //right_core==1 右电机正转 小车直走 { in3=1; if(cut<=ENB) { in4=0; } else { in4=1; } } else //right_core==0 右电机反转 小车倒退 { in4=1; if(cut<=ENB) { in3=0; } else { in3=1; } } } **3、**前进 void run() //前进 普通速度 { motor_left(1,4); //左电机正转 速度为4 全速为9 此时速度为全速的4/9 motor_right(1,4); //右电机正转 速度为4 全速为9 此时速度为全速的4/9 } void run_go() //前进 快速前进 用于上坡 { motor_left(1,5); //左电机正转 速度为5 全速为9 此时速度为全速的5/9 motor_right(1,5); //右电机正转 速度为5 全速为9 此时速度为全速的5/9 } 左右转弯通过控制两边的转速来达到转弯的目的 **4、**左转 void turn_left() //前左转函数 左右电机都正转 但各自的转速不同实现转弯 { motor_left(1,9); //左电机正转 速度为9 全速为9 此时速度为全速的9/9 motor_right(1,2); //右电机正转 速度为2 全速为9 此时速度为全速的2/9 } 1 2 3 4 **5、**右转 void turn_right() //前右转函数 左右电机都正转 但各自的转速不同实现转弯 { motor_left(1,2); //左电机正转 速度为2 全速为9 此时速度为全速的2/9 motor_right(1,9); //右电机正转 速度为9 全速为9 此时速度为全速的9/9 } 1 2 3 4 **6、**停止 电机驱动上控制两个电机的I/O口都置高电平 void stop() //停止函数 全部置高电平急停 { in1=1; in2=1; in3=1; in4=1; } 1 2 3 4 5 6 好了话不多说我们来看看所有的程序吧 #include #define uint unsigned int //宏定义无符号整型变量 uint #define uchar unsigned char //宏定义无符号字符型变量 uchar //电机驱动引脚定义 ***it in1=P3^2; //右电机in1引脚定义 ***it in2=P3^3; //右电机in2引脚定义 ***it in3=P3^4; //左电机in3引脚定义 ***it in4=P3^5; //左电机in4引脚定义 uint cut=0; //定义整型变量cut 在定时器中装数 ***it red_left=P0^0; //左边红外传感器 检测到黑线高电平 小车向右转 ***it red_right=P2^1; //右边红外传感器 检测到黑线高电平 小车向左转 ***it red_goA=P0^1; //中间共有两个红外传感器 主要用于上坡(由于该车是三轮,前边有个万向轮, ***it red_goB=P0^2; //上陡坡时头会翘起来,导致最前面左右两边的红外传感器检测不到白色,此时使用中间两个传感器 ***it led1=P2^0; //LED灯装饰 ***it led2=P2^2; //LED灯装饰 void motor_left(bit left_core,uchar ENA) //左电机正反转 占空比 { if(left_core==1) //left_core==1 左电机正转 小车直走 { in1=1; if(cut<=ENA) { in2=0; } else { in2=1; } } else //left_core==0 左电机反转 小车倒退 { in2=1; if(cut<=ENA) { in1=0; } else { in1=1; } } } void motor_right(bit right_core,uchar ENB) //右电机正反转 占空比 { if(right_core==1) //right_core==1 右电机正转 小车直走 { in3=1; if(cut<=ENB) { in4=0; } else { in4=1; } } else //right_core==0 右电机反转 小车倒退 { in4=1; if(cut<=ENB) { in3=0; } else { in3=1; } } } void run() //前进 普通速度 { motor_left(1,4); //左电机正转 速度为4 全速为9 此时速度为全速的4/9 motor_right(1,4); //右电机正转 速度为4 全速为9 此时速度为全速的4/9 } void run_go() //前进 快速前进 用于上坡 { motor_left(1,5); //左电机正转 速度为5 全速为9 此时速度为全速的5/9 motor_right(1,5); //右电机正转 速度为5 全速为9 此时速度为全速的5/9 } void stop() //停止函数 全部置高电平急停 { in1=1; in2=1; in3=1; in4=1; } void turn_left() //前左转函数 左右电机都正转 但各自的转速不同实现转弯 { motor_left(1,9); //左电机正转 速度为9 全速为9 此时速度为全速的9/9 motor_right(1,2); //右电机正转 速度为2 全速为9 此时速度为全速的2/9 } void turn_right() //前右转函数 左右电机都正转 但各自的转速不同实现转弯 { motor_left(1,2); //左电机正转 速度为2 全速为9 此时速度为全速的2/9 motor_right(1,9); //右电机正转 速度为9 全速为9 此时速度为全速的9/9 } void Init() //定时器1工作方式1 { TMOD=0x10; //定时器1选择工作方式1 TH1=0xff; //计数器初始值设置 TL1=0x9c; EA=1; //打开总中断 ET1=1; //定时器1的中断允许位 TR1=1; //打开定时器1 } void main() { led1=0; //led1低电平亮 led2=0; //led2低电平亮 Init(); //中断初始化 while(1) { if(!red_left&&!red_right&&!red_goA&&!red_goB) //判断四个传感器都检测到白色 前进 { run(); //前进普通速度 为全速的4/9 } else //否则 四个传感器中有检测到黑色 { if(red_left) //左边传感器检测到黑色 { turn_right(); //右转 } else //否则 右边传感器检测到黑色 { turn_left(); //左转 } } if(red_left&&red_right&&!red_goA&&!red_goB) //左右两边的传感器检测到黑色(识别不到白色)中间为白 { run_go(); //快速前进 速度为全速的5/9 用于上坡 } if(red_left&&red_right&&red_goA&&red_goB) //如果所有的传感器都识别到黑色(识别不到白色) { stop(); //停止 } } } void InterruptTime1() interrupt 3 //中断服务函数 { TH1=0xff; //设置初始值 TL1=0x9c; cut++; if(cut>=10) //当cut的值大于等于10时 { cut=0; //cut清零 } } 总结 在这次做51小车时最重要的是调试程序,因为对于不同的弯道,小车行驶的速度会在转弯时影响红外传感器能不能检测到黑色,速度过快会使是小车冲出赛道,所以需要不停的修改参数进行调速。 再就是对于红外传感器的灵敏度的调试,不同的高度灵敏度不同需要进行不断地调试找最合适的灵敏度,使小车灵敏的检测到黑色。 |
|
|
|
只有小组成员才能发言,加入小组>>
2434 浏览 0 评论
9096 浏览 4 评论
36765 浏览 19 评论
5025 浏览 0 评论
24737 浏览 34 评论
1525浏览 2评论
1740浏览 1评论
2190浏览 1评论
1550浏览 0评论
521浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 03:00 , Processed in 1.440085 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号