轨迹检测和走轨迹控制的程序设计Word文档格式.docx
《轨迹检测和走轨迹控制的程序设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《轨迹检测和走轨迹控制的程序设计Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
![轨迹检测和走轨迹控制的程序设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/eafd7147-7f29-40ca-9a83-085a5a6890a3/eafd7147-7f29-40ca-9a83-085a5a6890a31.gif)
P1.0—P1.3——4路轨迹采样,使用内部的AD转换;
P3.3——用于轨迹采样控制;
P3.4——用于工作指示灯,便于监测系统的工作状态;
P1.4—P1.7——保留,作为扩充,可以作为4路AD输入,也可以连接SPI外设;
INT0——保留,能有一个中断输入,对于许多应用都是十分有益的。
他在设计PCB时还设计了一个扩展区,可以方便的焊接一些器件以扩充功能。
焊好的控制硬件如下:
(点击看大图)
组装后:
(点击看大图)
底部:
前视(注意光电采样器的安装,用的是网线,因是单股硬线,所以可以固定,而且便于调整)
&
#160;
7.2程序设计概述
由于此程序将要完成小车寻迹的所有功能,如果再集中在一个程序文件中处理,将给阅读、调试带来困难,也不便于维护,而且也不符合正规的程序开发方式。
因为正规的程序开发通常需要多人合作,各人负责一部分功能,所以必须将程序分成多个独立的模块,每个模块涉及一个相对独立的功能,相互间确定好接口,这样才能合作完成一个功能复杂的程序。
学习者也应当尝试这种模式。
目前这个小车项目分为4个模块:
主控模块——初始化系统,根据消息调度各模块的功能;
电机驱动模块——包含所有与电机驱动有关的函数,接受控制命令,并付诸实施;
轨迹采样模块——包含所有与轨迹采样有关的处理,结果为与处理后的轨迹状态;
轨迹控制模块——读取轨迹采样所获取的信息,根据需求和策略输出相应的电机控制命令;
将调试的相关功能也纳入此模块。
学会多模块编程是能进行嵌入式应用软件编写的重要标志。
7.3主控模块程序设计
主控模块只负责初始化系统的硬件和软件,而且为了使各模块的相关功能更加内聚,将属于各模块的硬件、变量初始化也交给各功能模块处理,主控程序只负责初始化自用的变量。
此外,主控模块只负责根据消息调用相应模块的处理函数,具体如何处理这些消息由各功能模块中的对应函数决定。
这样设计主要是为了日后便于向使用RTOS(Real-TimeOperatingSystem)过渡,因为一个略为复杂的应用如果需要程序可靠、可维护,最好使用RTOS。
所以作为学习者有必要了解、掌握相关的知识。
7.4电机驱动模块程序设计
因为驱动的H桥电路、码盘采样电路均未变,所以控制的逻辑也不用修改,只需完成:
a)对应I/O口定义的修改,以适应新的MCU资源分配;
b)将两个电机的控制逻辑整合到一个MCU中。
主要工作是逻辑整合。
电机1的引脚控制逻辑关系:
P2.0-CTL1,H桥的左上臂,0电平输出导通,1电平输出截止
P2.1-CTL2,H桥的左下臂,1电平输出导通,0电平输出截止
P2.2-CTL3,H桥的右上臂,0电平输出导通,1电平输出截止
P2.3-CTL4,H桥的右下臂,1电平输出导通,0电平输出截止
电机1控制逻辑:
引脚
桥臂
单极性正转
单极性反转
双极性
惰行
刹车
前半周
后半周
P2.3
右下
1
P2.2
右上
P2.1
左下
P2.0
电机2与电机1完全相同,只是映射在P2口的高4位。
前面所做的单个电机的控制程序,可以很方便的移植过来。
首先将所有与电机对应的变量改为2维数组,一维对应一个电机。
然后在程序中所有涉及电机变量的初始化和赋值的地方改为循环,有关的函数增加一个电机序号参数输入,函数中修改为根据序号处理相应的数组单元。
上述修改的关键在于变量的构建,合理的变量将大大减少程序的处理难度。
在电机输出及测速中断的处理中,没有使用下标变量方式来节省代码,因为需要速度,可以仔细比较使用下标变量时的目标代码与直接指定下标时的差别。
此部分功能暂未作任何改进和添加,只是将两个电机的驱动并入了一个MCU控制。
7.5轨迹采样模块程序设计
轨迹采样器为4个反射式光电采样器,经缓冲后作背景光减除处理,之后放大送单片机AD转换。
此模块完成:
1)采样器的输出AD转换;
2)将AD结果转换为是否在轨迹上的逻辑值;
3)进行预处理,输出轨迹偏移位置信息。
本来期望能按照国外那个桌面寻迹小车的处理方式对采样信号预处理的,但是仔细分析后发现,按目前所用的采样器及轨迹的关系(轨迹通常为2cm宽,而采样器距地面5–8mm)无法实现,因为采样器在黑色轨迹上移动时有一段时间不会有变化,所以没有办法得到一个连续的位置偏移信息(详细请看:
http:
//elm-chan.org/works/ltc/report.html)。
为了便于日后过渡到这种模式,还是将采样器布置为一条直线,相互间距小于轨迹的宽度,而4个采样器的AD结果仍然转换成逻辑值后再作处理。
4个采样器的布置如下:
顶视:
左——右
采样器:
1号2号3号4号
I/O口:
P10P11P12P13
采样值:
1234(PC调试界面中自左至右)
处理时先将采样的模拟值转换为逻辑值,之后将逻辑值转换为一个关于位置的数值,如下面系列图所示,注意光感的位置及PC界面中轨迹采样的数据。
居中(点击看大图):
偏右程度1(点击看大图):
偏右程度2(点击看大图):
偏右程度3(点击看大图):
偏右程度4(点击看大图):
偏左程度1(点击看大图):
偏左程度2(点击看大图):
偏左程度3(点击看大图):
偏左程度4(点击看大图):
通过上述图并结合程序,我想读者应当理解此处是如何处理轨迹采样数据的了。
7.6轨迹控制模块程序设计
因为将前面所编写的电机调试功能纳入此模块,所以先将原来的程序移植过来,主要是修改了对应电机的一些变量,和电机驱动模块一样,也是将所有与电机对应的变量改为2维数组,一维对应一个电机。
程序修改方法也类似。
因为两个电机的转速都在一个MCU中得到,所以修改了读转速的通讯协议:
0x550xAA0x01(帧长)0x04(读转速命令)校验和(1字节)
对应的返回帧为:
0xAA0x550x05(帧长)0x84(转速值返回)电机1转速(2字节)电机2转速(2字节)校验和(1字节)
此外,为了支持走轨迹,增加了一条轨迹行走启动及停止命令,协议如下:
走轨迹控制命令:
0x05.命令参数——1启动,0停止,
命令帧为:
0x550xAA0x020x050x01CS——启动命令
0x550xAA0x020x050x00CS——停止命令
为了能够方便的检测一些工作变量,使程序调试更加直观,增加了一个内存读取命令:
内存数据读取命令:
0x06
0x550xAA0x040x06读数据低地址读数据高地址读数据长度CS
返回帧为:
0x550xAA帧长0x86读数据低地址读数据高地址读数据长度数据N字节CS
增加了这样一个内存数据读出功能,将十分有效的帮助调试一些自身不带Debug功能的单片机,而且由于逐渐向贴片封装过渡,防真头方式的Debug工具也越来越受限制,所以学会在自己的程序中嵌入调试代码也是一个必须具备的功能,即便有JTAG调试功能的单片机,对于机器人这种移动型的应用,或是一些远程控制应用,还是无法发挥作用,必须依靠自己嵌入的调试代码检测程序的状态。
由于我做这个项目的目的不是为了弄出一个性能多么优越的产品或方案,帮助人参加竞赛,或是显示我的“实力”,我的目的是将这个过程记录下来,算是一种学习的途径,希望能给一些入门者以启示,从中能发现一些可以借鉴的方法,如:
一些基本功能的程序如何编写,如何考虑硬件与软件的关系,如何借助于PC机调试等等。
所以,真正走轨迹该如何去控制,并非我所要做的重点,轨迹采样输出以作了那样的转换,对于走简单轨迹而言,我想控制方案应当不是问题,但是要走好,走的流畅还是要花一些功夫的,但这正是我希望大家能共同参与、讨论的内容,而非我的“一家之词”。
将这个悬念留给大家吧!
8、结语
本来计划写8篇的,但写到此后觉得应当结束了,因为该交待的都交待了,下面如果要做就是程序和功能的优化,而这不应该是我来做,我希望能有人尝试,大家来共同讨论,实现一些自己满意的功能。
我所要做的是:
再优化一下设计,看有无可能为大家提供一些不容易自制的零件,将这个项目培养起来,成为一个可以相互交流程序的平台,一个在上面扩充自己所期望的功能的平台。
我认为这一系列文章中已基本介绍了作为入门的大部分技能,主要侧重点是单片机控制程序的编写。
希望这只是一块“砖”,能引来更好的“玉”!
由于自己还有一些其它事情打扰,中间的间隔过长,所以文章有些地方不够连贯、不够严谨,有散乱之感,望大家原谅!
感谢ROBOTDIY网站的支持,谢谢!
也谢谢大家!
(全文完)