




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子技术课程设计报告学 院: 专 业: 年 级: 姓 名: 学 号: 指导老师: 第一章 课程设计任务和总体设计1.1 课程设计任务该课程设计以两人组队的形式,制作寻线型电脑鼠。要求能够在88的迷宫中搜索路径并计算出最短路径。其中迷宫由25mm宽的黑线组成。电脑鼠第一次进入迷宫和返回迷宫时,可以循着黑线走到终点并记录迷宫信息,第二次进入迷宫时,根据第一次所记录的迷宫信息选择最短路径冲刺到终点。1.2 总体设计思路和步骤寻线型电脑鼠不同于以前的走迷宫,是利用红外传感器进行路线探测并选择前进方向的小型智能机器人。其设计步骤包括:系统设计、利用altium designer软件绘制原理图和pcb图,电脑鼠硬件焊接组装、软件代码书写调试和总体调试。硬件部分主要由传感器,单片机,电机驱动组成。传感器采用红外传感器,由发射管和接收管组成,可探测黑线迷宫。单片机采用iap15w413as芯片,用于编写和实现程序。电机驱动由单片机产生的pwm以及l9110芯片进行驱动。软件部分主要由产生pwm函数,搜寻路径法则,记录信息,测速盘组成。此课程设计中电脑鼠按照左手法则进行路线搜索,根据测速盘的计数得到迷宫坐标并储存。第一次排除迷宫中的死路,第二次便可沿迷宫中最短路径走出迷宫。第二章 硬件设计2.1 硬件设计步骤硬件设计步骤如图1所示。设计原理图、生成pcb板之后进行手动布线,再根据pcb板将原件、轮子、轴承、电机、齿轮等器件进行组装,调整传感器角度使之能够达到良好的接受效果。最后进行电路测试,测试方式在软件设计部分说明。2.2 主控模块(单片机)包括单片机(图2)和电脑下载部分(图3)。单片机采用了stc15w4k32s4芯片,其原理图为:图2寻线型电脑鼠pcb板制作单片机电机驱动红外传感器电机等组装原理图绘制调整角度调试检测元器件焊接生成pcb图并布线图1管脚图:图3图42.3 传感器模块传感器模块运用了5对发光二极管(白)+红外光敏三极管(黑)的组合(如图7),成一条直线置于电脑鼠前端用于探测赛道。其中左前与右前的探测器用于纠正电脑鼠直线行走时由于 2 个电机转动不一致导致的轨道偏离。左、前和右方的三个探测器用于探测距离电脑鼠特定距离内的左右和前方有无线路。用于提供红外信号的30khz 多的信号可以由stc15w4k32s4单片机的时钟输出口输出,占空比固定为 50%。当发射的光线集中于白色地区时,光线会被反射,黑色的接收管就会将其吸收;反之,发射光线集中的地方是黑色的时候,光线会被吸收而没有反射。单个的传感器模块如图5图5发光二极管电路图如图6.图6实物图见图7. 图72.4 电机驱动模块电脑鼠的前进、拐弯和旋转等动作必须依靠两个电机的转动来控制。具体为:直行:两个电机同方向转动;转弯:两个电机一个转一个不转或者一个正转一个反转。要使电机转动,需要一定的电压,以电压控制电机的运转。而为了获得一个较为合适的电压值,往往需要调节电阻。通过不断重复地开、关操作,实现我们需要的“脉冲宽度调制”(简称pwm调制)。当pwm信号与电机相连时,电机的旋转速度就可以根据我们的 程序设定来工作。电机正、反转以及刹车的控制是通过两个l9110芯片来控制的。图8为l9110的应用电路图。图8图9为 其原理图。图9除l9110之外,该模块还使用了74hc00芯片参与pwm控制。原理图如图10图102.5 测速模块电脑鼠设计使用直流电机,一方面通过对电机的转速加以运算可获得电脑鼠所在方位,记忆当前迷宫情况;一方面在编程时,了解电机转速对电脑鼠行走速度可以进行更好地控制,使其能够在尽量短的时间内遍历迷宫且走到终点。采用红外发射二极管和红外光敏三极管组成一对对射管实现对两个电机转速进行测量,需要分别在两个电机的一端添加码盘。其实物图如图11.图112.6 电源电脑鼠的电源为5号铁锂电池和7号铁锂电池各一节,分别为单片机和电机供电,提供电压约为3.2v左右。电源原理图如图12所示。图12至此,电脑鼠的硬件设计基本完成,完整的原理图、pcb图见附录。焊接pcb板成品图如图13.图13第三章 软件设计3.1 程序流程图(图14)出发mcu各状态字初始化红外检测,读取传感器的值中断检测到终点路径优化,去除死路检测回到起点最短路径冲刺终点结束图14第四章 最终结果课程设计结果:电脑鼠可完成寻线并到达终点,有时候也能顺利返回起点。在焊接过程中,因为有光立方比赛的经验,焊接工作比较顺利,除了中途有一次不小心将一个芯片的两个引脚焊在了一起,然后我们及时的用仪器解决了这一问题。而软件部分,虽然用的原代码是同学间分享流传的,但是也是通过自己的调试,修改才完成的。另外,在学长的指导下,也对右手算法程序中左转优先级不高这一缺点进行了完善。第五章 总结及体会这次课程设计让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在qq群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。单片机是很重要的一门课程,老师曾说过,如果学好一门单片机,就凭这个技术这门手艺找一个好工作也不成问题。尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习,学好了单片机也就多了一项生存的本钱。最后感谢老师、学长们对我们的精心指导和帮助,感谢同学们对我的帮助。附录1:原理图附录2:pcb图附录3:程序代码#includestdio.h#includeaction.h /电机驱动头文件#include bmp_pixel.h#include nokia_5110.h#includeconfiguration.h u16 gz1 = 0; voidstop_on_going() wheel_control(left,1,255); /1表示正向转,data越大,转速越小 wheel_control(right,1,255); void turn_right() /右转的具体实现 dowheel_control(left,1,32);wheel_control(right,0,45);while(p1&0xf8=0xd8|p1&0xf8=0x98|p1&0xf8=0xc8); void go_straight()/直走的具体实现 wheel_control(left,1,42); wheel_control(right,1,55); void turn_left() do wheel_control(left,1,52); wheel_control(right,1,65); while(left_detector=1); /在左转之前,先走一段距离,直到最左边的灯走出黑线(为实现直走左转) if(middle_detector=0) go_straight(); else do wheel_control(left,0,32);/左齿轮反转,右齿轮正转 wheel_control(right,1,45);while(p1&0xf8=0xd8|p1&0xf8=0x98|p1&0xf8=0xc8); voidturn_back() /调头的具体实现 xxx. dowheel_control(left,0,42);wheel_control(right,1,55);while(p1&0xf8 = 0xd8);voidleft_adjust() /左偏-向右微调的具体实现dowheel_control(left,0,72);/左轮子转速快一点就可以解决左偏问题wheel_control(right,1,55);while(p1&0xf8=0xd8|p1&0xf8=0xc8|p1&0xf8=0xe8|p1&0xf8=0xf0);voidright_adjust() /右偏向-左微调 的具体实现 do wheel_control(left,1,62);wheel_control(right,0,75);while(p1&0xf8=0xd8|p1&0xf8=0x98|p1&0xf8=0xb8|p1&0xf8=0x78);void find_gz();void main()u16 mode = 0;u8 sensor = 0; /功能模块初始化/gpio_config(); /stc15w4k32s4 pwm复用口 由高阻初始化为双向口 exti_config(); /外部中断 测速timer_config(); /定时器pca_config(); /pwm uart_config(); /串口adc_config(); /ad 电压检测/液晶屏初始化lcd_init(); lcd_clear();lcd_draw_bmp_pixel(15,0,bmp,48,56);delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);lcd_clear();lcd_write_english_string(2,0, welcome to );lcd_write_english_string(2,1, s w j t u );lcd_write_english_string(2,2, dns ver 2.1 );lcd_write_english_string(2,3,nokia5110 lcd );lcd_write_chinese_string(1,4,12,6,0,2); /wait for the start key down/while(start_key);/ 延时启动(start按键按下,等待n秒后启动)delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250); delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/lcd_clear(); /开总中断set_ea(); /* add your program here !.*/ while(1) p1=0xff; sensor = p1&0xf8;if(gz1=0)switch(sensor)case 0x10 : /00010000case 0x08 :/00001000case 0x18 : mode = 1; break; /00011000 左转/算法体现,先从左遍历图case 0xa0 : /10100000case 0xd0 : /11010000case 0x88 :/10001000case 0xd8 : mode = 2; break; /11011000 直走case 0x80 :/10000000 case 0x00 : /00000000case 0xc0 : mode = 3; break; /11000000 右转case 0xf8 : mode = 4; break; /11111000 掉头case 0xe0 :/01001000 case 0x78 :/01111000case 0x38 :/00111000case 0xb8 :/10111000case 0x98 : mode = 10; break; /10011000 头右偏,后续调整case 0x90 : you zhuan yi chang chu licase 0xe8 :/11101000case 0xc8 :/11001000case 0xf0 : mode = 11; break; /11110000 头偏左,后续调整 default : mode = 5; break; /其他情况,执行右转switch(mode)case 1 : turn_left(); break; case 2 : go_straight(); break;case 3 : turn_right(); break;case 4 : turn_back(); break;case 5 : find_gz();break;case 10 : left_adjust(); break;case 11 : right_adjust(); break;default : go_straight(); break;void find_gz() gz1 = 1 ; do if(left_detector & left_middle_detector =0) wheel_control(left,0,72);wheel_control(right,1,85); else if(right_middle_detector & right_detector = 0) wheel_control(left,1,62);wheel_control(right,0,75); while(p1&0xf8=0xd8); gz1 = 0 ;/*功能说明*本文件为电机控制程序*/#include action.h/*function name :void wheel_control(bit side , u8 data_ccapnh)*param :side = left or right dir = wheel_front or wheel_back data_ccapnh 为输入ccapnh的8bit数据 *return value :none*description :control the left or right wheels running*/void wheel_control(bit side , bit dir , u8 data_ccapnh) if(dir=wheel_front) /选择的轮子前进 if(side=right) motor_right_control = 1; pwmn_update(pca0,data_ccapnh); else if(side=left) motor_left_control = 1; pwmn_update(pca1,data_ccapnh); else if(dir=wheel_back) if(side=right) motor_right_control = 0; pwmn_update(pca0,data_ccapnh); else if(side=left) motor_left_control = 0; pwmn_update(pca1,data_ccapnh); /*function name :void turnright()*param :none*return value :none*description :控制电脑鼠向右转*/#if in_placevoid turnright() u8 flg=1; tx1_write2buff(0xdd); left_count=right_count=0; wheel_control(left,wheel_front,speed_init_left); wheel_control(right,wheel_front,speed_init_right); while(flg=1) if(right_count=60|left_count=60) wheel_control(left, wheel_front,speed_init_right); wheel_control(right,wheel_back, speed_init_left); if(left_count=125|right_count=125) wheel_control(left,wheel_front,0xff);/左轮停止 wheel_control(right,wheel_back,0xff); left_count=0; right_count=0; flg=0; #elsevoid turnright() u8 flg=1; left_count=right_count=0; wheel_control(left,wheel_front,speed_init_left); wheel_control(right,wheel_front,0xff); while(flg=1) if(left_count=90|right_count=90) wheel_control(left,wheel_front,0xff);/左轮停止 left_count=0; right_count=0; flg=0; #endif/*function name :void turnright()*param :none*return value :none*description :控制电脑鼠向左转*/#ifin_place void turnleft() u8 flg=1; tx1_write2buff(0xee); left_count=right_count=0; wheel_control(right,wheel_front,speed_init_right); wheel_control(left,wheel_front,speed_init_left); while(flg=1) if(right_count=60|left_count=60) wheel_control(right,wheel_front,speed_init_right); wheel_control(left,wheel_back,speed_init_left); if(right_count=125|left_count=125) wheel_control(right,wheel_front,0xff); /右轮停止 wheel_control(left,wheel_back,0xff); left_count=0; right_count=0; flg=0; #elsevoid turnleft() u8 flg=1; left_count=right_count=0; wheel_control(right,wheel_front,speed_init_right); wheel_control(left,wheel_front,0xff); while(flg=1) if(right_count=90|left_count=90) wheel_control(right,wheel_front,0xff); /右轮停止 left_count=0; right_count=0; flg=0; #endif/*function name :void turnback()*param :none*return value :none*description :控制电脑鼠向后转*/void turnback() u8 flg=1; tx1_write2buff(0xff); left_count=right_count=0; wheel_control(right,wheel_back,speed_init_right); /右轮后退 wheel_control(left,wheel_front,speed_init_left); /左轮前进 while(flg=1) if(left_count=115|left_count=115) wheel_control(right,wheel_back,0xff); / 关闭右轮
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家委会工作管理制度
- 库房目视化管理制度
- 强化地板厂管理制度
- 影视器材室管理制度
- 微党校党员管理制度
- 心理与课堂管理制度
- 快手安全与管理制度
- 快餐厅考勤管理制度
- 总经理授权管理制度
- 感染科电梯管理制度
- 声波检测报告
- 2023年国考真题(附答案)
- 个案工作知识点隋玉杰主编
- 乙状结肠癌护理查房
- 2022年高考真题及答案解析《历史、地理、政治》(广东卷)
- 信息素养通识教程:数字化生存的必修课(中山大学)超星尔雅学习通网课章节测试答案
- 朗文4B 复习提要及朗文4B单词及句子
- TSGD0012023年压力管道安全技术监察规程-工业管道(高清晰版)
- 运动控制系统阮毅陈维钧课后答案清华大学出版社
- 光伏电站项目工程资料清单
- YY/T 0003-1990病床
评论
0/150
提交评论