⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 寻迹小车 followme—— 之四:电机驱动软件设计.htm

📁 机器人应用的全套实例寻机小车
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  <TABLE style="TEXT-ALIGN: left" cellSpacing=5 cellPadding=4 
                  width="100%" border=0>
                    <TBODY>
                    <TR>
                      <TD class=article-top style="BACKGROUND-COLOR: #e0e0e0" 
                      width="99%">寻迹小车 FollowMe—— 之四:电机驱动软件设计<BR><SPAN 
                        class=smalltype>写于: 星期一 31 七月 @ 09:07:15 </SPAN></TD></TR>
                    <TR>
                      <TD></TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www.robotdiy.com/topics.php?op=viewtopic&amp;topic=4"><IMG 
                        height=77 alt=智能机器人开发 hspace=4 
                        src="寻迹小车 FollowMe—— 之四:电机驱动软件设计.files/robot_hardware.gif" 
                        width=40 align=right 
                        border=0></A><I>前面已完成了车的主体,控制部分中的电机驱动器设计和轨迹采样及逻辑控制部分硬件设计,从本篇开始着手各部分的软件设计。</I> 
                        <BR><BR>
                        <H1 align=center>寻迹小车 FollowMe</H1>
                        <H2 align=center>—— 之四:电机驱动软件设计</H2>
                        <P align=center>作者:<A 
                        href="http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&amp;u=3954" 
                        target=_blank>Hanker</A></P>
                        <P><BR>前面已完成了<A 
                        href="http://www.robotdiy.com/article.php?sid=261" 
                        target=_blank>车的主体</A>,<A 
                        href="http://www.robotdiy.com/article.php?sid=262" 
                        target=_blank>控制部分中的电机驱动器设计</A>和<A 
                        href="http://www.robotdiy.com/article.php?sid=263" 
                        target=_blank>轨迹采样及逻辑控制部分硬件设计</A>,从本篇开始着手各部分的软件设计。</P>
                        <H2>六、控制部分软件设计</H2>
                        <P>因为在硬件设计中,将电机驱动和逻辑控制分成了两个独立的模块,所以在软件设计时也将分别设计。</P>
                        <H3>6.1 电机驱动模块软件设计</H3>
                        <P>根据前面的硬件设计,电机驱动模块可以独立成为一个智能的功率驱动器使用,在硬件的设计中考虑了可以支持多种控制信号。但在目前的项目中,拟使用串口控制方式,以下的软件设计是基于这个前提的。</P>
                        <P>6.1.1 软件要实现的功能</P>
                        <OL>
                          <LI>接收并解析控制命令; 
                          <LI>使电机有良好的驱动特性,可正、反转动,且转动平稳、有力; 
                          <LI>可靠的获取转速反馈信号; 
                          <LI>根据反馈信号使用有效的控制策略使电机达到所需的转速; 
                          <LI>利用码盘的反馈信号控制行走距离; 
                          <LI>可以根据命令实现电机的特殊运行状态:刹车、惰行。 </LI></OL>
                        <P>在上述功能中,真正影响驱动器性能的是第二项(驱动特性)和第四项(控制策略)。虽然通常认为控制策略最重要,在自动控制中所着笔墨最多,但是在我们这个项目中,因为电机特性不是十分理想,驱动又是通过软件完成的,这两部分组成的执行机构如果没有良好的特性,那有再好的控制算法、策略也无法实现良好的电机驱动。 
                        </P>
                        <P>6.1.2 概要设计</P>
                        <P>根据要实现的功能,软件分为以下几个部分:</P>
                        <OL>
                          <LI>命令接收解析 —— 完成命令接收,命令内容解析; 
                          <LI>电机PWM驱动 —— 根据电机控制参数产生驱动信号,使电机进入期望的运转状态; 
                          <LI>速度反馈 —— 读取码盘信号,计算出速度数据,兼完成计数功能,实现行走距离控制; 
                          <LI>控制策略 —— 根据命令给出的数据和反馈得到的数据计算出电机控制参数,实现速度控制; 
