because_sky 2006-10-20 08:10 PM
寻迹小车 FollowMe-----转载自robotdiy
寻迹小车 FollowMe-----转载自robotdiy
作者:[color=#0000ff]Hanker[/color]
[color=#0000ff][/color]
[color=#0000ff][/color]
[color=#0000ff][/color]
[color=#0000ff]寻迹小车 FollowMe—— 之一:起因、目标及车体设计[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align]
一、 背景两年前的6月,我发表了一篇有关机器人入门的文章 —— “[url=http://www.robotdiy.com/article.php?sid=166][color=#0000ff]关于初级机器人入门项目的设想[/color][/url]”,没有得到响应。两年来,论坛上的变化有限,仍然缺少可以连续关注的主题。由于那时我还有工作在身,所以只能提提设想,没有办法自己去尝试。现在我已不需要应付工作,可以做一些想做的事了。眼看又到了暑假,旧话重提,但这次我想通过我的具体行动促成这件事,希望能得到响应。
在这两年中,我一直在关注、思考这方面的问题:如何能让有意学习嵌入式控制的人得到有效的帮助?感谢一位网友所发的“国外机器人俱乐部”的帖子,通过浏览这些俱乐部的网站,我受到了很大的启发,同时也激发了我做此事的热情。
这次,我想通过完整的记录一个寻迹小车的设计、制作过程,来引导想入门的人,并且通过这个过程形成一个相对一致的平台,此后大家可以以这个平台为基础,逐步构建一个相对集中、持久的主题,不断进行交流、提高。这是我期望的目标。
因为我希望有人能与我同行,所以将文章的题目设为:寻迹小车[i]FollowMe[/i]。
为了有可能做到这一点,我将整个过程分为8次发表,每周一次,从设计构思开始,直到最后的调试结果,这样有意参与者可以同步实施,还可以相互交流。我将公布所有的技术细节,包括结构设计图、电原理图、PCB、软件等等,以及设计中是如何考虑的,器件选择的依据,调试中所遇到的问题等。希望能起到抛砖引玉的作用,更希望在这个过程中有人也能发表自己的作品,形成一个“百花齐放、百家争鸣”的局面。 二、 概述以自制方式为主制作一辆低成本的寻迹小车,用于学习嵌入式应用(单片机),这个项目有两个基本的出发点:
[list=1][*]便于自制,成本低廉,可以让大多数人参与;[*]有可以改进的空间,包括机械性能和电器性能,为进一步学习、提高提供可能。
还有一个潜在的延伸目标:
[b]利用这个平台引入国外较流行的比赛项目 —— MiniSumo。[/b][/list]我觉得轨迹赛虽然比较普及,但是缺少趣味,改进的激励因素偏少。而MiniSumo是对抗性项目,趣味性大大增加了,比赛场地要求也比较低,只需一个70cm 的圆台即可,便于开展。对于参与者而言,改进小车的激励因素较多,可以促使学习者得到更多的收获。
但是轨迹项目是最好的入门项目,所以还是以此开始。
三、需求分析基于上述目标,这个项目的需求如下:
[list][*]外形尺寸不大于10*10cm(MiniSumo的规则要求);[*]在满足走轨迹的要求的同时兼顾 MiniSumo 灵活性的需求;[*]机械机构要简单,取材要方便,便于自制;[*]成本要低(期望车体部分控制在50 - 60元左右,连基本的控制部分 200元以内);[*]电机要有一定的改进可能,便于逐步提高机械性能,以满足MiniSumo的要求;[*]电机的驱动电路也要有可能扩充,以满足电机的要求;[*]控制部分要容易上手,有便宜的开发手段;[*]控制部分要有扩充、提高的可能,满足MiniSumo中的高级需要;[*]控制部分组成要灵活,便于不同学习目标的人有所选择。[/list]四、车体设计4.1设计依据
因为要考虑日后能够用于MiniSumo竞赛,所以车体尺寸必须在 10*10cm 范围内。而且MiniSumo 对车的运动灵活性要求较高,基本不能考虑模型汽车的转向机制,所以将利用模型底盘改制的可能排除了,必须使用两轮转向机制的结构。
车体设计主要考虑的因素有:底盘、电机选择、驱动方式。
[b]底盘设计:[/b]为了便于制作,日后在上面安装其它东西方便,同时具有一定的重量,使小车运行稳定,所以采用 10mm 厚的聚氯乙烯板材制作,此材料便宜,加工特性好,可以直接打孔攻丝,不像有机玻璃那样易碎,只是美观差一些。外形设计成圆型,主要是为了在MiniSumo 中不至于频繁的互相卡死。
[b]电机:[/b]电机的选择是最困难的,既要便宜,又要容易使用,还要有改进提高的可能。四驱车的130电机应当是最好的选择,此种电机有便宜到几块钱的,也可以花费上百元改制,使之性能大大提高。如果选择带减速机构的电机,驱动方式是很方便,直接将轮子固定在齿轮箱的输出轴上即可,但不足是:其一是价格高,通常一只在30元以上。其二是改变电机性能比较困难。所以还是选择了130电机。
[b]驱动方式:[/b]因为选择了130电机,驱动方式就相对麻烦。开始受到论坛上曾介绍的那辆纽扣电池小车的启发,才决定采用130电机的,因为他那种摩擦传动方式比较容易实现。后初步尝试了一下,效果不好,主要是压紧了之后,电机轴与轴套间的摩擦损耗太大,压松了打滑。后改用皮带传动才得以实现。
之所以没有选择齿轮传动,主要是因为没有选到合适的齿轮,而且觉得难以得到不同规格的齿轮,想改变传动比就很困难。用皮带传动只需改变传动轮的大小即可得到所需的传动比,而传动轮制作比齿轮方便许多。
为了简单且不受制约,轮子自制,轮胎用O型密封圈,轮毂和皮带传动轮合并,采用尼龙棒车制。传动皮带也是用O型密封圈。这种方式可以按照自己的需求随意改变轮子的大小和宽窄,比较灵活。O型密封圈规格较多,取材方便,价格也便宜,通常在一元以下一只。
车体采用了两轮驱动方式后,另外一个支撑点就成了问题,多数万向轮对于这个10cm 的小车来说太大了。我为此设计了一个使用10mm钢珠的球形支点,在摩擦小的时候是滑动,摩擦大时滚动,性能基本能满足要求,且价格很便宜,总共不到2元钱。
4.2 详细设计
车体中底盘、轮毂、小传动皮带轮(安装在电机轴上的)、球形支撑座采用自制方式,详见所附设计图纸。
固定电机采用最常见的固定管线夹,规格20mm的,大部分五金电器店均有。
目前设计的传动比为8:1,轮胎选用内径30mm、粗5mm的O型密封圈。
传动皮带选用内径 35mm、粗1.8mm的O型密封圈。
为了轮子转动灵活,中心嵌入了一个内径3mm、外径10mm、厚度4mm的滚珠轴承,轮子安装结构见附图。
之所以将车轮设计为直径约40mm,是为了底盘下有一定的高度,便于安装光电头,用于检测轨迹以及以后的MiniSumo中检测是否到边。
其它就是一些螺丝、螺母、垫圈等通用件了。
这样的小车底盘虽说不十分完善,但是相对来说基本满足了多数要求,且在上面比较容易构建自己的结构,目前底盘上所设计的四个M3的螺丝孔就是为了安装25mm的垫柱,构成2层平面,以安装控制部分。还可以升到3层,安装自己需要的东西。关键是取材容易,便于自制,价格不高,除去几个自制件和电机,其它的东西购买不超过15元。
以下是我在验证设计可行性过程中制作的原型及一些选用的标准件,供参考。
小车车体原型:
[align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/image001.jpg[/img]
正面
[/align][align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/image002.jpg[/img]
反面
[/align][align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/image003.jpg[/img]
加装一个安装平面
[/align][align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/image004.jpg[/img]
O型密封圈
[/align][align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/image005.jpg[/img]
固定管线夹
[/align][align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/image006.jpg[/img]
滚珠轴承[/align]附件(所有文件为PDF格式,每个文件为100K-120K):
[list=1][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_01.pdf][color=#0000ff]底盘设计图[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_02.pdf][color=#0000ff]轮毂及皮带传动轮设计图[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_03.pdf][color=#0000ff]滚珠轴承盖设计图[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_04.pdf][color=#0000ff]小皮带传动轮设计图[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_05.pdf][color=#0000ff]球形支撑座设计图[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_06.pdf][color=#0000ff]车轮安装示意图[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_07.pdf][color=#0000ff]球形支撑示意图[/color][/url][/list](未完待续)
参考资料:1、 摩擦传动方式的桌面寻线小车 http://elm-chan.org/works/ltc/report.html
2、 MiniSumo竞赛规则 http://www.botlanta.org/MonthlyContest/sumo/mini-sumo.html
3、 MiniSumo 竞赛视频
http://www.robotgames.net/photogallery/wcrg2004/Videos/Mini-Sumo%20(advanced).mpg
提示:由于文章是分开多节上传到网站上,为了方便大家讨论,请把相关的问题集中在[url=http://www.robotdiy.com/phpbb2/viewtopic.php?p=48671][color=#0000ff]这个帖子[/color][/url]上,这样可以方便作者回答大家的问题,谢谢!
[/color]
because_sky 2006-10-20 08:10 PM
寻迹小车 FollowMe—— 之二:控制部分硬件设计概述及电机驱动部分设计[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align]前面(请参考:[url=http://www.robotdiy.com/article.php?sid=261][color=#800080]寻迹小车 FollowMe--之一:起因、目标及车体设计[/color][/url])完成了小车结构部分的设计,下面开始对小车的控制部分硬件进行设计,主要涉及电机的驱动、轨迹采样、逻辑控制三个主要部分。
五、控制部分硬件设计5.1 整体构思因为这个项目的主要目的是通过实施学习单片机的使用,并且主要是自用而非有针对的参加某项比赛,所以最好所制作的硬件电路能够为进一步学习提供帮助,或者可以作为自己其它项目的实施基础。
为此,我将系统框架设计为:
[align=center][img=512,299]http://www.robotdiy.com/images/FollowMe_robot/Diagram_Structure.gif[/img][/align]其中电机驱动、逻辑控制部分均为独立的单片机系统,这样设计主要出于:
[list][*]单片机已十分便宜,可以像普通IC那样使用;[*]电机驱动逻辑比较简单,但是实时性要求较高,所以独立出来,编程较为容易,便于初学者上手;[*]电机驱动部分通常会有较大的干扰,尤其是驱动普通的直流有刷电机,电刷的火花干扰很强,单独使用简单、但抗干扰能力强的单片机可使系统更加可靠;[*]电机驱动部分独立做成一个模块后可以在以后自己的其它项目上使用,增加投入的附加值,例如作为RCX(乐高的控制器,参考:[url=http://www.robotdiy.com/article.php?sid=10][color=#0000ff]RCX的三个版本[/color][/url])的大功率电机驱动器;[*]对于走轨迹项目而言逻辑部分并不十分复杂,完全可以将电机控制部分融入其中,但是这样系统就不容易修改为其它用途,编程难度也增加了,不利于学习;[*]采用独立的逻辑控制便于学习者掌握构建复杂系统的能力,学会多模块协同工作时如何交换信息、如何协调。目前在控制上利用单独的智能节点完成单一任务,采用通讯方式将这些独立节点组合实现复杂的功能是一个趋势。[*]采用独立的逻辑控制模块便于学习者随时根据学习需要替换为所要学习的单片机,目前我所采用的可能是51系列的,而日后如需要,可以随时替换为ARM或其它我所关注的型号,这些新的单片机通常都有成品模块出售,具有完善的数字、模拟以及通讯接口,这样设计就十分容易接入,达到学习、评估的目的。[/list]5.2 单片机的选型依据因为项目的目标是学习单片机的应用,所以我还是选用了51系列的单片机,因为51的架构十分典型,便于初学者理解,同时其公共资源是最多的,便于初学者自学和交流。
选择用于学习的单片机我认为主要考虑以下方面:
[list][*]价格便宜;[*]开发手段便宜;[*]自己动手焊接相对容易(最好不选用BGA封装的,或是脚距小于0.5mm的)[/list]基于上述考虑,我选择了宏晶科技的STC12C5410AD单片机,价格仅10元左右。它可以使用简单的串口编程(ISP),不需要专门的编程设备,自制一个串口适配器最多10元,如果选用现成的USB转串口产品,也只要40-50元(注意:不是每种USB转串口产品都可用)。下载软件厂家免费提供,开发成本很低。封装有SMD及DIP模式,SMD也是1.27mm脚距的,很好焊接。
很多人排斥51系列的原因是认为51资源较少,也比较慢,这实际上是最早的8051给人留下的印象,也是多数教材中所描述的,而实际上51架构已发生了很大变化,其资源已十分丰富,速度也有很大提高,以此款STC12C5410AD来说,其资源为:10K FlashROM ,512字节RAM,8路10位AD,4个PCA(可实现PWM、脉冲捕捉等定时功能),速度也十分快;详情可上该公司的网站上查询。
其它还有许多51架构的单片机具有优异的特性和特点,如:
[list][*]TI的MSC系列具有一个24位AD,十分适合做高精度的仪器;[*]SiliconLAB公司的51F系列单片机速度极快、功耗低、体积小、资源丰富,有各种不同的规格,最快的达100MPS ,引脚还可编程确定功能;[*]ST公司的uPSD3xxx系列,有较大的内存,可以内置汉字库,还集成了片内PLD;[*]Chipcon公司(现归属TI)的CC2430芯片将ZigBee无线通讯协议和51核集成,可构成ZigBee无线节点;[*]Nodic公司的nRF24E1 芯片将2.4GHz的无线收发模块与51核集成,可方便的实现短距离无线通讯。[/list]还有很多类似的产品,此处就不一一例举。主要是想说明,51架构还是有其优势的,否则不会有如此多的公司基于51架构开发出这么多产品。
至于可靠性、性价比等指标在学习时可忽略,设计产品时才需要考虑这些因素。
从另一个角度来说,由于目前编程通常使用C语言,所以对单片机的依附已不十分紧密,只是在设计硬件线路及程序中对硬件初始化时要涉及器件,而程序的逻辑部分几乎与硬件无关,所以选择什么单片机学习没有什么绝对的好与坏,关键看自己可利用的资源。
5.3 电机驱动部分硬件设计因为考虑到做好后的驱动电路最好可用于其它场合,所以硬件设计上预留了许多功能。而且为了便于在其它场合使用,体积和封装都作了考虑。
5.3.1 需求
[list][*]可驱动一个直流电机,驱动电压范围 5 – 12 V, 电流 10 - 20 A;[*]电机驱动要支持4种工作模式:正转、反转、惰走、制动;[*]控制信号可接受:UART、SPI控制,标准的宽度1 – 2 ms 、周期20ms的 PWM 控制;[*]可支持脉冲反馈,实现调速而非调功;[*]可根据脉冲计数控制行走距离。[*]可检测转动方向;[*]支持第二路反馈的脉冲信号,以实现转速跟踪;[/list]5.3.2 概要设计
使用 STC12C54XX 系列51单片机控制,使用 MOSFET管构成 H 桥驱动,并使用门电路实现互锁,避免造成 MOSFET 短路。驱动管设计为可双管并联,以便于扩充驱动电流。
采用独立模块方式,一个模块驱动一个电机,为了能实现多个电机的连锁,提供一个跟踪通道,捕获需要跟踪的电机(轮子) 的转速,自动调整自己的速度,以实现准确的直线行走,或其它类似的目的。
5.3.3 详细硬件设计
以STC12C54XX 单片机为控制核心,该芯片具有4个通道的PCA,可以方便的实现转速脉冲测量和方向判断,同时也便于接受PWM控制信号。同时此款单片机为 1T的高速工作模式,可以使用定时中断控制MOSFET,因为需要实现4种电机工作模式,所以使用了4个IO独立控制H桥的4个MOSFET ,不能使用简单的PWM 输出控制。
因为用 4 个IO独立控制,所以必须避免MOSFET出现短路,使用2块4-2与非门构成互锁逻辑,保证不出现同侧上下MOSFET同时导通的情况。借此也可以隔离电机的噪声对单片机的影响。
因为需要支持5 – 12 V的电机工作电压,而且互锁逻辑输出还差一级反向,所以控制MOSFET使用双极性三极管9013,这样可使用普通的MOSFET,便于购买。(如果不使用9013 ,则需要选用逻辑电平控制的MOSFET)
在线路及PCB的设计上,考虑MOSFET的双管并联工作,以便于日后需要提高驱动能力。
供给电机的电压直接接MOSFET,同时经稳压器SPX1117-3.3V稳压输出后供单片机和门电路,单片机选择3V的,门电路选用 74HCxx ,这样,电机的工作电压可以低到 5 V(4节充电电池)。
单片机硬件资源分配:
P2.4 – P2.7 :用于驱动 H桥;
PCA3 : 用于电机的PWM输出,工作在定时器模式;
PCA2/P2.0:用于主测速脉冲输入,工作在捕获模式,边沿触发;
P2.1 : 主脉冲输入方向辅助输入,用于判断转动的方向;
PCA1/P3.5 :用于跟踪脉冲输入,工作在捕获模式,边沿触发;
P3.4 :跟踪脉冲的辅助输入,用于判断方向;
PCA0/P3.7 : 用于PWM控制信号输入,,工作在捕获模式,边沿触发;
P1.4 – P1.7 :用于 SPI控制输入;
P1.2 、P1.3、P2.2、P2.3、INT0、INT1:用于连接无线模块PTR4000,以便实现无线控制;
P1.0、P1.1 :保留作为ISP 的控制口;
P3.0 – P3.1 :用于 UART控制输入
T1 : 用于产生 UART 的波特率
T0 :系统时基;
因为希望体积小一些,可以装入一个 59 X 35 X15 mm的标准小机壳中,元器件采用的是表贴器件,将控制和H桥驱动分开,做成两块PCB,这样可以灵活一些,既可以使用独立的驱动器驱动,也可以用逻辑控制部分直接驱动,体积因此也缩小了。
两块PCB之间采用直针连接,形成类似于4层板的结构,抗干扰性有所改善。PCB采用1mm厚板材。
为了便于自行扩充,同时减少PCB的面积,所有输入输出均采用空中对接插头。
(如果实在不愿意使用表贴器件,也可以采用DIP封装的,用一块试验线路板作为第二层平台,直接在上面焊接元器件,试验线路板有双面和单面的,双面的略贵,约10元/块,单面的只要1-2元/块。但是这样做出来的东西只能用于这个小车了,在其它场合使用将会横不方便。)
详细电原理图和PCB图见附件。
所用标准件的照片:
[align=center][img=320,320]http://www.robotdiy.com/images/FollowMe_robot/box.jpg[/img]
59 X 35 X15 mm的标准小机壳:(市场有售,1.5元/只)[/align](未完待续)
附件:
[list=1][*]电机驱动控制部分电原理图([url=http://www.robotdiy.com/images/FollowMe_robot/DRV-CTRL.SCH][color=#0000ff]Potel格式[/color][/url],[url=http://www.robotdiy.com/images/FollowMe_robot/Follow_Me_Robot_DRV_CTRL.pdf][color=#0000ff]PDF格式[/color][/url])[*]电机驱动H桥部分电原理图([url=http://www.robotdiy.com/images/FollowMe_robot/DRV-HBRI.SCH][color=#0000ff]Potel格式[/color][/url],[url=http://www.robotdiy.com/images/FollowMe_robot/Follow_Me_Robot_DRV_HBRI.pdf][color=#0000ff]PDF格式[/color][/url])[*][url=http://www.robotdiy.com/images/FollowMe_robot/MOTORDRV.PCB][color=#0000ff]电机驱动部分的PCB图(两块板拼图,采用V切工艺,Potel格式,340K)[/color][/url][*][url=http://www.robotdiy.com/images/FollowMe_robot/List.XLS][color=#0000ff]元器件清单(供参考,Excel文件,18K[/color][/url])[*][url=http://www.robotdiy.com/images/FollowMe_robot/Connector.jpg][color=#0000ff]空中对接插头资料(jpg文件,166K)[/color][/url][/list]参考资料:
1、 STC12C51XX系列单片机数据手册 http://www.mcu-memory.com/
2、 TI MSC 系列单片机
http://focus.ti.com.cn/cn/mcu/docs/mcugeneralcontent.tsp?sectionId=98&tabId=1515
3、 SiliconLAB公司的51F系列单片机 http://www.xhl.com.cn/
4、 ST公司的uPSD3xxx系列 www.upsd8051.com
5、 Chipcon公司(现归属TI)的CC2430芯片
http://focus.ti.com.cn/cn/docs/prod/folders/print/cc2430.html
6、 Nodic公司的nRF24E1 芯片 http://www.freqchina.com/nRF24E1.htm
because_sky 2006-10-20 08:11 PM
寻迹小车 FollowMe—— 之三:轨迹采样及逻辑控制部分硬件设计[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align]
前面已完成了[url=http://www.robotdiy.com/article.php?sid=261][color=#800080]车的主体[/color][/url]和[url=http://www.robotdiy.com/article.php?sid=262][color=#800080]控制部分中的电机驱动器设计[/color][/url],以下着手轨迹采样及逻辑控制部分的硬件设计。
5.4 轨迹采样及逻辑控制部分硬件设计5.4.1 设计背景轨迹采样部分没有考虑采用独立方式,主要是因为控制过程中需要一些过渡信息,以便于编程者实现自己独特的控制逻辑。
由于寻迹小车逻辑不太复杂,而且项目主要目的是引导初学者入门,所以逻辑控制仍使用STC12C410AD单片机。实际上电机控制部分目前并未用到AD功能,主要是为了和逻辑控制部分统一,便于采购,所以均选用了带AD的芯片(对应有不带AD的,价格只便宜1元)。
同时,为了逻辑控制部分可以单独工作,比如作为RCX的输入扩展器,实现类似我以前发表过的“LEGO用轨迹传感器”的功能,所以在设计上做了考虑。
由于采样部分和逻辑控制部分合并后,无法排入一块可以放在前述小机壳中的PCB,所以也采用的双板结构,这样又多出一部分空间,就增加了一个小电流的驱动电路,以便可以实现一个简易的小车。
5.4.2 需求[list][*]采集4路反射式光电采样器;[*]根据采样信号输出相应的电机控制信号,实现走轨迹;[*]可以通过串口输出电机控制信号[*]可以输出标准的PWM(宽度1 – 2 ms 、周期20ms)电机控制信号;[*]可以直接输出两个电机的H桥控制信号,以便省去电机驱动控制,实现低成本的小车,或者用于提高编程的难度;[*]支持模拟输入功能,可接GP2D12 等模拟量输出传感器;[*]提供一路PWM方式的DA转换输出,以便作为RCX的输入扩展模块。[*]电源应支持单节电池供电,以便于作为独立模块使用。[/list]5.4.3 概要设计采用STC12C54xxAD系列单片机作为控制核心,控制、采集4路采样电路,采样电路中设计了背景光去除功能。
电源设计了从1V升压到5V的电路,以便于为扩充的输入器件供电,如GP2D12。而后再经3.3 V稳压器降压作为MCU的电源。这样设计使用1 - 2节7号或5号电池就可以工作,体积大大缩小。
电机驱动部分设计提供最大1A的驱动能力,电机的工作电压可变,以满足不同电机的需要。
5.4.4详细硬件设计STC12C54xxAD系列单片机有8路10位AD转换器,虽说采用的是扫描方式逐个完成,但其一个通道的A/D转换时间在22.1184MHz 主频下只需约10us,加上通道间的切换时间,4个通道采样时间不到60us,所以可以满足4通道轨迹采样的要求。由于P1.0、P1.1 有可能要作为ISP编程的控制引脚,所以用P1.4 – P1.7 四个通道作为轨迹采样通道。
MCU资源分配汇总:
I/O口:
P1.0 — P1.1 —— ISP控制口, 兼作通用模拟输入口;
P1.2 — P1.3 —— 通用模拟输入口;
P1.4 — P1.7 —— 4路光电采样信号输入;
P2.0 — P2.3 —— 马达1 的4个驱动,使用PCA2 控制;
P2.4 — P2.7 —— 马达2 的4个驱动,使用PCA3 控制;
P3.0 — P3.1 —— TXD、RXD端,作为ISP使用,兼作为通用的串口;
P3.2 — P3.3 —— 通用的开关量输入口,
P3.4 —— 工作指示灯
P3.5 —— 用PWM输出模拟信号给 RCX;
P3.7 —— 控制光电采样器的背景采样,4路共用!
内部资源:
T0 —— 系统时基
T1 —— 串口波特率
PCA0 —— 生成背景采样控制,编程时看是用时基程序控制,还是PWM硬件控制。
PCA1 —— D/A输出给 RCX
PCA2 —— 马达1 的PWM控制
PCA3 —— 马达2 的PWM控制
INT0、INT1 —— 保留给开关量输入。
采样电路中第一级作为电压跟随器,提高输入阻抗,减少后级电路对光电管的影响,同时增加驱动能力,保证在Tx1截止、Tx2导通状态下,能可靠的对Cx1充电,实现对背景光强度的记忆。
第二级是一个减法器,同时兼作放大。采样时,Tx1导通,点亮LED,Tx2 截止,第二级的输入实际上为此时的光电信号减去刚才电容上记忆的信号,达到了去除背景光的目的。
PCA1 设计为DA输出用的PWM,以提供RCX输入所需的模拟信号,由于单片机采用的是3.3 V电源,输出使用LMV358做了电平转换,同时使用一个全桥电路实现与RCX的“无极性”连接。为了降低二极管带来的电压损失,使用了4个肖特基二极管,其正向压降约为0.15V,而普通整流管约为0.6V。
电源采用NCP1402开关型升压芯片,所需器件较少,电路简单,输出电流约200 mA(详查NCP1402手册)。
电机驱动部分使用的是长电的SS8050和SS8550作为功率驱动,标称最大电流1.5A。为了便于使用不同的电压驱动电机,电路上将电机驱动电压分开,其中的电阻值需要根据所使用的电压确定。由于空间有限,没有设计短路防护,在编程时要十分注意。而且只设计了H桥下臂的两个二极管,作为PWM调功必须的续流通路,省去了上臂的保护二极管,所以在软件编写时须注意,尽量避免同时切断所有桥臂,导致电机线圈产生高压,击穿三极管。
发光二极管的设置主要是为了便于监测程序的运行状态,可以根据需要改变LED闪烁的方式,达到调试或状态检测的目的。
电路设计上为了便于作为其他用途,PCB上留出了可以扩充的I/O口,包括:
[list][*]4路可作为模拟输入的I/O口,接内部A/D转换器;[*]2路数字I/O,接内部外部中断,可灵活作为各种用途的监测;[*]TXD、RXD串口,既作为编程的接口,也可在执行用户程序时作为通用的数据接口;[*]提供了3.3V和5V两种电源,便于扩充需要。[/list]为了增加灵活性、减小PCB,仍然采用软线引出,使用空中对接插头连接(插头资料见之二的附件),这样可以方便的按照自己的需要接出所需的信号,而不会受制于直接设计在PCB上的插座的约束。
从PCB的设计上可以看出,如果需要更复杂可靠的轨迹采样,可以再接一块采样板,使用保留的4路A/D通道,实现8个轨迹采样或者其他特殊的需求。
5.5 硬件设计总结至此,控制硬件设计基本完成,综观上述设计,尤其是PCB的设计,应当可以看出,整个设计的宗旨均贯穿着这样的理念:
[list][*]便于灵活的组合,以达到不同的目的,满足不同的需求;[*]尽量使所做的东西可以不断的被利用,以发挥其最大价值;(两个部分总共有4块PCB,他们可以灵活组合,每一块PCB又都可以方便的作为其它用途:)[*]H桥部分可以作为其它主控板的功率驱动部分;[*]采样部分也可以单独作为光电采样的信号预处理;[*]电机驱动器的控制部分可作为一个通用的最小系统,方便的构成一些智能部件 。[/list]硬件设计到此为止,在实施中也许会做适当改进。
(未完待续)
附件:
1、 [url=http://www.robotdiy.com/images/FollowMe_robot/followme_robot_logic.rar][color=#0000ff]电原理图、PCB(RAR压缩文件)[/color][/url]
2、 [url=http://www.robotdiy.com/images/FollowMe_robot/followme_robot_logic.XLS][color=#0000ff]元器件清单(Excel文件,供参考)[/color][/url]
参考资料:
1、 NCP1402 数据手册
2、 《电动机的单片机控制》王晓明编著 北京航空航天大学出版社
because_sky 2006-10-20 08:11 PM
寻迹小车 FollowMe—— 之四:电机驱动软件设计[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align]
前面已完成了[url=http://www.robotdiy.com/article.php?sid=261][color=#800080]车的主体[/color][/url],[url=http://www.robotdiy.com/article.php?sid=262][color=#800080]控制部分中的电机驱动器设计[/color][/url]和[url=http://www.robotdiy.com/article.php?sid=263][color=#800080]轨迹采样及逻辑控制部分硬件设计[/color][/url],从本篇开始着手各部分的软件设计。
六、控制部分软件设计因为在硬件设计中,将电机驱动和逻辑控制分成了两个独立的模块,所以在软件设计时也将分别设计。
6.1 电机驱动模块软件设计根据前面的硬件设计,电机驱动模块可以独立成为一个智能的功率驱动器使用,在硬件的设计中考虑了可以支持多种控制信号。但在目前的项目中,拟使用串口控制方式,以下的软件设计是基于这个前提的。
6.1.1 软件要实现的功能
[list=1][*]接收并解析控制命令;[*]使电机有良好的驱动特性,可正、反转动,且转动平稳、有力;[*]可靠的获取转速反馈信号;[*]根据反馈信号使用有效的控制策略使电机达到所需的转速;[*]利用码盘的反馈信号控制行走距离;[*]可以根据命令实现电机的特殊运行状态:刹车、惰行。[/list]在上述功能中,真正影响驱动器性能的是第二项(驱动特性)和第四项(控制策略)。虽然通常认为控制策略最重要,在自动控制中所着笔墨最多,但是在我们这个项目中,因为电机特性不是十分理想,驱动又是通过软件完成的,这两部分组成的执行机构如果没有良好的特性,那有再好的控制算法、策略也无法实现良好的电机驱动。
6.1.2 概要设计
根据要实现的功能,软件分为以下几个部分:
[list=1][*]命令接收解析 —— 完成命令接收,命令内容解析;[*]电机PWM驱动 —— 根据电机控制参数产生驱动信号,使电机进入期望的运转状态;[*]速度反馈 —— 读取码盘信号,计算出速度数据,兼完成计数功能,实现行走距离控制;[*]控制策略 —— 根据命令给出的数据和反馈得到的数据计算出电机控制参数,实现速度控制;[/list]电机驱动实际上构成了一个典型的自动控制系统:
[align=center][img=622,154]http://www.robotdiy.com/images/FollowMe_robot/PID_Control.gif[/img][/align]
其中的“PID调节器”由软件的控制策略部分实现,驱动器硬件只提供了电流的开关、放大功能,而主要的驱动特性实现是由软件中电机PWM驱动完成。
这样设计使得系统的灵活性增强,同时便于学习者掌握控制的实质,领会其中的奥妙。
软件总体框架采用消息驱动方式,根据消息作相应的处理,消息多数由中断产生,如:接收到串口数据、码盘光电采样中断等,对于没有中断源的信号,由系统的时基产生的中断定时查询、处理。
电机驱动所需的PWM信号在中断服务程序中完成,因为需要比较准确的脉冲宽度和周期。
虽然硬件设计上考虑了许多扩充功能,但是在目前的寻迹小车项目中不是都需要,所以在此对于脉冲输入只处理一个主速度检测脉冲,主方向、跟踪测速脉冲、方向等功能留到有具体需求时再做考虑。
无线模块的控制也是留作日后有需求时再作考虑。
测速用码盘用CAD 软件绘制后打印在纸上,然后用双面胶贴在轮毂上,使用反射式光电采样器采样。我所设计码盘如下:
[align=center][img=700,326]http://www.robotdiy.com/images/FollowMe_robot/encoder.gif[/img][/align]
因为码盘的分辨率较低,所以采用测周期的方式来得到转速。如果按照正常的脉冲测量方式,采集一个跳变沿,那这个码盘一圈只能得到10个数据,为了提高性能,利用了STC12C54XX 单片机PCA模块的正、负跳变均能中断的特性,一周可获取20个数据。为了避免脉冲的占空比不等带来的问题,采用正跳对正跳、负跳对负跳的测量方式。
程序的流程如下:
[align=center][img=556,505]http://www.robotdiy.com/images/FollowMe_robot/Software_Flow.gif[/img] [/align][align=center]多个子程序流程图[/align][align=center][img=310,550]http://www.robotdiy.com/images/FollowMe_robot/Software_Main_Flow.gif[/img] [/align][align=center]主流程图 [/align]
6.1.3 详细设计
6.1.3.1 命令接收及解析
在硬件设计上虽然考虑了多种控制的可能,那是为了日后这个硬件可以满足不同的需要,而目前的设计使用串口控制。
考虑到这个小车要使用两个驱动电机,所有在串口的连接上采用并接方式,即将两个电机驱动器的接收端RXD、发送端TXD并联,RXD并联没有问题,而TXD端并联必须将口特性置为标准51口(有内部弱上拉电阻的准双向口),以保证口输出的正常,同时通过协议保证不同时发送。
并接后的串口相当于一个设备,接受逻辑控制部分的命令。
基于这样的设计,[b]通讯协议[/b]设计如下:
帧格式:
[i]帧头(2字节) 帧长(1字节) 命令字(1字节) 数据区(N字节)校验和(1字节)[/i]
其中:
[b]帧头[/b] —— 0x55 0xAA
[b]帧长[/b] —— 命令字 + 数据区的长度
[b]命令字[/b] ——
[list][*]0x01 :电机转动控制参数,开环模式,电机的PWM值、转动持续脉冲数;[*]0x02 :电机转动控制参数,闭环模式,电机的转速、转动持续脉冲数;[*]0x03 :电机工作参数,PWM频率、PID参数[/list][b]数据区[/b] ——
[list][*]命令01:电机1数据(2字节PWM值,2字节转动持续脉冲数)电机2数据(2字节PWM值,2字节转动持续脉冲数),共 8字节;[*]命令02:电机1数据(2字节转速值,2字节转动持续脉冲数)电机2数据(2字节转速值,2字节转动持续脉冲数),共 8字节;[*]命令03:2字节PWM频率,2字节比例系数,2字节积分系数,2字节微分系数,2字节PID系数的分母, 共10字节,两个电机驱动器相同;[/list][b]校验和[/b] —— 从命令字开始到数据区结束所有字节的算术和的反码,取低字节。
上述数据中,PWM值,速度值、PWM频率、PID系数等定义如下:
[b]PWM值[/b] —— 2字节有符号数,正对应正转,负对应反转,数值为占空比的百分数,取值范围:- 1000 —— +1000, 对应 0.1% ~ 100%;1001为电机“惰行”,1002为“刹车”;
[b]转动持续脉冲数[/b] —— 2字节无符号数,0 表示连续转动;
[b]转速值[/b] —— 2字节有符号数,正对应正转,负对应反转,单位为:0.1转/每分钟;取值范围:- 10000~ +10000,10001为电机“惰行”,10002为“刹车”;
[b]PWM频率[/b] —— 2字节整数,单位Hz,取值范围:200 – 2000;因为不同的电机所需的PWM 频率不同,需要通过测试确定,所以考虑了此参数;
[b]PID系数[/b] —— 均为 2字节无符号数;
[b]PID系数分母[/b] —— 2字节无符号数,为避免使用浮点数而增加了此参数,实际作用的PID系数为上述值除此值;如:比例系数为190 ,PID分母为200,实际比例系数为0.95。
以上所有2字节数据均为先低后高顺序发送。
暂时不设计应答帧,因为一帧命令包含了两个电机的驱动数据。
通讯数据格式为:19200bps 8 N 1。此时,一帧数据约占 7ms。
数据接收缓冲区采用环形结构,为了节省指针运算的时间,缓冲区长度设为 32字节,对应指针变量的低5位。
设置2个数据指针处理,一个存数指针负责将接收到的字节填入缓冲,一个取数指针负责取出填入的数据。初始化时两个指针相等,当收到数据时,在存数指针指向的缓冲区位置填入数据,而后指针加一,指向下一位置,此时两个指针不再相等,产生收到数据消息。
为减少中断服务占用的时间,在串口中断中只激收到的数据填入接收缓冲区,不做任何处理。
主程序根据两个指针是否相等判断是否收到数据,因为缓冲区足够接收完整个数据帧,所以,接收处理时先判断是否收到了“帧头”,之后根据“帧长”设定一个帧尾指针位置,等到存数指针等于帧尾指针时,再将数据帧一起取出,进行校验和判断,如果正确,根据命令字解析数据区,取出相应的参数。
具体实现过程参见所附程序。
6.1.3.2 电机PWM驱动
根据《[url=http://www.robotdiy.com/phpbb2/viewtopic.php?t=8007][color=#0000ff]电动机的单片机控制[/color][/url]》中对直流电机驱动的描述,同样的H桥电路,使用不同的控制信号,可以实现两种不同的控制方式,其一是“双极性可逆PWM驱动”,其二是“单极性受限可逆PWM驱动”。
对于“双极性可逆PWM驱动”方式,电机在一个PWM周期中通过相反的电流,正转、停止、反转取决于两个方向电流的持续时间,如果相等则为停止。这个方式的好处是低速稳定,启动快,但是耗电大。
对于“单极性受限PWM驱动”方式,电机在一个PWM周期中的电流是同方向的,驱动电机的功率大小取决于电流的持续时间,也就是说在一个PWM周期中,电机的电流有为“0”的时候,称之为“断流”现象。无疑,这种方式在PWM值较小时断流的时间就较长,电机运行就不稳定,也就是低速性能不好,但是由于没有反向电流消耗,所以耗电少。
(对于这部分的描述请仔细阅读书中相关章节)
基于这样的原理,拟采用如下控制方式:
在PWM控制值小于30%(此值调式时再作调整)时,采用“双极性可逆驱动”,大于30% 则采用“单极性受限可逆驱动”。
为了可以获得最好的电机驱动特性,将PWM周期设计为可变,这样在调试中可以找到合适的工作参数。
具体实现方法为:
设置如下变量:
FirstHalf —— 位,前半周标志,为“0”表示处在PWM周期的后半周;
FirstOut —— 字节,前半周电机控制输出字,控制H桥的导通和截止;
SecondOut —— 字节,前半周电机控制输出字,控制H桥的导通和截止;
FirstTime —— 字(2字节),前半周持续时间;
SecondTime —— 字(2字节),后半周持续时间;
在程序中设置“计算电机控制参数”标志,当PWM的数据变化时,则建立此标志,根据PWM的值及PWM的周期计算出上述数据:
先根据PWM的值判断应当处于哪种驱动模式。
如果是“单极性受限PWM驱动”模式,则直接根据PWM值和PWM的频率即可计算出前、后半周期持续时间。然后再根据转动方向给出电机输出控制字。
如果是“双极性可逆PWM驱动”模式,根据PWM值、转动方向、PWM频率计算出钱后半周的持续时间,其前、后半周的电机输出控制字不随转动方向变化,其转动方向由前、后半周持续时间的比例决定。
基于前面设计的硬件电路,控制引脚对应关系如下:
P2.4 - CTL 2, H 桥的左下臂,1 电平输出导通, 0 电平输出截止
P2.5 - CTL 1, H 桥的左上臂,0 电平输出导通, 1 电平输出截止
P2.6 - CTL 3, H 桥的右上臂,0 电平输出导通, 1 电平输出截止
P2.7 - CTL 4, H 桥的右下臂,1 电平输出导通, 0 电平输出截止
(注:上面的1、2顺序颠倒是由于PCB排版造成的。桥臂的位置描述是根据原理图的位置表述的。)
电机控制逻辑:
[align=center][img=676,146]http://www.robotdiy.com/images/FollowMe_robot/Motor_control_logic.gif[/img][/align]电机输出控制字根据上述控制逻辑产生。
电机的控制输出用PCA3的中断产生,将PCA3设为“16位软件定时器”模式,通过在中断中不断加载比较器的内容实现PWM输出。因为对应最高2000Hz的PWM频率,一个周期持续时间只有500us,时间很短,所以将PCA置为高级中断,以消除中断响应滞后带来的偏差。同时简化中断的处理,使中断服务时间尽量短,以保证其它程序功能正常。
“计算电机控制参数”标志的建立有两个来源,一个是串口所发的开环控制命令,二是闭环模式下PID控制所产生。这样设计可以方便的使电机驱动器工作于不同的模式。
具体实现细节见程序。
到此,电机驱动器已可以作为常见的“调功方式”电机驱动器使用了。速度反馈和PID闭环控制下一篇叙述。
(未完待续)
附件:
1、[url=http://www.robotdiy.com/images/FollowMe_robot/Motor_Control_Program.rar][color=#0000ff]电机驱动模块程序压缩包(RAR压缩格式,10KB)[/color][/url]
含:
[list][*]MotorDrv.c C51程序[*]STC12C5410AD.H STC12C54XX的C语言头文件,内有所有SFR的定义[*]Port_Def.H 对应硬件设计的I/O口变量定义[*]constant.H 程序中硬件初始化参数、符号化常量的定义[*]Motor_Var.H 程序中全局变量的定义[/list]注:程序只通过了编译,还未调试,所以会有不妥之处,仅供参考。
参考资料:
1、 STC12C54XX 数据手册
2、 《电动机的单片机控制》王晓明编著 北京航空航天大学出版社
because_sky 2006-10-20 08:12 PM
寻迹小车 FollowMe—— 之五:电机测速及转速控制[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align]前面已完成了[url=http://www.robotdiy.com/article.php?sid=261][color=#800080]车的主体[/color][/url],[url=http://www.robotdiy.com/article.php?sid=262][color=#800080]控制部分中的电机驱动器设计[/color][/url],[url=http://www.robotdiy.com/article.php?sid=263][color=#800080]轨迹采样及逻辑控制部分硬件设计[/color][/url]和[url=http://www.robotdiy.com/article.php?sid=264][color=#800080]开环控制功能[/color][/url],此篇涉及电机的测速和转速控制。 6.1.3.3 转速测量因为本项目的主要目的是学习单片机的应用,能够低成本的实现功能是主要目标,性能的要求相对弱一些,所以测速选择了简易码盘作为速度反馈信号,使用反射式采样,由于担心反射式采样的分辨率有限,所以只设计10个黑印,我所选择的反射采样器是Sharp的GP330,其特点是反射距离远,受自然光干涉少,作为轨迹采样十分适合,但作为码盘采样有些“粗”了。建议有意尝试者改用其它的小体积、近距离的反射采样器,这样分辨率会高一些,可以多印一些黑印,以提高转速测量的速度和精度。
最好使用透射式码盘,但是那样结构就相对复杂一些,但测量的分辨率可以大大提高。
因为是反射式采样,输入信号不会很好,所以在硬件设计时就做了考虑,线路如下:
[align=center][img=799,390]http://www.robotdiy.com/images/FollowMe_robot/Decode.gif[/img] [/align]
输入电路设计一个回差较大的比较器,以避免信号不好带来的误脉冲,而且回差可以通过R7(R10)来调整,还可以通过改变R12(R14)来改变输入信号幅度,通过改变R5和R6(R8和R9)的比值来改变比较的门槛电平,这样设计的目的是:
a) 弥补反射式采样器安装带来的偏差;
b) 尽量使输出的脉冲信号接近50%的占空比,为倍速测量提供可能。
M_Speed 信号接入单片机的PCA2 端, 使用STC12C54XX PCA模块的捕获模式:
[align=center][img=859,521]http://www.robotdiy.com/images/FollowMe_robot/PCA_Capture_Mode.gif[/img][/align]
从图中可以看出,在捕获模式下,很容易实现对脉冲周期的测量,但是由于我们不能保证得到的脉冲周期是50%占空比的,虽然码盘可以保证,但判断电平的变化无法避免。所以必须在软件上做略为复杂的运算,实现相同跳变之间的时间测量。
设置2对时间计数器,分别记录对应跳变的上次时间和本次时间,即可计算出相应的周期。之所以在硬件上还要通过调整使输出尽量接近50%,是为了输出的速度数据尽量分布均匀,便于调速功能使用。
使用这种方式使一圈可以输出20个速度值,提高了一倍。
因为这种周期测速方式,速度值的输出间隔和转速相关,不像使用测脉冲频率的方式,可以基本保证一个等时间间隔,这对于PID方式的调速控制有些麻烦,因为数字化的PID控制算法多数是以等时间间隔为基础的,为此测速部分除了要返回转速值外,还要返回本次测速经历的时间(即周期),以便于PID控制部分作相应的修正。
为减少中断服务的时间,在中断中只记录时间,不做速度计算,建立标志后又主程序负责计算。
6.1.3.4 行走距离控制这是测速功能的一个副产品,利用对码盘的脉冲计数,可以方便的实现对行走距离的控制,按目前的码盘精度,可以控制到1.3 cm左右(轮子周长约 13 cm,一圈10个分割)。因为占空比不能保证,所以只能取一个边沿信号计数。
程序中设计为正跳沿处理脉冲计数。因为是控制行走距离,所以应当在结束时采用“刹车”控制,使轮子尽快停下。
这个功能还是有些作用的,比如预先知道轨迹的情况下,提前在转弯处减速,以保证寻迹的可靠。
因为算法比较简单,不再赘述,详见程序。
6.1.3.5 电机PID调速控制PID控制算法源于模拟控制方式,其控制的结果和反馈是连续不断的,可以用一个数学模型来表示。而数字式的PID控制算法如果要接近模拟的效果,采样的间隔必须足够小,也就是要求有足够快的采样速度,否则会由于数据反馈的滞后带来较大的偏差,导致系统不稳定。
由于目前所用的简易码盘方式不可能有快速的采样,而且还会由于速度的变化使采样间隔发生变化,相当于在控制回路中增加了一个较大的滞后环节,所以系统的特性不会很好,只是能够借此学习一下PID控制的算法,体会一下PID控制的感觉。由于控制对象的不确定、不理想,倒是增加了学习的挑战性。
从这里分析可以看出,要想得到好的电机控制效果,良好的速度采样机构是必须的,所以在FIRA足球机器人中,所用的电机多为Fanhaimer的空心杯电机,且带有512线(直接连在电机输出轴上,一圈512个脉冲)的码盘,由于它的电机转速较高,其减速比也较大,综合后相当于我们这个的1000倍,这样的采样分辨率就可以采用定间隔频率采样方式了。
基于学习的目的,这里还是参照《电动机的单片机控制》书中所介绍的算法对PID控制做一个尝试,至少可以让转速作相应变化,不至于出现以下现象:
因为电机的负载太轻(尤其是经过减速的电机),即使供给最小的PWM值,电机还是以全速转动,但是负载加大一点,电机又不转了,失去了调速的功能。
书中介绍了两种数字PID算法,对于直流电机的控制,应当采用位置式PID控制。从便于实现的角度考虑,采用通过增量式控制算法递推得到,详见书中描述:
[align=center][img=800,972]http://www.robotdiy.com/images/FollowMe_robot/PID.gif[/img][img=800,918]http://www.robotdiy.com/images/FollowMe_robot/PID02.gif[/img] [/align]
如上所示,书中对两种算法作了清晰的描述,在设计阶段,完全按照上述的算法编写程序,在调试阶段,再考虑利用书中所介绍的各种改进的算法结合具体的情况修改。(因为书中的描述已十分全面,所以采用了直接引用的方式,以免耽误了读者,因为我这方面也没有深入的研究。)
书中所提供的程序是汇编语言实现的,此处采用C语言实现,原理一样,只是可读性会好一些。
程序的基础是上面文中的 (4-7)式和(4-9)式,作为原始数据,保存最近三次的速度值和最近两次的时间间隔,通过计算可以得到: Ek、Ek-1、Ek-2 以及对应的变化量,取两次时间间隔的平均值作为T,此处也可以看出,必须要调整硬件参数,以尽量保证输出脉冲的占空比为50%,因为测量的时间间隔就是脉冲的高、低电平时间(见程序中的速度计算函数)。
而算式中的Kp、Td、Ti将作为待调整参数,可以通过参数设置命令设置。在调试时确定。
目前的程序先从PWM初值“10%”开始,调试时如果感觉效果不好,考虑通过测量PWM值和转速之间的关系,得到一个根据命令转速值确定一个对应PWM初值的关系式,在收到速度命令后设定一个PWM初值,尤其在启动以及转速变化较大时。
具体实现过程见程序。
至此,一个完整的电机控制程序已完成,期望可以实现“调功”和“调速”两种功能,但实际的效果有待调试后才能知道,下次将描述电机控制部分调试中遇到的问题及效果。
(未完待续)
附件:1、电机驱动模块程序压缩包
含:MotorDrv.c C51程序
STC12C5410AD.H STC12C54XX的C语言头文件,内有所有SFR的定义
Port_Def.H 对应硬件设计的I/O口变量定义
constant.H 程序中硬件初始化参数、符号化常量的定义
Motor_Var.H 程序中全局变量的定义
注:程序只通过了编译,还未调试,所以会有不妥之处,仅供参考。
参考资料:1、 STC12C54XX 数据手册
2、 《电动机的单片机控制》王晓明编著 北京航空航天大学出版社
because_sky 2006-10-20 08:12 PM
寻迹小车 FollowMe—— 之六:电机驱动部分调试[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align][align=left]6.2 电机驱动模块调试[/align]6.2.1 调试前准备电机驱动部分程序已全部编完,进入实际调试阶段,为了便于调试,在PC机上编写了一个测试程序,以实现发送PWM控制值、转速控制值,以及设置PWM频率、PID参数,使调试的过程更方便。
由于电机驱动部分支持了转速测量的功能,为了在调试中能直观的看到转速的变化,增加一个读转速命令,命令帧格式如下:
[i]0x55 0xAA 0x02(帧长) 0x04 (读转速命令) 电机序号(1字节)校验和(1字节)[/i]
返回帧为:
[i]0xAA 0x55 0x04(帧长) 0x84 (转速值返回) 电机序号(1字节)转速(2字节)校验和(1字节) [/i]
其中:
[b]电机序号[/b] —— 从1开始;
[b]转速值[/b] —— 2字节有符号数,正对应正转,负对应反转,单位为:0.1转/每分钟;
[b]校验和[/b] —— 从命令字开始到数据区结束所有字节的算术和的反码,取低字节。
PC机调试界面如下:
[img=772,433]http://www.robotdiy.com/images/FollowMe_robot/Debug_Interface.jpg[/img]
按下“读取”按钮后程序每秒读一次速度值并显示,再按则停止读取。
在单片机程序中也要加入相应的程序。见程序附件。 利用上述程序实现了参数设置和转速读取的功能,但是对于小车这类移动性的应用,使用有线的方式通讯将给调试带来困难,因为小车自身重量和动力都有限,如果拖上一根通讯电缆,将影响小车的运动,使得调试时观察的结果大打折扣。而且运动范围也受到影响,可能无法实现调试的目的,因为小车还没有运动到稳态就被电缆拖住了。
所以上述调试软件如果要切实发挥作用,还必须有一个无线的信道,而且要是使用串口的,否则单片机很难支持(或者要花费较大精力),成本还不能高。
正巧找到了一个低价的无线收发模块,加了一片单片机控制,构成了一个无线串口转换器。这个转换器对于通讯的双方而言是“透明”的,与原来有线通讯一样,只是中间有些延时。
因为目前笔记本电脑很少有串口了,所以在这个转发器上设计了USB转串口的功能,提供一个TTL电平的串口,这一方面为无线转发器接入PC提供了方便,另一方面为STC12系列单片机提供了一个USB口的ISP(在线编程器),为那些没有串口的PC机学习者提供了方便。
串口无线转发器的功能示意如下:
[img=647,140]http://www.robotdiy.com/images/FollowMe_robot/Robot_Wireless_Communication.gif[/img]
转发器的内部结构如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/USB2Wireless.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/USB2Wireless_mini.jpg[/img][/url]
作为PC机侧的串口无线转发应用模式如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/USB2Wireless_Box.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/USB2Wireless_Box_mini.jpg[/img][/url]
作为单片机侧的串口无线转发应用模式如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Wireless_MCU.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/Wireless_MCU_mini.jpg[/img][/url]
作为STC12系列单片机ISP(在线编程)使用如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Wireless_MCU_02.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/Wireless_MCU_02_mini.jpg[/img][/url]
对于PC机侧,使用USB口入(在PC机内虚拟为一个串口,程序按串口控制),无线出。对于单片机(小车)侧,使用TTL电平串口信号入,无线出。
目前所做的转发器为固定波特率,串口为 19200bps 8 N1,无线为19200bps。因为使用的也是STC12系列单片机控制,所以修改很方便,自身的USB转换器就可以为自己编程。
这个串口无线转发器对于调试移动类的机器人项目应当很有帮助,拿最常见的轨迹项目来说,如果能在调试时不断返回小车的速度、控制状态、采集的信号,我想调试者也不用一次次盲目地改变参数。在走线失败的情况下,也不至于靠猜测的原因来修改程序了。
6.2.2 调试步骤[list=1][*]调试测速脉冲输入 —— 确定采样器的位置和对应电路中的参数,以使输入MCU的脉冲信号尽量为50%占空比;[*]调试几个特定PWM值下的PWM频率 —— 确定针对所用电机的最佳PWM频率。[*]调试不同PWM值的电机转动状态 —— 分成空载和有载测试,根据转速变化和运动状态确定双极性驱动、受限单极性驱动的转换点。[*]测试不同PWM值命令的转速变化 —— 为PID参数设置做准备,可能要增加一个连续返回转速的功能,通过PC机来计算出转速变化的飞升曲线。[*]根据《电动机的单片机控制》书中4.4节所描述的“经验法”确定PID参数。观察效果。因为各方面的客观条件制约,所以这个PID参数调试过程主要是感受一下三个参数给最终结果带来的影响。[/list]6.2.3 调试记录电机驱动器内部结构如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Controller_HBridge.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/Controller_HBridge_mini.jpg[/img][/url]
电机驱动器外形:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Controller_HBridge_Box.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/Controller_HBridge_Box_mini.jpg[/img][/url]
6.2.3.1 码盘采样调试码盘安装:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Encoder_Installation.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/Encoder_Installation_mini.jpg[/img][/url]
采样器输入波形:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Wave_01.jpg][img=240,195]http://www.robotdiy.com/images/FollowMe_robot/Wave_01_mini.jpg[/img][/url]
从输入波形(码盘采样电路中U5的2脚)看,输入的电压最大值3.16V,最小值1.88V,中心值为 2.52V,VCC为3.3V,由此可算出,比较器的判断中值应该为0.76VCC,这样可以得到:
R5 = 10k, R6 = 33k
根据信号的幅度(2.52 +/- 0.6V)可以将比较器的回差定为0.3V,即输入上升时大于2.8V、下降时小于2.2V时输出发生翻转。
根据上限计算:R7 = 14.39k —〉15k,
根据下限计算:R7 = 50k,
因为上下分压电阻的差异,所以导致不对称,同样的电阻,对上限的作用小,下限的作用大,用适当抬高判断的中心值来弥补,即将R6 改为43k, R7 选用 43k,根据这个值计算出实际的上下限为:
上限 = 2.78V ; 下限 = 2.28V
基本符合所期望的值。
按上述参数焊接的电路结果如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/Wave_02.jpg][img=240,196]http://www.robotdiy.com/images/FollowMe_robot/Wave_02_mini.jpg[/img][/url]
上图中蓝色为输入波形,黄色为比较器输出波形(U5 的1脚),即输入到单片机的信号。注意两道蓝色横线所对应的电平,上面一根电压为2.92V,对应输入信号上升的转换点(即上限),下面一根电压为2.28V,对应输入信号下降的转换点(即下限),和前面的计算基本一致。(输入中的蓝色毛刺信号可能是测量时接触不良带来的,也可能是电机的干扰)。
6.2.3.2 电机PWM控制调试因为衡量PWM的效果需要测量速度,而测速时出现以下问题:
在测量转速中发现,转速有跳变的现象,结合上面的波形分析,估计是毛刺干扰造成,应当在设计硬件时加以防护,目前硬件已做好,且是表贴器件,不易加装滤波元件,故考虑用软件消除。
从波形上可以看出,毛刺通常为负尖脉冲,影响正跳边沿。所以考虑:
[list=1][*]以负跳的周期为基准,当正跳周期相对于对应的负跳周期偏差大于一定值时,则不要此次的正跳数据。[*]将脉冲计数处理改在负跳周期处理。[/list]但是,程序修改后效果仍不理想,用示波器观察后发现,电机在高速转动时带来的干扰很大,而且所用的两个电机干扰还不同,一个略好,这可能与所用电机的电刷质量有关,我目前所用的是奥迪291系列玩具遥控车的电机,工作电压3V,可能性能一般。基于这个情况,我只能将调试的大概情况汇总一下,抛砖引玉,供日后有意尝试者参考。
测量的转速波动见前面的PC调试界面。
PWM控制的效果汇总如下:
[list=1][*]由于采用的电机供电电压是5V,而电机额定工作电压是3V,所以可使电机转动的PWM值范围可从25% ~ 100%;[*]双极性驱动效果不好,电流很大,但是电机转动比较勉强,是否是由于电机的特性不好造成,还有待仔细测试;[*]PWM的频率变化会带来电流的变化,频率越高电流越小,好像力矩也小了,这与我事先的预测相同:由于电机的感性阻抗作用,随着PWM频率的升高,感抗增大,导致电流减小。尤其我所使用的电机是遥控车电机,额定电流较小,线圈圈数必然较多,感抗自然就较大。[*]什么样的PWM频率最合适可能要根据电机的特性决定,有一个想法:可否在低占空比时采用高PWM频率,而高占空比则降低PWM的频率,这样可以弥补低占空比带来的“断流”问题,以及高占空比带来的高频阻抗问题。这还有待尝试。[*]虽然电机的干扰较大,导致测速脉冲输入有毛刺,但是单片机似乎没有因此而误动作,因为脉冲定数转动功能一直是正常的,所以要解决的问题是测速干扰。[/list]小车测试的状态如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_finished.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/FollowMe_robot_finished_mini.jpg[/img][/url]
测试的过程见所附视频文件。
由于直行会很快遇到障碍物,来不及测量、观察,所以采用了单轮转动模式测量,这样可以在原地不动。调试时使用了无线串口转换器,效果很好。
从图中可以看出,这样的结构有些累赘,正好有个大学生基于这篇文章设计了一个方案,使用一片MCU实现完整的小车寻迹,所有电路在一片PCB上,单片机仍然使用的是STC12C5412AD,我觉得这样更合理,所以准备着手基于这个方案继续,完成小车寻迹功能。而前面所做的电机驱动器可以用在一些要扩充电机驱动能力和改善电机驱动的场合,如增加RCX的驱动能力,或者让RCX能够驱动非LEGO电机等。
单板方案的PCB如下:(点击看大图)
[url=http://www.robotdiy.com/images/FollowMe_robot/PCB.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/PCB_mini.jpg[/img][/url]
因为目前的转速测量存在问题,PID转速控制暂时无法调试,待转速测量问题解决后再进行。
6.3 补白以上调试的纪录主要目的是为了能让有意学习者了解如何去实施,需要什么手段?应该如何着手?遇到问题该如何处理?那段输入采样电路的计算、调试过程本打算忽略,但我尝试问了一下周围的大学生,很遗憾。所以我还是详细的记录了这个过程,希望能够帮助学习者了解理论、实践的关系,学会分析问题。
出现的干扰问题是意料之中的,因为这是直流电刷电机的最典型特点,但是对于学习者而言,如何能消除这个干扰,却是一个很好的锻炼机会,因为在工业控制中,抗干扰是个非常重要的课题,而火花干扰是最常见的干扰形式。
当然,如果是以小车的性能为核心目标,那不妨尝试使用无刷直流电机。
程序在调试中做了多处修改,望及时更新,以免前面的Bug产生误导。
(未完待续)
附件:
1、 [url=http://www.robotdiy.com/images/FollowMe_robot/Motor_Control_Program.rar][color=#0000ff]更新后的电机驱动程序压缩包[/color][/url](含调试用PC侧程序)
2、 [url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Debug.wmv][color=#0000ff]调试过程片断(视频)[/color][/url]
胡泊 2006-10-20 09:12 PM
虽然以前有人发过了,不过你这个格式更清楚一些,辛苦辛苦,精一个!
留心 2006-10-21 11:02 AM
学习了,收藏了。。。。
Lee 2006-11-26 09:48 PM
嗯,总结的确实不错。这篇文章的作者丁先生在南京开办了“嵌入式之梦”工作室,他是一位非常不错的技术人员,而且很有经验哦。有兴趣的可以访问丁先生公司的网站([url=http://www.embedream.com]http://www.embedream.com[/url]),了解更多。
胡泊 2006-11-27 03:32 PM
原来是他的啊,现在我经常和他聊QQ
weixinnan 2006-12-1 10:41 PM
:D 谢谢哦,极力支持 !
jones 2006-12-31 04:03 PM
呵呵
一个不错的例子
jones 2007-1-21 09:53 PM
今天看到了实物了
感觉还挺精致
太子 2007-4-18 10:30 AM
好手.......好東西
:)
jones 2007-4-20 01:34 PM
寻迹小车 FollowMe—— 之七:单MCU控制的程序设计[align=center]作者:[url=http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&u=3954][color=#0000ff]Hanker[/color][/url][/align][align=left]前面的章节:[/align][list=1][*][url=http://www.robotdiy.com/article.php?sid=261][color=#0000ff]车的主体[/color][/url];[*][url=http://www.robotdiy.com/article.php?sid=262][color=#0000ff]控制部分中的电机驱动器设计[/color][/url];[*][url=http://www.robotdiy.com/article.php?sid=263][color=#0000ff]轨迹采样及逻辑控制部分硬件设计[/color][/url];[*][url=http://www.robotdiy.com/article.php?sid=264][color=#0000ff]开环控制功能[/color][/url];[*][url=http://www.robotdiy.com/article.php?sid=265][color=#0000ff]电机测速及转速控制[/color][/url];[*][url=http://www.robotdiy.com/article.php?sid=267][color=#0000ff]电机驱动部分调试[/color][/url];[/list]本来应当着手轨迹检测和走轨迹控制的程序设计,但为了让学习者更易实施,此篇改为基于单MCU控制的程序设计,本篇主要完成电机驱动部分,即将前面所述的电机驱动合并到一个MCU中。
从前一篇文章中已看到,使用我原来设计的方案在这个小车上有些不合理,如果再加上一个控制板,则更显“臃肿”,而正巧我认识的一个大学生基于前面的设计自己做了修改,采用一片MCU完成小车寻迹的所有功能,从设计的PCB上看,这个方式更适合学习者采纳,所以我暂且放弃了前面的设计,用这块PCB继续完成后面的内容——寻迹控制。
7、单MCU控制的程序设计7.1、硬件简介这个学生所作的修改主要是将原来设计的三个MCU功能合并到一个MCU中,简化了一些备用的功能,如转动方向采集、无线模块控制等,而主要功能实现的电路与原来相同,如:电机的驱动部分、码盘的采样部分、轨迹的采样部分。
[img=715,536]http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Signal_Motor_Control.gif[/img]
主要修改的是MCU的资源分配,电路如下:
图中:
P2.0 — P2.3 —— 电机1 (左)驱动,使用PCA2 ;
P2.4 — P2.7 —— 电机 2 (右)驱动,使用PCA3;
P3.7 —— 电机1 (左)的码盘采样,使用PCA0;
P3.5 —— 电机2 (右)的码盘采样,使用PCA1;
P1.0 — P1.3 —— 4路轨迹采样,使用内部的AD转换;
P3.3 —— 用于轨迹采样控制;
P3.4 —— 用于工作指示灯,便于监测系统的工作状态;
P1.4 — P1.7 —— 保留,作为扩充,可以作为4路AD输入,也可以连接SPI外设;
INT0 —— 保留,能有一个中断输入,对于许多应用都是十分有益的。
他在设计PCB时还设计了一个扩展区,可以方便的焊接一些器件以扩充功能。
焊好的控制硬件如下:
[url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_AssemblyBoard.jpg][img=240,180]http://www.robotdiy.com/images/FollowMe_robot/FollowMe_AssemblyBoard_Mini.jpg[/img][/url](点击看大图)
组装后:
[url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Assembly_Robot.jpg][img=345,314]http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Assembly_Robot_Mini.jpg[/img][/url] (点击看大图)
底部:
[url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Under.jpg][img=335,295]http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Under_Mini.jpg[/img][/url] (点击看大图)
前视(注意光电采样器的安装,用的是网线,因是单股硬线,所以可以固定,而且便于调整)
[url=http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Assembly_Robot_Front.jpg][img=312,344]http://www.robotdiy.com/images/FollowMe_robot/FollowMe_Assembly_Robot_Front_Mini.jpg[/img][/url] (点击看大图)
7.2 程序设计概述由于此程序将要完成小车寻迹的所有功能,如果再集众一个程序文件中处理,将给阅读、调试带来困难,也不便于维护,而且也不符合正规的程序开发方式。
因为正规的程序开发通常需要多人合作,各人负责一部分功能,所以必须将程序分成多个独立的模块,每个模块涉及一个相对独立的功能,相互间确定好接口,这样才能合作完成一个功能复杂的程序。学习者也应当尝试这种模式。
目前这个小车项目分为4个模块:
主控模块 —— 初始化系统,根据消息调度各模块的功能;
电机驱动模块 —— 包含所有与电机驱动有关的函数,接受控制命令,并付诸实施;
轨迹采样模块 —— 包含所有与轨迹采样有关的处理,结果为与处理后的轨迹状态;
轨迹控制模块 —— 读取轨迹采样所获取的信息,根据需求和策略输出相应的电机控制命令;将调试的相关功能也纳入此模块。
学会多模块编程是能进行嵌入式应用软件编写的重要标志。
7.3 主控模块程序设计主控模块只负责初始化系统的硬件和软件,而且为了使各模块的相关功能更加内聚,将属于各模块的硬件、变量初始化也交给各功能模块处理,主控程序只负责初始化自用的变量。
此外,主控模块只负责根据消息调用相应模块的处理函数,具体如何处理这些消息由各功能模块中的对应函数决定。
这样设计主要是为了日后便于向使用RTOS(Real - Time Operating System)过渡,因为一个略为复杂的应用如果需要程序可靠、可维护,最好使用RTOS。所以作为学习者有必要了解、掌握相关的知识。
7.4 电机驱动模块程序设计因为驱动的H桥电路、码盘采样电路均未变,所以控制的逻辑也不用修改,只需完成:
a) 对应I/O口定义的修改,以适应新的MCU资源分配;
b) 将两个电机的控制逻辑整合到一个MCU中。
主要工作是逻辑整合。
电机 1 的引脚控制逻辑关系:
P2.0 - CTL 1, H 桥的左上臂,0 电平输出导通, 1 电平输出截止
P2.1 - CTL 2, H 桥的左下臂,1 电平输出导通, 0 电平输出截止
P2.2 - CTL 3, H 桥的右上臂,0 电平输出导通, 1 电平输出截止
P2.3 - CTL 4, H 桥的右下臂,1 电平输出导通, 0 电平输出截止
电机1控制逻辑:
[table=90%][tr][td=1,2]引脚[/td][td=1,2]桥臂[/td][td=2,1]单极正转[/td][td=2,1]单极反转 [/td][td=2,1]双极[/td][td=1,2]惰行[/td][td=1,2]刹车[/td][/tr][tr][td]前半周[/td][td]后半周[/td][td]前半周[/td][td]后半周[/td][td]前半周[/td][td]后半周[/td][/tr][tr][td]P2.3 [/td][td]右下[/td][td]1[/td][td]1[/td][td]0[/td][td]0[/td][td]1[/td][td]0[/td][td]0[/td][td]1[/td][/tr][tr][td]P2.2[/td][td]右上[/td][td]1[/td][td]1[/td][td]0[/td][td]1[/td][td]1[/td][td]0[/td][td]1[/td][td]1[/td][/tr][tr][td]P2.1[/td][td]左下[/td][td]0[/td][td]0[/td][td]1[/td][td]1[/td][td]0[/td][td]1[/td][td] [/td][td]1[/td][/tr][tr][td]P2.0[/td][td]左下[/td][td]0[/td][td]1[/td][td]1[/td][td]1[/td][td]0[/td][td]1[/td][td]1[/td][td]1[/td][/tr][/table]电机2 与电机1完全相同,只是映射在P2口的高4位。
前面所做的单个电机的控制程序,可以很方便的移植过来。
首先将所有与电机对应的变量改为2维数组,一维对应一个电机。
然后在程序中所有涉及电机变量的初始化和赋值的地方改为循环,有关的函数增加一个电机序号参数输入,函数中修改为根据序号处理相应的数组单元。
上述修改的关键在于变量的构建,合理的变量将大大减少程序的处理难度。
在电机输出及测速中断的处理中,没有使用下标变量方式来节省代码,因为需要速度,可以仔细比较使用下标变量时的目标代码与直接指定下标时的差别。
此部分功能暂未作任何改进和添加,只是将两个电机的驱动并入了一个MCU控制。
7.5 轨迹采样模块程序设计轨迹采样器为4个反射式光电采样器,经缓冲后作背景光减除处理,之后放大送单片机AD转换。
此模块完成:
1)采样器的输出AD转换;
2)将AD结果转换为是否在轨迹上的逻辑值;
3)进肖处理,输出轨迹偏移位置信息。
本来期望能按照国外那个桌面寻迹小车的处理方式对采样信号预处理的,但是仔细分析后发现,按目前所用的采样器及轨迹的关系(轨迹通常为 2cm 宽,而采样器距地面5 – 8mm)无法实现,因为采样器在黑色轨迹上移动时有一段时间不会有变化,所以没有办法得到一个连续的位置偏移信息(详细请看:[url=http://elm-chan.org/works/ltc/report.html][color=#0000ff]http://elm-chan.org/works/ltc/report.html[/color][/url])。
为了便于日后过渡到这种模式,还是将采样器布置为一条直线,相互间距小于轨迹的宽度,而4个采样器的AD结果仍然转换成逻辑值后再作处理。
4个采样器的布置如下:
顶视: 左 —— 右
采样器: 1号 2号 3号 4号
I/O口: P10 P11 P12 P13
采样值: 1 2 3 4 (PC调试界面中自左至右)
处理时先将采样的模拟值转换为逻辑值,之后将逻辑值转换为一个关于位置的数值,如下面系列图所示,注意光感的位置及PC界面中轨迹采样的数据。
居中(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InCenter.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InCenter_Mini.jpg[/img][/url]
偏右程度1(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InRight01.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InLeft01_mini.jpg[/img][/url]
偏右程度 2(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InRight02.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InRight02_mini.jpg[/img][/url]
偏右程度3(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InRight03.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InRight03_mini.jpg[/img][/url]
偏右程度4(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InRight04.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InRight04_mini.jpg[/img][/url]
偏左程度1(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InLeft01.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InLeft01_mini.jpg[/img][/url]
偏左程度2(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InLeft02.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InLeft02_mini.jpg[/img][/url]
偏左程度3(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InLeft03.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InLeft03_mini.jpg[/img][/url]
偏左程度4(点击看大图):
[url=http://www.robotdiy.com/images/FollowMe_robot/InLeft04.jpg][img=304,116]http://www.robotdiy.com/images/FollowMe_robot/InLeft04_mini.jpg[/img][/url]
通过上述图并结合程序,我想读者应当理解此处是如何处理轨迹采样数据的了。
7.6 轨迹控制模块程序设计因为将前面所编写的电机调试功能纳入此模块,所以先将原来的程序移植过来,主要是修改了对应电机的一些变量,和电机驱动模块一样,也是将所有与电机对应的变量改为2维数组,一维对应一个电机。程序修改方法也类似。
因为两个电机的转速都在一个MCU中得到,所以修改了读转速的通讯协议:
0x55 0xAA 0x01(帧长) 0x04 (读转速命令) 校验和(1字节)
对应的返回帧为:
0xAA 0x55 0x05(帧长) 0x84 (转速值返回) 电机1转速(2字节)电机2转速(2字节)校验和(1字节)
此外,为了支持走轨迹,增加了一条轨迹行走启动及停止命令,协议如下:
走轨迹控制命令: 0x05 . 命令参数 —— 1 启动, 0 停止,
命令帧为:
0x55 0xAA 0x02 0x05 0x01 CS —— 启动命令
0x55 0xAA 0x02 0x05 0x00 CS —— 停止命令
为了能够方便的检测一些工作变量,使程序调试更加直观,增加了一个内存读取命令:
内存数据读取命令:0x06
命令帧为:
0x55 0xAA 0x04 0x06 读数据低地址 读数据高地址 读数据长度 CS
返回帧为:
0x55 0xAA 帧长 0x86 读数据低地址 读数据高地址 读数据长度 数据N字节 CS
增加了这样一个内存数据读出功能,将十分有效的帮助调试一些自身不带Debug功能的单片机,而且由于逐渐向贴片封装过渡,防真头方式的Debug工具也越来越受限制,所以学会在自己的程序中嵌入调试代码也是一个必须具备的功能,即便有JTAG调试功能的单片机,对于机器人这种移动型的应用,或是一些远程控制应用,还是无法发挥作用,必须依靠自己嵌入的调试代码检测程序的状态。
由于我做这个项目的目的不是为了弄出一个能多么优越的产品或方案,帮助人参加竞赛,或是显示我的“实力”,我的目的是将这个过程记录下来,算是一种学习的途径,希望能给一些入门者以启示,从中能发现一些可以借鉴的方法,如:一些基本功能的程序如何编写,如何考虑硬件与软件的关系,如何借助于PC机调试等等。
所以,真正走轨迹该如何去控制,并非我所要做的重点,轨迹采样输出以作了那样的转换,对于走简单轨迹而言,我想控制方案应当不是问题,但是要走好,走的流畅还是要花一些功夫的,但这正是我希望大家能共同参与、讨论的内容,而非我的“一家之词”。将这个悬念留给大家吧!
8、结语本来计划写8篇的,但写到此后觉得应当结束了,因为该交待的都交待了,下面如果要做就是程序和功能的优化,而这不应该是我来做,我希望能有人尝试,大家来共同讨论,实现一些自己满意的功能。
我所要做的是:再优化一下设计,看有无可能为大家提供一些不容易自制的零件,将这个项目培养起来,成为一个可以相互交流程序的平台,一个在上面扩充自己所期望的功能的平台。
我认为这一系列文章中已基本介绍了作为入门的大部分技能,主要侧重点是单片机控制程序的编写。希望这只是一块“砖”,能引来更好的“玉”!
由于自己还有一些其它事情打扰,中间的间隔过长,所以文章有些地方不够连贯、不够严谨,有散乱之感,望大家原谅!
感谢ROBOTDIY网站的支持,谢谢!也谢谢大家!
(全文完)
2006年10月15日星期日
附件:1、 [url=http://www.robotdiy.com/images/FollowMe_robot/Final_Program.rar][color=#0000ff]修改后的程序[/color][/url]
2、 [url=http://www.robotdiy.com/images/FollowMe_robot/Final_hardware.rar][color=#0000ff]电原理图[/color][/url](因为PCB是别人设计的,未经许可我不便公开)
3、 [url=http://www.robotdiy.com/images/FollowMe_robot/MotorTest.exe][color=#0000ff]PC调试程序[/color][/url]
4、 [url=http://www.robotdiy.com/images/FollowMe_robot/Robot_FinalVideo.wmv][color=#0000ff]小车运动视频片断[/color][/url]
tyler008 2008-1-17 03:46 PM
这款也是一个很不错的寻迹机器人,还可以走迷宫
这里有视频,大家可以看一下:[url=http://www.arexx.com.cn/shownews.asp?id=87]http://www.arexx.com.cn/shownews.asp?id=87[/url]
[url=http://www.arexx.com.cn/shownews.asp?id=62]http://www.arexx.com.cn/shownews.asp?id=62[/url]
他们公司网址是:[url=http://www.arexx.com.cn]www.arexx.com.cn[/url]
淘宝也有卖,我也玩得,很不错的:[url=http://shop35075640.taobao.com/]http://shop35075640.taobao.com/[/url]
robot diy/robotdiy
tyler008 2008-1-17 03:49 PM
发现超强寻迹机器人,大家可以看一下,叫ASURO电脑编程机器人:
发现超强寻迹机器人,大家可以看一下,叫ASURO电脑编程机器人:[url]http://www.youtube.com/watch?v=t6H29o5uVdg&feature=related[/url]
robot diy/robotdiy
页:
[1]