0引言
单片机进入中国10余年以来,以其体积小、功能强、扩展灵活、使用方便等特点,逐渐应用到各行业的工程实际应用中。目前,大多数系统以51系列的8位单片机为首选,但是在一些比较复杂的、性能要求较高的系统中,它不得不让位于16位单片机。本文采用的MCS-96系列的16位单片机特别适用于各类自动控制系统。如交直流调速机、工业过程控制系统、伺服系统等。本文以一直流伺服控制系统装置为例,介绍了系统的结构,改进了有关算法,实验证明,此系统可以良好地跟踪给定速度曲线,响应时间可控制在10-3s的数量级以内。
1硬件系统的构成
1.1电气主回路
主电路结构图如图1所示,采用双极性的H桥构成,用大功率硅管整流桥将交流整流成直流,采用
电压型稳压方式(并入大容量电容)提供主电源,用IPM中的IGBT构成H桥,采用PWM进行调速,其中富士通的IPM技术较为成熟,并具有多种保护功能。只需加入一定的周边电路便可进行驱动。
1.2单片机系统
本文采用MCS-96系列的80C196MC构成16位总线的单片机系统,与MCS-51系列相比,此类型的单片机至少在以下几方面提高了系统的实时性。
(1)CPU中的算术逻辑单元不采用常规的累加器结构,改用寄存器-寄存器结构,CPU的操作直接面向256字节的寄存器,消除了CPU结构中存在的累加器瓶颈效应,提高了操作速度和数据吞吐能力。
(2)256字节寄存器中,24字节是专用寄存器,其余232字节均为通用寄存器。其通用寄存器的数量远比一般CPU的寄存器数量多。这样可以为各中断服务程序中的局部变量指定专门的寄存器,免除了中断服务过程中保护和恢复现场所支付的软件开销,并大大方便了程序设计。
(3)80C196MC具有波形发生器(WG),不用外围元器件即可生成PWM波形,而波形发生器(WG)具有灵活的死区调节功能。这对实用PWM功率放大器很关键,它能防止双极H型主电路四个IGBT“共态穿通”。所谓“共态穿通”即桥臂中的一个IG-BT没有退出饱和而另一个IGBT已导通而形成电源短路的现象。
(4)有一套效率更高、执行速度更快的指令系统,可采用20M赫兹的时钟,并新增加了EPA(事件处理器阵列),PTS(外设事务服务器),再加上其内带的10位A/D转换器,从而可以快速完成电流和转速的转换过程,满足对系统动态响应时间的要求。
其中,16位单片机的系统构成如下:由于伺服系统电流控制调节器采样周期短、计算量大,所以80C1 96MC系统采用16位系统总线以提高系统的吞吐能力。二片EPROM27C256地址分配为:2000H~7FFFH;二片RAM62256地址分配为:A000H~FFFFH;由于采用16位地址数据总线,二片存储器共用同一地址,具体联接如下:系统地址总线A0不用,A1与EPROM、RAM的A0连接,A2与A1连接,……依此类推,A15与A14连接。当CPU读存储器高位地址时,同时选中高、低位的存储器,高8位、低8位的数据同时读入CPU,由CPU正确选择高8位的数据作为操作数,舍去低8位的数据;读低8位时情况也一样。RAM的片选信号由INST和A15通过与非门构成(RAM=INST+A15———),其中要注意的是INST在读程序存储器时为低电平,但要避开2000-2080的地址,因为在读取中断向量时,INST引脚为高电平。其系统原理框图如图2所示。
2软件系统
采用C与ASM的混合编程模式,下面着重于其协同开发和算法的改进进行阐述。
2.1C程序与汇编程序的协同开发
汇编语言的难点在于数据处理。由于汇编语言不直接支持单精度的浮点运算,而现在单片机开发日趋复杂,在许多地方必须应用高精度的复杂算法。C96直接支持单精度的浮点运算,对于大多数场合已经够用,并且可以方便的通过算法扩展到双精度。算法的设计上已有大量的C程序可供选用,基本不用重新开发。在这些模块中应用C96可以尽快地解决问题。然而,完成同样的功能,C96程序经编译连接生成的代码比汇编生成的代码稍长。在需要实时响应的场合,开发者往往从执行速度的角度出发,把这些模块用汇编代码实现。其实,笔者认为凡是汇编实现的功能用C96都能实现,只是一个熟练程度的问题,而且据最新资料,新版的C96编译器的效率可以达到1.1。在单片机项目中应用C96,更重要的是开发周期可以大大缩短,一般来说,一个资深的C96程序员,他只要花费汇编程序员的一半不到的时间就可以完成开发任务,而两者的执行速度相差无几,如果不是有特别苛刻的要求,用C96开发程序将是事半功倍。
例如:
Timer1=0x33f8;
而在汇编中则需要写成:
LD1CH,33F8H
ST1CH,1F7A[00H]
显然,C96写出来的程序具有良好的可读性,并方便日后的修改和维护,而汇编大多数则要靠注释来解读,而且个人注释风格不同,会带来调试工作和日后的软件升级的困难,加长了开发时间和人力投入。
在开发单片机的项目时,经常会遇到关于汇编模块和C模块相互调用的问题,下面从两个方面加以阐述:
(1)如果不涉及参数传递,则可以采用在程序中嵌入ASM{…}伪指令实现(适用于C96和C51) 。
(2)当涉及参数传递的时候,下面以C语言作主程序为例,说明一个相互调用的实例;(只适用于C51)。
主程序:
但在A-FUNC.A51文件中则需按照C51与汇编语言的接口规则进行书写,完成相应的功能。
NAMEA-FUNC
;声明函数名称
;声明外部函数代码段名
PUBLICA-FUNC
;外部公共符号
RSEG?DT?-a-func?A-FUNC
?-a-func?BYTE:
;可覆盖局部数据段
x?00:DS2;定义传递参数字节
RSEG?DT?A-FUNC?A-FUNC
-A-FUNC:
…;程序代码体
END
;A-FUNC函数结束
因此,我们可以很方便地在程序代码体处加入所期望的汇编程序。
最后,全部程序编译链接通过后,应仔细查看生成的M96或M51文件,有无溢出或冲突的情况,数
据存储区与程序存储区是否定位恰当。对于C196来说,C96程序的代码段、参数段可以设成是浮动定
位还是绝对定位的,当C96代码段、参数段与汇编程序冲突时,应用RL196的编译控制选项ram(…),rom(…),romcode(…),romdata(…)来精确定位代码数据段解决冲突。
例如:
以上定义了模块MOD2的代码的常量数据,MOD3的代码放在ROM1中,即(2000-3FFFH)处。main、mod1、mod3的代码和常量放在第二段ROM(4000-FFFFH)中,MOD1的常量数据放在(4000-5FFFH)的ROM中。STACK堆栈段的值应根据最后的M96文件显示的总共占用的内存RAM,设为最大可用的堆栈段(用STACKSIZE控制项),C96的子程序调用最好不要超过三级,以免堆栈溢出。经实践证明,这些C96程序与汇编语言作到了真正意义上的“无缝链接”。
2.2算法的改进
2.2.1波形发生器工作原理简介
波形发生器WG是80C196MC单片机最具特色的外设,在PWM伺服系统中起到关键的作用。80C196MC的WG可产生三相(三路)正弦PWM(SP-WM)波形用于三相交流同步电机的变频调速,这种情况的WG工作方式称为中心对准方式;也可产生斩波调压的PWM用于直流电机调压调速,这种工作方式称为边沿对准方式。下面对PWM伺服系统采用的边沿对准方式给予简要介绍。
工作于边沿对准方式,不考虑死区时间的影响的工作波形见图3。有关的几个寄存器意义如下:
(1)WG-RELOAD:重装载寄存器,决定载波周期。
(2)WG-COMPX(X=1,2,3):相位比较寄存器,决定波形占空比。
(3)WG-COUNT:双向计数器,为WG的时基(边沿对准时,只向上计数)。
当WG-COUNT的值一直与WG-RELOAD的值比较,当等于WG-RELOAD的值时,WG复位到1,又重新开始计数。同时WG-COUNT的值也一直与WG-COMPX的值比较,当WG-COUTN的值等于WG-COMPX的值时改变输出引脚(WGX)的电平,输出PWM波形。当WG-COUNT复位为1时,引发一次WG中断,CPU响应WG中断时,根据电流环运算得出的新的WG-COMPX的值,改写WG-COMPX的值,改变输出波形的占空比,实现调节电机转速的目的。
(4)WG-CON:控制、死区时间寄存器,决定WG的工作方式和死区时间。
前文已谈到H型PWM电路中的一个桥臂,当其中的一个IGBT没有退出饱和时,另一个IGBT又开始导通,会造成电源直接短路的“共态导通”现象,这是绝对不能出现的故障。要避免这一现象的发生
就是设置合适的死区时间,即当一个IGBT关断后,经历一个死区时间,另一个IGBT接着导通,这样就
可避免“共态导通”现象出现。
2.2.2算法改进的思路
实际上,在转速和电流环的计算中并不是全部计算都需要用到浮点运算的方式,为简单起见,下面论述只考虑转速环(电流环当成一比例环节):
因为采用的是转速编码器采样转速信号,而80C196MC系列的单片机用相移计数器的方式即可
以获得时间T内的转速值,而这个值一定是整数,因此转速的跟踪精度实际上取决于转速编码器的精
度,当T时间取一较小的时间间隔,我们完全可以用时间T内获得的脉冲数PL作为转速值,实际上此时
的转速为:PL/T,我们以时间T作为速度环控制回路采样周期,当给定速度同样在整数值给出时,如图4所示,由于输出PWM周期一定(WG-RELOAD取为100μs),输出比较寄存器WG-COMP1也只能在整
数范围变化,PI控制器的输入为整数SP-GIVEN-SP-NOW,输出同样为整数,所以只需调整PI的参
数就可达到对转速环的控制。
实际上,我们不难证明给定转速如果换算成在T时间内脉冲数不是整数的话,其控制作用同整数值的效果是一样的。但是PI参数经常以浮点数的方式出现,我们在调试过程中先用浮点数计算定下P、I参数的值之后,再利用C96的赋值运算符赋予一整型变量,这样即充分利用了C96的浮点运算库,又精简了代码,提高了运算速度。对于电流环同样可以依照以上方法确定电流环的P、I参数并进行电流控制。
2.2.3程序框图和实验结果
在以上思路的指引下,我们设计了如下程序框图并对转速环进行了验证,可以控制转速环的调节时间在数量级以内。程序框图如图4。