</LI></OL>
                        <P>电机驱动实际上构成了一个典型的自动控制系统:<BR></P>
                        <P align=center><IMG height=154 
                        src="寻迹小车 FollowMe—— 之四:电机驱动软件设计.files/PID_Control.gif" 
                        width=622></P>
                        <P><BR>其中的“PID调节器”由软件的控制策略部分实现,驱动器硬件只提供了电流的开关、放大功能,而主要的驱动特性实现是由软件中电机PWM驱动完成。</P>
                        <P>这样设计使得系统的灵活性增强,同时便于学习者掌握控制的实质,领会其中的奥妙。</P>
                        <P>软件总体框架采用消息驱动方式,根据消息作相应的处理,消息多数由中断产生,如:接收到串口数据、码盘光电采样中断等,对于没有中断源的信号,由系统的时基产生的中断定时查询、处理。</P>
                        <P>电机驱动所需的PWM信号在中断服务程序中完成,因为需要比较准确的脉冲宽度和周期。</P>
                        <P>虽然硬件设计上考虑了许多扩充功能,但是在目前的寻迹小车项目中不是都需要,所以在此对于脉冲输入只处理一个主速度检测脉冲,主方向、跟踪测速脉冲、方向等功能留到有具体需求时再做考虑。</P>
                        <P>无线模块的控制也是留作日后有需求时再作考虑。</P>
                        <P>测速用码盘用CAD 
                        软件绘制后打印在纸上,然后用双面胶贴在轮毂上,使用反射式光电采样器采样。我所设计码盘如下:<BR></P>
                        <P align=center><IMG height=326 
                        src="寻迹小车 FollowMe—— 之四:电机驱动软件设计.files/encoder.gif" 
                        width=700></P>
                        <P><BR>因为码盘的分辨率较低,所以采用测周期的方式来得到转速。如果按照正常的脉冲测量方式,采集一个跳变沿,那这个码盘一圈只能得到10个数据,为了提高性能,利用了STC12C54XX 
                        单片机PCA模块的正、负跳变均能中断的特性,一周可获取20个数据。为了避免脉冲的占空比不等带来的问题,采用正跳对正跳、负跳对负跳的测量方式。</P>
                        <P>程序的流程如下:<BR></P>
                        <P align=center><IMG height=505 
                        src="寻迹小车 FollowMe—— 之四:电机驱动软件设计.files/Software_Flow.gif" 
                        width=556> </P>
                        <P align=center>多个子程序流程图</P>
                        <P align=center><IMG height=550 
                        src="寻迹小车 FollowMe—— 之四:电机驱动软件设计.files/Software_Main_Flow.gif" 
                        width=310> </P>
                        <P align=center>主流程图 </P>
                        <P><BR>6.1.3 详细设计</P>
                        <P>6.1.3.1 命令接收及解析</P>
                        <P>在硬件设计上虽然考虑了多种控制的可能,那是为了日后这个硬件可以满足不同的需要,而目前的设计使用串口控制。</P>
                        <P>考虑到这个小车要使用两个驱动电机,所有在串口的连接上采用并接方式,即将两个电机驱动器的接收端RXD、发送端TXD并联,RXD并联没有问题,而TXD端并联必须将口特性置为标准51口(有内部弱上拉电阻的准双向口),以保证口输出的正常,同时通过协议保证不同时发送。</P>
                        <P>并接后的串口相当于一个设备,接受逻辑控制部分的命令。</P>
                        <P>基于这样的设计,<STRONG>通讯协议</STRONG>设计如下:<BR>帧格式:<BR><EM>帧头(2字节) 
                        帧长(1字节) 命令字(1字节) 数据区(N字节)校验和(1字节)</EM></P>
                        <P>其中:<BR><STRONG>帧头</STRONG> —— 0x55 0xAA </P>
                        <P><STRONG>帧长</STRONG> —— 命令字 + 数据区的长度</P>
                        <P><STRONG>命令字</STRONG> ——</P>
                        <UL>
                          <LI>0x01 :电机转动控制参数,开环模式,电机的PWM值、转动持续脉冲数; 
                          <LI>0x02 :电机转动控制参数,闭环模式,电机的转速、转动持续脉冲数; 
                          <LI>0x03 :电机工作参数,PWM频率、PID参数 </LI></UL>
                        <P><STRONG>数据区</STRONG> —— </P>
                        <UL>
                          <LI>命令01:电机1数据(2字节PWM值,2字节转动持续脉冲数)电机2数据(2字节PWM值,2字节转动持续脉冲数),共 
                          8字节; 
                          <LI>命令02:电机1数据(2字节转速值,2字节转动持续脉冲数)电机2数据(2字节转速值,2字节转动持续脉冲数),共 
                          8字节; 
                          <LI>命令03:2字节PWM频率,2字节比例系数,2字节积分系数,2字节微分系数,2字节PID系数的分母, 
                          共10字节,两个电机驱动器相同; </LI></UL>
                        <P><STRONG>校验和</STRONG> —— 
                        从命令字开始到数据区结束所有字节的算术和的反码,取低字节。</P>
                        <P>上述数据中,PWM值,速度值、PWM频率、PID系数等定义如下:</P>
                        <P><STRONG>PWM值</STRONG> —— 
                        2字节有符号数,正对应正转,负对应反转,数值为占空比的百分数,取值范围:- 1000 —— +1000, 对应 
                        0.1% ~ 100%;1001为电机“惰行”,1002为“刹车”;</P>
                        <P><STRONG>转动持续脉冲数</STRONG> —— 2字节无符号数,0 表示连续转动;</P>
                        <P><STRONG>转速值</STRONG> —— 
                        2字节有符号数,正对应正转,负对应反转,单位为:0.1转/每分钟;取值范围:- 10000~ 
                        +10000,10001为电机“惰行”,10002为“刹车”;</P>
                        <P><STRONG>PWM频率</STRONG> —— 2字节整数,单位Hz,取值范围:200 – 
                        2000;因为不同的电机所需的PWM 频率不同,需要通过测试确定,所以考虑了此参数;</P>
                        <P><STRONG>PID系数</STRONG> —— 均为 2字节无符号数;</P>
                        <P><STRONG>PID系数分母</STRONG> —— 
                        2字节无符号数,为避免使用浮点数而增加了此参数,实际作用的PID系数为上述值除此值;如:比例系数为190 
                        ,PID分母为200,实际比例系数为0.95。</P>
                        <P>以上所有2字节数据均为先低后高顺序发送。</P>
                        <P>暂时不设计应答帧,因为一帧命令包含了两个电机的驱动数据。</P>
                        <P>通讯数据格式为:19200bps 8 N 1。此时,一帧数据约占 7ms。</P>
                        <P>数据接收缓冲区采用环形结构,为了节省指针运算的时间,缓冲区长度设为 
                        32字节,对应指针变量的低5位。<BR>设置2个数据指针处理,一个存数指针负责将接收到的字节填入缓冲,一个取数指针负责取出填入的数据。初始化时两个指针相等,当收到数据时,在存数指针指向的缓冲区位置填入数据,而后指针加一,指向下一位置,此时两个指针不再相等,产生收到数据消息。</P>
                        <P>为减少中断服务占用的时间,在串口中断中只激收到的数据填入接收缓冲区,不做任何处理。</P>
                        <P>主程序根据两个指针是否相等判断是否收到数据,因为缓冲区足够接收完整个数据帧,所以,接收处理时先判断是否收到了“帧头”,之后根据“帧长”设定一个帧尾指针位置,等到存数指针等于帧尾指针时,再将数据帧一起取出,进行校验和判断,如果正确,根据命令字解析数据区,取出相应的参数。</P>
                        <P>具体实现过程参见所附程序。</P>
                        <P>6.1.3.2 电机PWM驱动</P>
                        <P>根据《<A 
                        href="http://www.robotdiy.com/phpbb2/viewtopic.php?t=8007" 
                        target=_blank>电动机的单片机控制</A>》中对直流电机驱动的描述,同样的H桥电路,使用不同的控制信号,可以实现两种不同的控制方式,其一是“双极性可逆PWM驱动”,其二是“单极性受限可逆PWM驱动”。</P>
                        <P>对于“双极性可逆PWM驱动”方式,电机在一个PWM周期中通过相反的电流,正转、停止、反转取决于两个方向电流的持续时间,如果相等则为停止。这个方式的好处是低速稳定,启动快,但是耗电大。</P>
                        <P>对于“单极性受限PWM驱动”方式,电机在一个PWM周期中的电流是同方向的,驱动电机的功率大小取决于电流的持续时间,也就是说在一个PWM周期中,电机的电流有为“0”的时候,称之为“断流”现象。无疑,这种方式在PWM值较小时断流的时间就较长,电机运行就不稳定,也就是低速性能不好,但是由于没有反向电流消耗,所以耗电少。</P>
                        <P>(对于这部分的描述请仔细阅读书中相关章节)</P>
                        <P>基于这样的原理,拟采用如下控制方式:</P>
                        <P>在PWM控制值小于30%(此值调式时再作调整)时,采用“双极性可逆驱动”,大于30% 
                        则采用“单极性受限可逆驱动”。</P>
                        <P>为了可以获得最好的电机驱动特性,将PWM周期设计为可变,这样在调试中可以找到合适的工作参数。<BR>具体实现方法为:</P>
                        <P>设置如下变量:</P>
                        <P>FirstHalf —— 位,前半周标志,为“0”表示处在PWM周期的后半周;<BR>FirstOut 
                        —— 字节,前半周电机控制输出字,控制H桥的导通和截止;<BR>SecondOut —— 
                        字节,前半周电机控制输出字,控制H桥的导通和截止;<BR>FirstTime —— 
                        字(2字节),前半周持续时间;<BR>SecondTime —— 字(2字节),后半周持续时间;</P>
                        <P>在程序中设置“计算电机控制参数”标志,当PWM的数据变化时,则建立此标志,根据PWM的值及PWM的周期计算出上述数据:</P>
                        <P>先根据PWM的值判断应当处于哪种驱动模式。</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -