资源预览内容
第1页 / 共142页
第2页 / 共142页
第3页 / 共142页
第4页 / 共142页
第5页 / 共142页
第6页 / 共142页
第7页 / 共142页
第8页 / 共142页
第9页 / 共142页
第10页 / 共142页
亲,该文档总共142页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
9.1 基于AT89C52控制的磁悬浮球演示系统9.2 基于PIC16C54的光栅式定位系统9.3 基于LPC2212的三关节机器人控制系统 第9章 单片机应用系统设计实例9.1.1 组成及工作原理9.1.2 电路设计9.1.3 程序设计9.1 基于AT89C52控制的磁悬浮球演示系统 9.1 基于AT89C52控制的磁悬浮球演示系统 磁悬浮球演示系统是一个典型的嵌入式数字控制系统,由电磁铁、磁悬浮球演示系统是一个典型的嵌入式数字控制系统,由电磁铁、铁磁性小球及控制部分组成,其电磁铁通电后产生磁场,吸引铁磁性小铁磁性小球及控制部分组成,其电磁铁通电后产生磁场,吸引铁磁性小球,动态调节电磁铁中的电流,可使其产生的电磁吸力等于小球的重量,球,动态调节电磁铁中的电流,可使其产生的电磁吸力等于小球的重量,从而使小球悬浮在空中保持不动。这个动态调节的过程称为磁悬浮控制。从而使小球悬浮在空中保持不动。这个动态调节的过程称为磁悬浮控制。本例进行磁悬浮球演示系统的设计,首先介绍系统组成以及磁悬浮控制本例进行磁悬浮球演示系统的设计,首先介绍系统组成以及磁悬浮控制的基本原理,然后详细介绍以的基本原理,然后详细介绍以AT89C52AT89C52单片机为核心的电路设计和程序单片机为核心的电路设计和程序设计,最后给出完整的汇编语言程序清单供读者参考。该磁悬浮球演示设计,最后给出完整的汇编语言程序清单供读者参考。该磁悬浮球演示系统的结构见下图。系统的结构见下图。 9.1 基于AT89C52控制的磁悬浮球演示系统磁悬浮球演示系统的照片磁悬浮球演示系统的照片 9.1.1 磁悬浮球演示系统的组成与工作原理 磁悬浮球演示系统主要由电磁铁、铁磁性小球、间隙传感器、单片磁悬浮球演示系统主要由电磁铁、铁磁性小球、间隙传感器、单片机控制器及功率放大器组成。电磁铁安装在悬浮支架顶部,通电后对小机控制器及功率放大器组成。电磁铁安装在悬浮支架顶部,通电后对小球产生竖直向上的电磁吸力。间隙传感器安装在悬浮支架底部,它是一球产生竖直向上的电磁吸力。间隙传感器安装在悬浮支架底部,它是一种基于涡流检测原理的非接触测量器件,能将小球与传感器探头表面之种基于涡流检测原理的非接触测量器件,能将小球与传感器探头表面之间的距离转换为电压信号,再经过间的距离转换为电压信号,再经过A/DA/D转换成数字信号。单片机控制器转换成数字信号。单片机控制器根据输入的间隙传感器信号,按照特定的控制算法,比如根据输入的间隙传感器信号,按照特定的控制算法,比如PIDPID算法,计算法,计算出维持小球稳定悬浮所需的控制电流。该控制电流以算出维持小球稳定悬浮所需的控制电流。该控制电流以PWMPWM信号的形式信号的形式传递给功率放大器。功率放大器对控制电流进行功率放大,给电磁铁提传递给功率放大器。功率放大器对控制电流进行功率放大,给电磁铁提供对应大小的电流。这是一个闭环控制的过程,如果控制适当,就可使供对应大小的电流。这是一个闭环控制的过程,如果控制适当,就可使小球稳定地悬浮在期望位置。小球稳定地悬浮在期望位置。 9.1.1 组成及工作原理:系统组成磁悬浮球演示系统的组成磁悬浮球演示系统的组成 9.1.1 组成及工作原理:悬浮控制原理 根据牛顿第二定律,在竖直方向上,小球的动力学方程为:根据牛顿第二定律,在竖直方向上,小球的动力学方程为: 根据电磁学理论可知,系统的电力学方程近似为:根据电磁学理论可知,系统的电力学方程近似为: 其中其中 为小球质量,为小球质量, 为悬浮间隙,为悬浮间隙, 为重力加速度,为重力加速度, 为电磁吸力为电磁吸力, 电磁铁的平均电流,电磁铁的平均电流, 是与系统结构有关的参数。是与系统结构有关的参数。 9.1.1 组成及工作原理:悬浮控制原理 设额定悬浮间隙为设额定悬浮间隙为 ,额定电磁铁平均电流为,额定电磁铁平均电流为 ,将上述模型在,将上述模型在 线性化后,可得到系统的传递函数为:线性化后,可得到系统的传递函数为:其中,其中, , , , , 为拉为拉普拉斯算子。普拉斯算子。 根据控制理论的稳定性条件进行分析,该系统不稳定,必须通过适根据控制理论的稳定性条件进行分析,该系统不稳定,必须通过适当的闭环控制才能使之达到稳定。当的闭环控制才能使之达到稳定。 9.1.1 组成及工作原理:悬浮控制原理 常用的控制方法是比例常用的控制方法是比例- -积分积分- -微分控制,简称微分控制,简称PIDPID控制,其表达式为:控制,其表达式为: 其中其中 为控制电压,为控制电压, 为电磁铁线圈的电阻,简单起见,忽略线圈电为电磁铁线圈的电阻,简单起见,忽略线圈电感。其中感。其中 、 和和 分别是比例、微分和积分系数,又称为控制器参分别是比例、微分和积分系数,又称为控制器参数,选取得当即可实现小球的稳定悬浮。通常,这些参数应在编程之前数,选取得当即可实现小球的稳定悬浮。通常,这些参数应在编程之前计算出来,而在编写程序时,它们都是常数。计算出来,而在编写程序时,它们都是常数。 9.1.2 磁悬浮球演示系统的电路设计 磁悬浮球演示系统的电路由单片机控制电路、磁悬浮球演示系统的电路由单片机控制电路、A/DA/D转换器及功率转换器及功率放大电路等三部分组成。其单片机控制电路和放大电路等三部分组成。其单片机控制电路和A/DA/D转换器电路如下图转换器电路如下图所示。所示。 9.1.2 磁悬浮球演示系统的电路设计AT89C52AT89C52与与ADC0809ADC0809的接口电路设计的接口电路设计 控制电路基于控制电路基于AT89C52AT89C52单片机设计,包括单片机基本电路和控制器参数单片机设计,包括单片机基本电路和控制器参数在线选择电路两个部分。在线选择电路两个部分。 (1) (1) 单片机基本电路单片机基本电路 单片机基本电路包括单片机基本电路包括AT89C52AT89C52单片机、时钟电路、复位电路以及单片机单片机、时钟电路、复位电路以及单片机电源等。时钟电路由电源等。时钟电路由16MHz16MHz晶体振荡器和晶体振荡器和20pF20pF电容组成,复位电路采用集成电容组成,复位电路采用集成看门狗芯片看门狗芯片MA813LMA813L实现,单片机的工作电源由实现,单片机的工作电源由LM7805LM7805产生。产生。 9.1.2 电路设计:控制电路 (2) (2) 控制器参数在线选择电路控制器参数在线选择电路 为便于在线调试,可将事先设计好的多组为便于在线调试,可将事先设计好的多组PIDPID控制参数存储在单片机的控制参数存储在单片机的片上程序存储器中,通过拨动拨码开关来选择不同的参数。为此,在单片片上程序存储器中,通过拨动拨码开关来选择不同的参数。为此,在单片机的机的P1P1口上,扩展了口上,扩展了8 8位拨码开关。工作时,单片机不断读取位拨码开关。工作时,单片机不断读取P1P1口的状态数口的状态数据,并据此查表以获得对应的控制器参数。据,并据此查表以获得对应的控制器参数。 9.1.2 电路设计:控制电路 接口电路实现接口电路实现AT89C52AT89C52和和ADC0809ADC0809之间的连接。之间的连接。 (1) A/D(1) A/D转换器转换器 A/DA/D转换器的功能是将模拟的电压信号转换成数字量。控制系统对转换器的功能是将模拟的电压信号转换成数字量。控制系统对A/DA/D转换器的转换速度和转换精度有要求。在转换速度方面,一般要求在转换器的转换速度和转换精度有要求。在转换速度方面,一般要求在1 1个控个控制周期内至少完成一轮采样,本系统的控制周期为制周期内至少完成一轮采样,本系统的控制周期为1ms1ms,考虑到控制算法的,考虑到控制算法的时间开销,要求时间开销,要求ADCADC的转换速度不小于的转换速度不小于10kSPS10kSPS;在转换精度方面,虽然高精;在转换精度方面,虽然高精度对控制有利,但是这会增加成本和算法复杂性,因此应本着够用原则进度对控制有利,但是这会增加成本和算法复杂性,因此应本着够用原则进行选型。本系统采用最常用的行选型。本系统采用最常用的ADC0809ADC0809,它是,它是8 8通道通道8 8位逐次逼近型位逐次逼近型ADCADC,最,最大转换速率为大转换速率为10kSPS10kSPS,输入电压范围,输入电压范围0 0+5V+5V。 9.1.2 电路设计:接口电路 (2) A/D(2) A/D转换器与单片机的接口关系转换器与单片机的接口关系 AT89C52AT89C52通过与通过与ADC0809ADC0809的接口电路来控制的接口电路来控制A/DA/D转换器的启动并读取转换转换器的启动并读取转换结果。该接口电路主要包括数据总线和控制总线接口,其中数据总线有结果。该接口电路主要包括数据总线和控制总线接口,其中数据总线有8 8位,位,将将ADC0809ADC0809的的D0D0D7D7管脚与管脚与AT89C52AT89C52的的P0.0P0.0P0.7P0.7口对应相接即可;控制总口对应相接即可;控制总线包括线包括A/DA/D转换器的片选线、数据输出使能线、启动信号及转换结束信号。转换器的片选线、数据输出使能线、启动信号及转换结束信号。此外,此外,ADC0809ADC0809的工作时钟由单片机的的工作时钟由单片机的ALEALE脚提供。脚提供。 9.1.2 电路设计:接口电路 (3) (3) 启动启动A/DA/D转换及读取转换结果转换及读取转换结果 由电路连接图可知,单片机的由电路连接图可知,单片机的#CS#CS(P2.7P2.7口)、口)、#WR#WR、#RD#RD与与A/DA/D转换器转换器的控制总线的控制总线STARTSTART、ENABLEENABLE的逻辑关系为:的逻辑关系为: START = /(#CS + #WRSTART = /(#CS + #WR) ENABLE = /(#CS + #RDENABLE = /(#CS + #RD) 不妨取不妨取ADC0809ADC0809的片选地址为的片选地址为0x7FFF0x7FFF,这样,当单片机向,这样,当单片机向0x7FFF0x7FFF地址进地址进行一次写操作时(写的内容不限),即启动一次行一次写操作时(写的内容不限),即启动一次A/DA/D转换。当单片机向转换。当单片机向0x7FFF0x7FFF地址进行一次读操作时,就可以从数据总线读取地址进行一次读操作时,就可以从数据总线读取8 8位位A/DA/D转换结果。转换结果。 9.1.2 电路设计:接口电路 PWMPWM功放电路通过控制电磁铁线圈的电流来调整电磁铁对小球的吸力。功放电路通过控制电磁铁线圈的电流来调整电磁铁对小球的吸力。本系统采用单管本系统采用单管PWMPWM功放电路,并选用功放电路,并选用MOSFETMOSFET作为主功率管,它具有电路简作为主功率管,它具有电路简单、效率高等优点。单、效率高等优点。PWMPWM型功率放大器的关键是驱动与吸收保护电路设计,型功率放大器的关键是驱动与吸收保护电路设计,其中驱动电路要确保主功率管能够快速而可靠地导通或关断,吸收保护电其中驱动电路要确保主功率管能够快速而可靠地导通或关断,吸收保护电路的功能是吸收功率管开关瞬时的能量。驱动与吸收保护电路的电路见下路的功能是吸收功率管开关瞬时的能量。驱动与吸收保护电路的电路见下图所示。图所示。 9.1.2 电路设计:驱动与吸收保护电路 9.1.2 电路设计:驱动与吸收保护电路PWMPWM驱动与保护电路驱动与保护电路 (1) (1) 驱动电路驱动电路 驱动电路中,驱动电压过小,功率管无法导通或导通不充分;驱动电驱动电路中,驱动电压过小,功率管无法导通或导通不充分;驱动电压过大,功率管的压过大,功率管的GSGS极容易被击穿。栅极电阻过小,栅极的冲击电流大,极容易被击穿。栅极电阻过小,栅极的冲击电流大,容易损坏功率管;栅极电阻过大,功率管的开关速度慢且开关损耗大。因容易损坏功率管;栅极电阻过大,功率管的开关速度慢且开关损耗大。因此,功率管的驱动电压和栅极电阻的选择至关重要。此,功率管的驱动电压和栅极电阻的选择至关重要。 本设计采用基于本设计采用基于TLP250TLP250的集成驱动电路。的集成驱动电路。TLP250TLP250的内置光耦的隔离电的内置光耦的隔离电压达压达2500V2500V,上升和下降时间均小于,上升和下降时间均小于0.5us0.5us,输出电流为,输出电流为0.5A0.5A,可直接驱动,可直接驱动1200V/50A1200V/50A以内的以内的IGBTIGBT或或MOSFETMOSFET。上图中。上图中R11R11和和D2D2组成电压偏置电路,使得组成电压偏置电路,使得MOSFETMOSFET的源极电位约等于的源极电位约等于0.7V0.7V。注意到,。注意到,TLP250TLP250采用单采用单+15V+15V供电,因此功供电,因此功率管率管GSGS极上导通电压极上导通电压14.3V14.3V,关断电压为,关断电压为-0.7V-0.7V。关断负压的设计可以使得。关断负压的设计可以使得功率管可靠地截止。此外,栅极驱动电阻取为功率管可靠地截止。此外,栅极驱动电阻取为2020。 9.1.2 电路设计:驱动与吸收保护电路(1) (1) 续流和吸收保护电路续流和吸收保护电路 电磁铁是感性元件,为此应使用快恢型二极管电磁铁是感性元件,为此应使用快恢型二极管D1D1为电感为电感L L提供续流回路,提供续流回路,以防止以防止MOSFETMOSFET关断时漏极电位急剧上升而损坏功率管。图中,关断时漏极电位急剧上升而损坏功率管。图中,R R、C C、D D组成组成的吸收网络能够吸收的吸收网络能够吸收MOSFETMOSFET在开关时刻的电压和电流尖峰。其中,在开关时刻的电压和电流尖峰。其中,C C用于限用于限制制MOSFETMOSFET的漏极的漏极- -源极间电压突变,源极间电压突变,R R用于限制用于限制MOSFETMOSFET开通时开通时C C的放电电流,的放电电流,D D则便于在则便于在MOSFETMOSFET关断时,关断时,C C能迅速吸收能迅速吸收MOSFETMOSFET上的关断尖峰。上的关断尖峰。 9.1.2 电路设计:驱动与吸收保护电路1. 1. 控制程序总体设计控制程序总体设计 (1 1)程序总体结构)程序总体结构 单片机上电后,首先执行初始化程序,然后启动定时器并进入主循环,单片机上电后,首先执行初始化程序,然后启动定时器并进入主循环,等待定时中断。在主循环内,单片机反复从等待定时中断。在主循环内,单片机反复从P1P1口读取用户指令,修改控制口读取用户指令,修改控制器参数器参数KaKa、KvKv、KpKp和和KiKi。 本系统使用本系统使用AT89C52AT89C52的所有的所有3 3个定时中断。其中,个定时中断。其中,T0T0和和T1T1中断配合产生中断配合产生一路一路PWMPWM信号;而信号;而T2T2则用于产生控制中断,并在则用于产生控制中断,并在T2T2中断服务程序中执行悬浮中断服务程序中执行悬浮控制算法,主程序和控制算法,主程序和T2T2中断服务程序的流程见下图所示。中断服务程序的流程见下图所示。 9.1.3 磁悬浮球演示系统的控制程序设计 9.1.3 控制程序:总体设计主程序流程主程序流程 T2T2中断服务程序流程中断服务程序流程(2 2)程序用变量说明)程序用变量说明 9.1.3 控制程序:总体设计 参数名称含 义OLD_POLD_P上次采样的间隙信号上次采样的间隙信号OLD_V OLD_V 上次速度信号的绝对值上次速度信号的绝对值OLD_AOLD_A上次加速度信号的绝对值上次加速度信号的绝对值OLD_IOLD_I上次积分信号的绝对值上次积分信号的绝对值NEW_PNEW_P本次采样的间隙信号本次采样的间隙信号NEW_VNEW_V本次速度信号的绝对值本次速度信号的绝对值NEW_ANEW_A本次加速度信号的绝对值本次加速度信号的绝对值NEW_INEW_I本次积分信号的绝对值本次积分信号的绝对值GAIN_PGAIN_P间隙误差增益的小数部分,记为间隙误差增益的小数部分,记为KpKp(2 2)程序用变量说明(续)程序用变量说明(续) 9.1.3 控制程序:总体设计 参数名称含 义OLD_POLD_P上次采样的间隙信号上次采样的间隙信号OLD_V OLD_V 上次速度信号的绝对值上次速度信号的绝对值OLD_AOLD_A上次加速度信号的绝对值上次加速度信号的绝对值OLD_IOLD_I上次积分信号的绝对值上次积分信号的绝对值NEW_PNEW_P本次采样的间隙信号本次采样的间隙信号NEW_VNEW_V本次速度信号的绝对值本次速度信号的绝对值NEW_ANEW_A本次加速度信号的绝对值本次加速度信号的绝对值NEW_INEW_I本次积分信号的绝对值本次积分信号的绝对值GAIN_PGAIN_P间隙误差增益的小数部分,记为间隙误差增益的小数部分,记为KpKp 9.1.3 控制程序:功能模块设计 磁悬浮球演示系统的控制程序采用模块化设计,包括:初始化模块、磁悬浮球演示系统的控制程序采用模块化设计,包括:初始化模块、A/DA/D采样模块、采样模块、PIDPID参数选择模块、参数选择模块、PIDPID算法模块,以及算法模块,以及PWMPWM信号产生模块。信号产生模块。其中,初始化模块和其中,初始化模块和PIDPID参数选择模块在主程序中执行,参数选择模块在主程序中执行,A/DA/D采样模块和采样模块和PIDPID算法模块在算法模块在T2T2定时中断服务程序中执行,定时中断服务程序中执行,PWMPWM信号产生模块在信号产生模块在T0T0和和T1T1中断服中断服务程序中执行。这些模块的逻辑关系见下图所示。务程序中执行。这些模块的逻辑关系见下图所示。 9.1.3 控制程序:功能模块设计悬浮控制程序功能模块的逻辑关系图悬浮控制程序功能模块的逻辑关系图 9.1.3 控制程序:功能模块设计(1 1)初始化模块)初始化模块 初始化模块包括堆栈及中断初始化、定时器初始化以及变量初始化。初始化模块包括堆栈及中断初始化、定时器初始化以及变量初始化。在堆栈及中断初始化中,关键是对中断控制字的配置,包括:在堆栈及中断初始化中,关键是对中断控制字的配置,包括: MOV SP, #7FHMOV SP, #7FH MOV IE, #00101010B MOV IE, #00101010B MOV IP, #00001010B MOV IP, #00001010B 本例将单片机内部数据存储器的本例将单片机内部数据存储器的80H80H0FFH0FFH单元作为堆栈,因此,堆单元作为堆栈,因此,堆栈指针被初始化为栈指针被初始化为7FH7FH。对。对IEIE的配置表示允许的配置表示允许T0T0、T1T1、T2T2中断。对中断。对IPIP的配置的配置表示定义表示定义T0T0、T1T1为高优先级中断,为高优先级中断,T2T2为低优先级中断。为低优先级中断。 9.1.3 控制程序:功能模块设计 程序共使用三个定时器。其中,程序共使用三个定时器。其中,T0T0和和T1T1配合产生一路配合产生一路PWMPWM波,波,T0T0决定决定PWMPWM波的频率,设计值为波的频率,设计值为20KHz20KHz,T1T1决定决定PWMPWM波的占空比;波的占空比;T2T2用于产生定时中用于产生定时中断,并决定控制周期,设计值为断,并决定控制周期,设计值为1ms1ms。已知单片机外部晶振频率为。已知单片机外部晶振频率为16MHz16MHz,根据第根据第4 4章介绍的定时器配置方法可得:章介绍的定时器配置方法可得:T0T0工作在工作在8 8位自动重装方式,定时位自动重装方式,定时周期寄存器初值为周期寄存器初值为0C0H0C0H,对应的定时周期为,对应的定时周期为4848 s s,因此实际产生的,因此实际产生的PWMPWM波波频率为频率为20.833KHz20.833KHz;T1T1也工作在也工作在8 8位自动重装方式,其定时周期寄存器值在位自动重装方式,其定时周期寄存器值在每个控制周期被更新为控制输出量,初始值为每个控制周期被更新为控制输出量,初始值为0FFH0FFH;T2T2工作在工作在1616位自动重位自动重装方式,定时周期寄存器初值为装方式,定时周期寄存器初值为0FACBH0FACBH,对应定时周期为,对应定时周期为999.75999.75 s s,因此,因此实际采样频率约为实际采样频率约为1KHz1KHz。 9.1.3 控制程序:功能模块设计(2 2)PIDPID参数选择模块参数选择模块 本例事先准备了多组本例事先准备了多组PIDPID参数,存储在单片机的片上程序存储器中,参数,存储在单片机的片上程序存储器中,通过拨动扩展在通过拨动扩展在P1P1口上的拨码开关,可以选择不同的参数。其中,口上的拨码开关,可以选择不同的参数。其中,P1.1P1.1和和P1.0P1.0对应比例增益参数;对应比例增益参数;P1.3P1.3和和P1.2P1.2选择速度增益参数;选择速度增益参数;P1.5P1.5和和P1.4P1.4选择选择加速度增益参数;加速度增益参数;P1.7P1.7和和P1.6P1.6选择积分增益参数;每种参数根据不同组合,选择积分增益参数;每种参数根据不同组合,分别有分别有4 4个选择。个选择。 9.1.3 控制程序:功能模块设计 PIDPID参数选择模块的具体实现方法是,在程序中通过读取参数选择模块的具体实现方法是,在程序中通过读取P1P1口状态,口状态,得到用户指令码,并以此为偏移地址到相应的控制参数表中查找,就能得得到用户指令码,并以此为偏移地址到相应的控制参数表中查找,就能得到用户期望的参数。例如,选取比例增益系数的程序为:到用户期望的参数。例如,选取比例增益系数的程序为: MOV A,P1MOV A,P1 ; ; 根据根据P1P1最低最低2 2位的状态,从位的状态,从GAIN_PGAIN_P的的 ANL A,#03H ; ANL A,#03H ; 增益表中选取相应的数据增益表中选取相应的数据 MOV DPTR,#TB_GPMOV DPTR,#TB_GP MOVC A,A+DPTR MOVC A,A+DPTR MOV GAIN_P,A MOV GAIN_P,A 9.1.3 控制程序:功能模块设计(3 3)A/DA/D采样模块采样模块 A/DA/D采样模块的主要功能是启动采样模块的主要功能是启动A/DA/D转换和读取转换和读取A/DA/D转换结果。常用的转换结果。常用的读取读取A/DA/D结果的方法有中断法和查询法。本系统采用了一种更为简单、高效、结果的方法有中断法和查询法。本系统采用了一种更为简单、高效、可靠的方法。具体是,在每个控制周期中,首先读取上一次可靠的方法。具体是,在每个控制周期中,首先读取上一次A/DA/D转换的结果,转换的结果,然后立即启动本次然后立即启动本次A/DA/D转换。由于控制周期总大于转换。由于控制周期总大于A/DA/D转换时间,因此在下转换时间,因此在下个控制周期来临时,个控制周期来临时,A/DA/D转换已经结束,又可以直接读取结果。该方法既不转换已经结束,又可以直接读取结果。该方法既不占用单片机的外部中断,也不会因查询等待而耗费占用单片机的外部中断,也不会因查询等待而耗费CPUCPU时间,而且程序不会时间,而且程序不会发生中断嵌套或死循环。即使发生中断嵌套或死循环。即使A/DA/D转换偶尔发生故障,只要以后能重新开始转换偶尔发生故障,只要以后能重新开始转换,系统也能继续工作下去,故系统的可用性较高。转换,系统也能继续工作下去,故系统的可用性较高。 9.1.3 控制程序:功能模块设计 前面指出,当单片机向前面指出,当单片机向0x7FFF0x7FFF地址进行一次写操作时,就能启动一次地址进行一次写操作时,就能启动一次A/DA/D转换,当单片机从转换,当单片机从0x7FFF0x7FFF地址读取数据时,读到的是地址读取数据时,读到的是8 8位的位的A/DA/D转换结果。转换结果。因此,启动转换的程序为:因此,启动转换的程序为: MOV MOV DPH, #7FHDPH, #7FH MOVX MOVX DPTR, ADPTR, A 读取读取A/DA/D转换结果的程序为:转换结果的程序为: MOV MOV DPH, #7FHDPH, #7FH MOVX MOVX A, DPTRA, DPTR 9.1.3 控制程序:功能模块设计(4 4)PIDPID算法模块算法模块 前面已经指出,磁悬浮球演示系统是开环不稳定系统,需要施加适当前面已经指出,磁悬浮球演示系统是开环不稳定系统,需要施加适当的反馈控制才能使系统稳定。的反馈控制才能使系统稳定。PIDPID是工业控制中应用最为广泛的控制方法,是工业控制中应用最为广泛的控制方法,特别是数字特别是数字PIDPID算法具有实现简单、参数整定容易以及系统鲁棒性好等优点。算法具有实现简单、参数整定容易以及系统鲁棒性好等优点。因此,本系统就采用数字因此,本系统就采用数字PIDPID控制算法。控制算法。 本实例中,本实例中,PIDPID算法是在算法是在T2T2中断服务程序中执行的。控制器先根据中断服务程序中执行的。控制器先根据A/DA/D采样结果采样结果NEW_PNEW_P算出间隙变化量算出间隙变化量DELT_PDELT_P、间隙变化量的积分、间隙变化量的积分NEW_INEW_I、微分、微分(速度信号)(速度信号)NEW_VNEW_V和二重微分(加速度信号)和二重微分(加速度信号)NEW_ANEW_A,再以此为,再以此为PIDPID算法的算法的输入,最后计算出控制输出量输入,最后计算出控制输出量CTRLCTRL。 9.1.3 控制程序:功能模块设计 算法的具体流程为:算法的具体流程为: 计算间隙变化量计算间隙变化量DELT_P DELT_P NEW_P-P0NEW_P-P0 依次计算依次计算NEW_INEW_I,NEW_VNEW_V和和NEW_ANEW_A 计算计算KP_P KP_P GAIN_P DELT_PGAIN_P DELT_P 计算计算KI_I KI_I GAIN_I NEW_I GAIN_I NEW_I 计算计算KV_V KV_V GAIN_V NEW_V GAIN_V NEW_V 计算计算KA_A KA_A GAIN_A NEW_A GAIN_A NEW_A 计算控制输出量计算控制输出量 CTRL CTRL PWM_Z PWM_Z KI_I KI_I KP_P KP_P KV_V KV_V KA_A KA_A 更新更新OLD_POLD_P,OLD_VOLD_V,OLD_AOLD_A,OLD_IOLD_I 其中,其中,PWM_ZPWM_Z是直流零位。是直流零位。 9.1.3 控制程序:功能模块设计(5 5)PWMPWM信号产生模块信号产生模块 本实例采用定时器本实例采用定时器T0T0和和T1T1产生一路产生一路PWMPWM波。波。PWMPWM波的频率由波的频率由T0T0决定,决定,PWMPWM波的占空比由波的占空比由T1T1控制,因此。具体的控制方法如下:控制,因此。具体的控制方法如下: T0T0的定时周期为常数,其中断服务程序完成以下功能:的定时周期为常数,其中断服务程序完成以下功能: PWMPWM波的输出脚置为低电平。波的输出脚置为低电平。 启动启动T1T1计数。计数。 中断返回。中断返回。 T1T1的定时周期等于控制量,其中断服务程序完成以下功能:的定时周期等于控制量,其中断服务程序完成以下功能: PWMPWM波的输出脚置为高电平。波的输出脚置为高电平。 停止停止T1T1计数。计数。 中断返回。中断返回。 9.2.1 组成及工作原理9.2.2 电路设计9.2.3 程序设计9.2 基于PIC16C54的光栅式定位系统 9.2 基于PIC16C54的光栅式定位系统 单片机在智能检测领域应用十分广泛,其内部集成的单片机在智能检测领域应用十分广泛,其内部集成的I/OI/O、A/DA/D、SCISCI等接口,以及强大的信号处理功能及小型体积,大大简化了检测系等接口,以及强大的信号处理功能及小型体积,大大简化了检测系统的硬件结构,提高了性价比。本节以基于统的硬件结构,提高了性价比。本节以基于PIC16C54PIC16C54的光栅式定位系统的光栅式定位系统为例,介绍单片机在智能检测领域的应用。为例,介绍单片机在智能检测领域的应用。 定位系统是轨道车辆运行控制系统的重要组成部分,国内外均已进定位系统是轨道车辆运行控制系统的重要组成部分,国内外均已进行了大量研究,常见的轨道车辆定位方法有微波定位、接近传感器定位、行了大量研究,常见的轨道车辆定位方法有微波定位、接近传感器定位、交叉感应回线定位等。本节介绍一种基于交叉感应回线定位等。本节介绍一种基于PIC16C54PIC16C54单片机的光栅式定位单片机的光栅式定位系统,给出系统的组成及基本工作原理,分析其定位和判向的方法;并系统,给出系统的组成及基本工作原理,分析其定位和判向的方法;并给出系统的软硬件设计;最后给出完整的程序清单,以供参考。给出系统的软硬件设计;最后给出完整的程序清单,以供参考。 9.2.1 光栅式定位系统的组成及工作原理 光栅式定位系统由齿槽板和光电检测器两部分组成,齿槽板沿轨道安光栅式定位系统由齿槽板和光电检测器两部分组成,齿槽板沿轨道安装,光电检测器安装在车辆底部。在光电检测器中,正对安装有红外发射装,光电检测器安装在车辆底部。在光电检测器中,正对安装有红外发射管和接收管,简称红外对管,当它们相对齿槽板移动时,会出现挡光或透管和接收管,简称红外对管,当它们相对齿槽板移动时,会出现挡光或透光两种情况,红外接收管就会对应输出高电平或低电平,根据形成的脉冲,光两种情况,红外接收管就会对应输出高电平或低电平,根据形成的脉冲,就可以判断车辆的相对移动,从而实现定位功能。所述的光栅式定位系统就可以判断车辆的相对移动,从而实现定位功能。所述的光栅式定位系统的组成结构见下图所示。的组成结构见下图所示。 9.2.1 组成及工作原理:系统组成定位测速系统组成示意图定位测速系统组成示意图 9.2.1 组成及工作原理:工作原理 光电检测器是光栅式定位系统的核心部件,由光电检测器是光栅式定位系统的核心部件,由PIC16C54PIC16C54单片机、单片机、4 4对红对红外对管及辅助电路组成。齿槽板的齿宽和槽宽均为外对管及辅助电路组成。齿槽板的齿宽和槽宽均为4040毫米,红外管之间间毫米,红外管之间间隔隔5050毫米。车辆移动时,毫米。车辆移动时,4 4对红外管所产生的定位脉冲形状基本相同,相位对红外管所产生的定位脉冲形状基本相同,相位不同。分析表明,车辆相对轨道每运行不同。分析表明,车辆相对轨道每运行1010毫米,这毫米,这4 4对红外管的输出电平有对红外管的输出电平有且仅有一个发生变化,且其变化顺序与车辆的行驶方向相对应,利用且仅有一个发生变化,且其变化顺序与车辆的行驶方向相对应,利用PIC16C54PIC16C54单片机来处理这些脉冲,就可以判断车辆移动的距离及方向,定单片机来处理这些脉冲,就可以判断车辆移动的距离及方向,定位精度为位精度为1010毫米。车辆沿正向经过齿槽板的情形见下图所示。毫米。车辆沿正向经过齿槽板的情形见下图所示。 9.2.1 组成及工作原理:工作原理车辆沿正向经过齿槽板车辆沿正向经过齿槽板 根据上图定义的车辆行驶的正方向。车辆沿正向根据上图定义的车辆行驶的正方向。车辆沿正向/ /反向行驶时,反向行驶时,4 4对红对红外管外管A A、B B、C C、D D的输出信号分别见下图所示。的输出信号分别见下图所示。 9.2.1 组成及工作原理:定位及判向原理正向运动对应的时间波形图正向运动对应的时间波形图 9.2.1 组成及工作原理:定位及判向原理反向运动对应的时间波形图反向运动对应的时间波形图 9.2.1 组成及工作原理:定位及判向原理 上述车辆正反向运行时的时间波形可以转换为下图的状态转换图,从上述车辆正反向运行时的时间波形可以转换为下图的状态转换图,从中可以看出,中可以看出,4 4对红外管输出的状态只有对红外管输出的状态只有8 8种,若知道当前状态,下一状态种,若知道当前状态,下一状态只有只有2 2种选择,根据出现的新状态,可以判断出车辆行驶的距离和方向。种选择,根据出现的新状态,可以判断出车辆行驶的距离和方向。 车辆行驶时的状态转换图车辆行驶时的状态转换图 9.2.1 组成及工作原理:定位及判向原理 光电检测器的输出信号包括定位脉冲信号光电检测器的输出信号包括定位脉冲信号WVWV,以及两位方向信号,以及两位方向信号D2D2和和D1D1。红外管的状态组合每变化一次,。红外管的状态组合每变化一次,WVWV就翻转一次。就翻转一次。D2D2和和D1D1与方向的对应与方向的对应关系下表所示。关系下表所示。 D2 D1D2 D10000010110101111含义含义无车无车正向正向反向反向停车停车D2D1D2D1与车辆行驶状态对应关系与车辆行驶状态对应关系 9.2.2 光栅式定位系统的电路设计 光电检测器的电路设计光电检测器的电路设计 9.2.2 光栅式定位系统的电路设计 在光电检测器的电路图中,红外接收管接收到红外信号时,它正向导在光电检测器的电路图中,红外接收管接收到红外信号时,它正向导通,通,A A点电压变低,经点电压变低,经LM393LM393比较和放大后,输出低电平;当红外接收管接比较和放大后,输出低电平;当红外接收管接收接收不到红外信号时,红外接收管反向截止,收接收不到红外信号时,红外接收管反向截止,LM393LM393输出高电平。输出高电平。LM393LM393的输出信号是状态转换图中的一个状态位,它连接到的输出信号是状态转换图中的一个状态位,它连接到PIC16C54PIC16C54单片机的引单片机的引脚脚RB0RB0。类似地,其它。类似地,其它3 3路红外接收单元的信号分别连接到路红外接收单元的信号分别连接到PIC16C54PIC16C54单片机单片机的引脚的引脚RB1RB1RB3RB3。引脚。引脚RB5RB5RB7RB7作为输出口,输出作为输出口,输出2 2个方向信号个方向信号D1D1和和D2D2,及,及1 1个定位脉冲信号个定位脉冲信号WVWV。引脚。引脚RA2RA2定义为输出,用于指示工作状态定义为输出,用于指示工作状态 。 9.2.3 光栅式定位系统程序设计:总体设计 (1 1)程序总结构)程序总结构 PIC16C54PIC16C54不断扫描不断扫描4 4路输入状态,一旦状态组合发生变化,则使输出波路输入状态,一旦状态组合发生变化,则使输出波形形WVWV翻转一次;同时,程序根据当前状态与上一状态在状态循环表中的位翻转一次;同时,程序根据当前状态与上一状态在状态循环表中的位置关系,判断出车辆的行驶方向;如果某一状态持续超过一定时间,则认置关系,判断出车辆的行驶方向;如果某一状态持续超过一定时间,则认为车辆停在轨道上;如果输入状态不在状态循环表中,则认为无车。因此,为车辆停在轨道上;如果输入状态不在状态循环表中,则认为无车。因此,车辆的运行有车辆的运行有“正向正向”、“反向反向”、“停车停车”、“无车无车”四种情况。四种情况。 9.2.3 程序设计:总体设计(2 2)程序用变量说明)程序用变量说明变量含义HSHS上次状态。上次状态。PSPS本次状态。本次状态。TPTP临时状态存储器,用于临时存储本次状态。临时状态存储器,用于临时存储本次状态。WVWV脉冲电平输出,通过置位和清零来形成波形。脉冲电平输出,通过置位和清零来形成波形。D1D1方向信号的低位。方向信号的低位。D2D2方向信号的高位。方向信号的高位。SKSK状态保持计数器,指示当前状态维持了多长时间。状态保持计数器,指示当前状态维持了多长时间。TBTB正向运动的正向运动的8 8种有效状态列表。种有效状态列表。PXPXTBTB的指针,取值范围的指针,取值范围0 07 7。 9.2.3 程序设计:总体设计(2 2)程序用变量说明(续)程序用变量说明(续)变量含义V1V1如果车辆正向运行,那么应有如果车辆正向运行,那么应有HSHSV1V1。V2V2如果车辆反向运行,那么应有如果车辆反向运行,那么应有HSHSV2V2。SK1SK1SKSK低八位寄存器低八位寄存器SK2SK2SKSK高八位寄存器高八位寄存器FLAGFLAG标志寄存器标志寄存器TEMPTEMP延时子程序用临时变量延时子程序用临时变量TEMP1TEMP1读取当前状态模块用临时变量读取当前状态模块用临时变量CLK1CLK1工作状态指示时钟定时器工作状态指示时钟定时器1 1CLK2CLK2工作状态指示时钟定时器工作状态指示时钟定时器2 2 9.2.3 程序设计:功能模块设计(1 1)主程序设计)主程序设计 9.2.3 程序设计:功能模块设计(2 2)读取)读取PSPS模块模块 9.2.3 程序设计:功能模块设计(3 3)方向处理)方向处理(I)(I)模块模块 9.2.3 程序设计:功能模块设计(4 4)方向处理)方向处理(II)(II)模块模块 9.2.3 程序设计:功能模块设计(4 4)方向处理)方向处理(II)(II)模块模块 方向处理方向处理(II)(II)完成完成PSPS与与HSHS相等情况下车辆行驶状态的判断。常数相等情况下车辆行驶状态的判断。常数S1S1是停车预设值,根据是停车预设值,根据PSPS值,以及计数器值,以及计数器SKSK与与S1S1的大小关系,可以判断出的大小关系,可以判断出“无车无车”和和“停车停车”两种情况。此外,若当前状态持续时间没有超过预两种情况。此外,若当前状态持续时间没有超过预设值设值S1S1,则输出保持不变。,则输出保持不变。 9.2.3 程序设计:功能模块设计(5 5)SKSK溢出处理模块溢出处理模块 9.3 基于LPC2212的三关节机器人控制系统 9.3.1 三关节机器人控制系统的结构与功能 9.3.2 三关节机器人控制系统的硬件电路设计 9.3.3 三关节机器人控制系统的软件设计 9.3.1 三关节机器人控制系统的结构与功能 图图9.189.18是某嵌入式三关节机器人控制系统的结构框图。其中:是某嵌入式三关节机器人控制系统的结构框图。其中: 嵌入式控制器采用嵌入式控制器采用ARMARM处理器处理器LPC2212LPC2212; USBUSB和和RS-232RS-232作为嵌入式控制器与上位作为嵌入式控制器与上位PCPC机的通信接口;机的通信接口; 键盘和键盘和LCDLCD显示器为人机交互设备,分别用于输入和显示信显示器为人机交互设备,分别用于输入和显示信息、命令等;息、命令等; SST39VF160SST39VF160和和IS61LV25616ALIS61LV25616AL分别为扩展的分别为扩展的NORFlashNORFlash芯片和芯片和SRAMSRAM芯片,用于存储程序和数据;(本来芯片,用于存储程序和数据;(本来LPC2212LPC2212片内已集成有片内已集成有256kB256kB的高速的高速FlashFlash存储器和存储器和16KB16KB的的SRAMSRAM,对一般简单三关节机器人控制系统,对一般简单三关节机器人控制系统来说,应是足够的,但考虑到本系统应能适应不同的需要,具有一定来说,应是足够的,但考虑到本系统应能适应不同的需要,具有一定通用性,所以还是扩展了存储器。)通用性,所以还是扩展了存储器。) 9.3.1 三关节机器人控制系统的结构与功能 LPC2212LPC2212ARMARM处理器处理器RS-232USB通信总线接口通信总线接口 键盘接口键盘接口显示接口显示接口JTAG接口接口仿真器仿真器通通信信端端口口PC机机键键 盘盘LCD显示器显示器串行通信总线接口串行通信总线接口 伺服驱动单元伺服驱动单元1伺服驱动单元伺服驱动单元3 3伺服驱动单元伺服驱动单元2控制对象控制对象( (三关节机器人或其他三轴机电装置三关节机器人或其他三轴机电装置) )SST39VF160SST39VF160(FLASH)(FLASH)IS61LV25616ALIS61LV25616AL (SRAM)图图9.18 9.18 嵌入式三关节机器人控制系统的结构框图嵌入式三关节机器人控制系统的结构框图 9.3.1 三关节机器人控制系统的结构与功能 伺服驱动单元伺服驱动单元1 13 3用于驱动机器人的三个关节电机,每个用于驱动机器人的三个关节电机,每个单元中包括一个由光电隔离器加差分电路组成的电机控制输出通道和单元中包括一个由光电隔离器加差分电路组成的电机控制输出通道和一个由差分电路加一个由差分电路加CPLDCPLD组成的电机信号反馈输入通道。组成的电机信号反馈输入通道。 JTAGJTAG接口及仿真器用作系统调试。接口及仿真器用作系统调试。 系统的通用输入系统的通用输入/ /输出将直接由输出将直接由LPC2212LPC2212的引脚的引脚1010经光电隔经光电隔离引出。离引出。 图中各芯片及模块采用图中各芯片及模块采用5V5V电压输出的开关电源直接或经低压电压输出的开关电源直接或经低压差电源芯片处理后供电。差电源芯片处理后供电。 9.3.1 三关节机器人控制系统的结构与功能 该机器人控制器实际上不仅适用于三关节机器人控制,也适用该机器人控制器实际上不仅适用于三关节机器人控制,也适用于对数控机床和产业机械等其他具有多轴控制与联动、开关量于对数控机床和产业机械等其他具有多轴控制与联动、开关量1/O1/O和过和过程检测与控制等需要的场合,可以说是一个通用三轴运动控制器。其基程检测与控制等需要的场合,可以说是一个通用三轴运动控制器。其基本功能如下本功能如下: : 系统可以控制三关节(运动轴)联动,每路伺服驱动电路均系统可以控制三关节(运动轴)联动,每路伺服驱动电路均为脉冲量输出,可控制全数字交流伺服电机和步进电机等。为脉冲量输出,可控制全数字交流伺服电机和步进电机等。 系统具有正交编码脉冲的捕获能力。正交编码脉冲是两个频系统具有正交编码脉冲的捕获能力。正交编码脉冲是两个频率相同正交率相同正交( (相差相差90O)90O)的方波。当它由电机轴上的光电编码器产生时,的方波。当它由电机轴上的光电编码器产生时,电机的旋转方向可通过检测两个方波序列中的哪一列先到达来确定,角电机的旋转方向可通过检测两个方波序列中的哪一列先到达来确定,角位置和转速可由方波频率来决定。用位置和转速可由方波频率来决定。用A A、 B B相代表正交的两列脉冲,相代表正交的两列脉冲,Z Z相相每转产生一个脉冲。每转产生一个脉冲。 9.3.1 三关节机器人控制系统的结构与功能 每个关节(运动轴)均有原点信号、限位信号每个关节(运动轴)均有原点信号、限位信号LIMIT+LIMIT+及及LIMIT-LIMIT-输入输入, ,以及驱动报警信号、驱动使能信号和驱动复位信号输出等。以及驱动报警信号、驱动使能信号和驱动复位信号输出等。 系统具有嵌入式系统具有嵌入式USBUSB主机功能,能够经通用串行总线主机功能,能够经通用串行总线(USB)(USB)读读取取PCPC机下载到机下载到U U盘的数据文件,从而实现与盘的数据文件,从而实现与PCPC机的通信。机的通信。 系统全部系统全部I/OI/O引脚都可编程为输出或输入。引脚都可编程为输出或输入。 系统可执行三关节(三轴)直线和两关节(两轴)圆弧插补系统可执行三关节(三轴)直线和两关节(两轴)圆弧插补运动,具有位置闭环和误差补偿功能。运动,具有位置闭环和误差补偿功能。 9.3.2 三关节机器人控制系统的硬件电路设计 主要包括嵌入式控制器的存储器扩展电路、键盘主要包括嵌入式控制器的存储器扩展电路、键盘/ /显示电路、伺显示电路、伺服驱动单元电路、特殊功能服驱动单元电路、特殊功能I/OI/O电路和必要的辅助性电路等硬件电路设电路和必要的辅助性电路等硬件电路设计。计。 1 1存储器扩展电路存储器扩展电路 存储单元的扩展包括程序存储器和数据存储器的扩展。综合考存储单元的扩展包括程序存储器和数据存储器的扩展。综合考虑性能和成本、功耗等因素,本系统按虑性能和成本、功耗等因素,本系统按1616位存储器进行扩展。位存储器进行扩展。 程序存储器的扩展程序存储器的扩展 本系统外扩了本系统外扩了1 1片片2MB2MB容量的容量的FlashFlash芯片芯片SST39VF160SST39VF160。由于。由于LPC2212LPC2212外部的外部的4 4个存储器组中个存储器组中BankOBankO可用于初始引导,故将可用于初始引导,故将BankOBankO片选信号片选信号CS0CS0连接连接到到ST39VF160ST39VF160芯片使能信号芯片使能信号CE#CE#端,其地址空间为端,其地址空间为0x80000000H0x80000000HOx801FFFFFHOx801FFFFFH。 9.3.1 三关节机器人控制系统的结构与功能 图图9.19 FLASH9.19 FLASH芯片芯片SST39VF160SST39VF160与与LPC2212LPC2212的连接的连接 到到SST39VF160SST39VF160的信号的信号WE#WE#;OEOE端连到端连到SST39VF160SST39VF160的信号的信号CAECAE;低;低1616位数据线位数据线DATA00:15DATA00:15对应连到对应连到SST39VF160SST39VF160的数据线的数据线DQ0DQ0DQ15DQ15;地址;地址线线ADDS01:20ADDS01:20对应连到对应连到SST39VF160SST39VF160的地址线的地址线A0A0A19A19。 9.3.2 三关节机器人控制系统的硬件电路设计 数据存储器的扩展数据存储器的扩展 系统外扩了一片系统外扩了一片512KB512KB的高速的高速1616位位SRAMSRAM芯片芯片IS61LV25616ALIS61LV25616AL。系。系统分配给它的地址空间为统分配给它的地址空间为0x81000000H0x81000000H0x8107FFFFH0x8107FFFFH。LPC2212LPC2212与它的与它的连接如图连接如图9.209.20所示,即:所示,即:LPC2212LPC2212的的WEWE端连到端连到IS61LV25616ALIS61LV25616AL的信号的信号/WE/WE;CS1CS1端连到端连到IS61LV25616ALIS61LV25616AL的信号的信号/CE/CE;OEOE端连到端连到IS61LV25616ALIS61LV25616AL的信的信号号/OE/OE;BLS1BLS1连到连到IS61LV25616ALIS61LV25616AL的信号的信号/UB/UB;BLSOBLSO连到连到IS61LV25616ALIS61LV25616AL的信号的信号/LB/LB;低数据线;低数据线DATA00:15DATA00:15对应连到到对应连到到IS61LV25616ALIS61LV25616AL的数据线的数据线IO0IO0IO15IO15;地址线;地址线ADDR01:18ADDR01:18对应连到对应连到IS61LV25616ALIS61LV25616AL的地址线的地址线A0A0A18A18。 9.3.2 三关节机器人控制系统的硬件电路设计图图9.20 SRAM9.20 SRAM芯片芯片IS61LV25616ALIS61LV25616AL与与LPC2212LPC2212的连接的连接 9.3.2 三关节机器人控制系统的硬件电路设计 2. 2. 键盘显示电路键盘显示电路 键盘电路键盘电路 本系统键盘由本系统键盘由1212个独立式按键组成,它们分别是以下功能键个独立式按键组成,它们分别是以下功能键: : “ “暂停暂停”键键: :按下此键,暂停运动。按下此键,暂停运动。 “ “开始开始”键键: :暂停后按下此键,继续运动。暂停后按下此键,继续运动。 “ “复位复位”键键: :运动或自检过程中产生异常现象时,按下此键终止运动或自检过程中产生异常现象时,按下此键终止一切运动。一切运动。 “ “向前向前”键键: :按下此键,执行部件沿按下此键,执行部件沿X X轴正向运动轴正向运动. . “ “向后向后”键键: :按下此键,执行部件沿按下此键,执行部件沿X X轴负向运动。轴负向运动。 “ “向左向左”键键: :按下此键,执行部件沿按下此键,执行部件沿Y Y轴负向运动。轴负向运动。 “ “向右向右”键键: :按下此键,执行部件沿按下此键,执行部件沿Y Y轴正向运动。轴正向运动。 9.3.2 三关节机器人控制系统的硬件电路设计 “ “向上向上”键键: :按下此键,执行部件沿按下此键,执行部件沿Z Z轴正向运动。轴正向运动。 “ “向下向下”键键: :按下此键,执行部件沿按下此键,执行部件沿Z Z轴负向运动。轴负向运动。 “ “回零回零”键键: :按下此键,按下此键,3 3个运动轴均回到坐标原点个运动轴均回到坐标原点. . “ “确认确认”键键: :在运动的原点确定后,在运动的原点确定后,“开始开始”键按下后,按下此键按下后,按下此键进行执行部件的轨迹运动;键进行执行部件的轨迹运动;“暂停暂停”键按下后,按下此键将退出轨迹键按下后,按下此键将退出轨迹运动,返回原点。运动,返回原点。 “ “参数设定参数设定”键键: :系统上电初始化后,按下此键,系统初始参数系统上电初始化后,按下此键,系统初始参数将显示在将显示在LCDLCD上,然后通过上,然后通过“向前向前”和和“向后向后”键确定所选参数;用键确定所选参数;用“向向上上”和和“向下向下”键调整所选参数值,用键调整所选参数值,用“参数设定参数设定”键确定所选参数值。键确定所选参数值。系统执行运动指令后,参数调整无效,相应的按键在该功能无效。系统执行运动指令后,参数调整无效,相应的按键在该功能无效。 9.3.2 三关节机器人控制系统的硬件电路设计 LCDLCD显示电路显示电路 本系统采用一款具有本系统采用一款具有240128240128点阵的图形液晶显示模块点阵的图形液晶显示模块RT240128ART240128A作为作为LCDLCD显示器。它集控制器、驱动器、显示存储器和液晶显显示器。它集控制器、驱动器、显示存储器和液晶显示屏于一体,能方便地与各种微处理器接口,不仅可显示一般简单字符,示屏于一体,能方便地与各种微处理器接口,不仅可显示一般简单字符,还可显示汉字、图形和曲线等,可方便地提供汉字菜单方式的人机界面。还可显示汉字、图形和曲线等,可方便地提供汉字菜单方式的人机界面。 RT240128ART240128A所需的负电源利用输入的十所需的负电源利用输入的十5V5V电源产生,这样,它的电源产生,这样,它的对外接口仅是一根对外接口仅是一根2222芯扁平电缆。芯扁平电缆。LPC2212LPC2212与与RT240128ART240128A的接口电路如图的接口电路如图9.219.21所示。其中,所示。其中,RT240128ART240128A的的RESETRESET由由LPC2212LPC2212的通用输出引脚的通用输出引脚P3.22P3.22控控制;制;CECE信号由信号由LPC2212LPC2212外部的存储器组外部的存储器组BANK3BANK3的片选信号的片选信号CS3CS3与地址线与地址线A21A21译码产生,当译码产生,当CS3CS3和和A21A21位低电平时,使液晶模块的片选位低电平时,使液晶模块的片选 9.3.2 三关节机器人控制系统的硬件电路设计 信信号号LCDCSLCDCS有效;有效;C/DC/D信号由信号由LPC2212LPC2212的地址线的地址线AOAO提供,提供,A0=1A0=1为指令为指令口地址口地址( (地址为地址为0x8300 0001H ), AO=O0x8300 0001H ), AO=O为数据口地址为数据口地址( (地址为地址为0x8300 0x8300 0000H)0000H); VoutVout是是RT240128ART240128A的负电源输出电压,经电阻的负电源输出电压,经电阻R21R21、 R22R22分压分压输入到输入到V0V0提供提供LCDLCD驱动电压;驱动电压;LEDLED十和十和LEDLED一是液晶的背光灯电源;考虑一是液晶的背光灯电源;考虑液晶模块为液晶模块为5V5V供电系统,供电系统,LPC2212LPC2212的的1/O1/O口供电电源为口供电电源为3.3V3.3V,尽管可承,尽管可承受受5V5V电压,但为保险起见,在液晶模块与电压,但为保险起见,在液晶模块与LPC2212LPC2212的所有接口线中均串的所有接口线中均串接一个阻值为接一个阻值为470470的小电阻,起保护缓冲作用。的小电阻,起保护缓冲作用。 9.3.2 三关节机器人控制系统的硬件电路设计图图9.21 9.21 液晶显示模块液晶显示模块RT240128ART240128A与与LPC2212LPC2212的接口电路的接口电路 9.3.2 三关节机器人控制系统的硬件电路设计 3. 3. 伺服驱动单元电路伺服驱动单元电路 包括位置反馈输入电路和驱动脉冲输出电路。包括位置反馈输入电路和驱动脉冲输出电路。 位置反馈输入电路位置反馈输入电路 在机器人和机床等运动控制系统中,大量采用光电编码器作位在机器人和机床等运动控制系统中,大量采用光电编码器作位移移/ /角度角度/ /角速度检测元件,它利用光电转换原理直接将位移角速度检测元件,它利用光电转换原理直接将位移/ /角度角度/ /角角速度的模拟量转换成相应的电脉冲或数字量,具有分辨率高、体积小、速度的模拟量转换成相应的电脉冲或数字量,具有分辨率高、体积小、精度高、工作可靠、接口数字化等优点。精度高、工作可靠、接口数字化等优点。 9.3.2 三关节机器人控制系统的硬件电路设计 本系统中采用增量式光电编码器作为位移本系统中采用增量式光电编码器作为位移/ /速度检测器件,它输出速度检测器件,它输出方波脉冲信号方波脉冲信号A A、B B和零脉冲信号和零脉冲信号Z Z,以及它们的反相信号,以及它们的反相信号/A/A、/B/B和和/Z/Z。其中其中Z Z脉冲每转出现一次,用于调整电气和机械的零位。脉冲每转出现一次,用于调整电气和机械的零位。A A、B B信号的相信号的相位差位差90O90O,利用,利用A A、B B信号的相位关系即可判断位移或速度的方向,对信号的相位关系即可判断位移或速度的方向,对A A、B B脉冲计数即可获得位移或速度值。为了提高分辨率,通常将脉冲信号脉冲计数即可获得位移或速度值。为了提高分辨率,通常将脉冲信号A A、B B四倍频后送入计数器进行计数。同时,为了提高抗干扰性,在光电编四倍频后送入计数器进行计数。同时,为了提高抗干扰性,在光电编码器的输出到四倍频之间加入差动接收以及光电隔离电路。其原理图如码器的输出到四倍频之间加入差动接收以及光电隔离电路。其原理图如图图9.229.22所示。所示。 9.3.2 三关节机器人控制系统的硬件电路设计图图9.22 9.22 位置反馈信号处理电路框图位置反馈信号处理电路框图 图图9.229.22所示的位置反馈信号处理电路既可用标准的所示的位置反馈信号处理电路既可用标准的ICIC芯片或芯片或PALPAL、GALGAL等简单可编程逻辑器件来设计实现,也可用等简单可编程逻辑器件来设计实现,也可用CPLDCPLD等复杂可编程逻辑等复杂可编程逻辑器件来设计实现。本系统采用这两者结合的方法实现器件来设计实现。本系统采用这两者结合的方法实现, ,即图即图9.229.22中的倍中的倍频、辨向和计数电路采用一块频、辨向和计数电路采用一块CPLDCPLD芯片芯片XC9572XC9572,通过用,通过用VHDLVHDL语言对该芯语言对该芯片编程来实现;而差动接收和光电隔离电路则分别用四路线性差分接收片编程来实现;而差动接收和光电隔离电路则分别用四路线性差分接收芯片芯片AM26LS32AM26LS32和光电耦合器芯片和光电耦合器芯片6NI376NI37实现。实现。 9.3.2 三关节机器人控制系统的硬件电路设计 具体设计时,可按如下步骤进行:具体设计时,可按如下步骤进行: 用用VHDLVHDL语言分别设计能对语言分别设计能对3 3轴反馈信号分别进行加减计数的轴反馈信号分别进行加减计数的1616位位可逆计数器、四倍频电路和辨向电路,并一一作功能仿真,验证其功能,可逆计数器、四倍频电路和辨向电路,并一一作功能仿真,验证其功能,得到一个得到一个3 3轴位置反馈信号核心处理电路方案(程序)。轴位置反馈信号核心处理电路方案(程序)。 用同样的软件设计方法,为该核心处理电路设计一个地址译码用同样的软件设计方法,为该核心处理电路设计一个地址译码器,以便对器,以便对LPC2212LPC2212发出的地址信号、读发出的地址信号、读/ /写写(OE/WE)(OE/WE)信号进行译码,作信号进行译码,作为片选信号控制其内部相应电路的读为片选信号控制其内部相应电路的读/ /写操作。设计地址译码器时,地写操作。设计地址译码器时,地址信号选用址信号选用A1A1、A0,A0,其不同的编码对应不同的运动轴;同时,将芯片其不同的编码对应不同的运动轴;同时,将芯片XC9572XC9572地址空间放置在地址空间放置在LPC2212LPC2212外部存储组外部存储组Bank3Bank3中,将片选信号中,将片选信号CS3CS3和和地址信号地址信号A21A21组合作为组合作为XC9572XC9572的片选信号的片选信号(CS3=0, A21=1(CS3=0, A21=1时选通时选通) ),以便,以便将其与液晶显示模块将其与液晶显示模块RT240128ART240128A的地址空间区分开来的地址空间区分开来 。 9.3.2 三关节机器人控制系统的硬件电路设计 各运动轴的具体编码及地址如表各运动轴的具体编码及地址如表9.19.1所示。所示。 表表9.1 9.1 各运动轴的编码及地址各运动轴的编码及地址运运动轴编码(A1 A0A1 A0)对应地址地址X X 轴01H01H0X8320 0001H0X8320 0001HY Y 轴10H10H0X8320 0002H0X8320 0002HZ Z 轴11H11H0X8320 0003H0X8320 0003H 将上述核心处理电路和地址译码器按逻辑关系连接,设计成将上述核心处理电路和地址译码器按逻辑关系连接,设计成一个项目整体,统一进行综合、生成一个项目整体,统一进行综合、生成VSMVSM网表文件、功能仿真、布局网表文件、功能仿真、布局布线以及时序仿真,通过后用布线以及时序仿真,通过后用ISPISP菊花链下载软件将设计下载到菊花链下载软件将设计下载到XC9572XC9572芯片中,即完成了整个位置反馈信号处理电路的设计。芯片中,即完成了整个位置反馈信号处理电路的设计。 9.3.2 三关节机器人控制系统的硬件电路设计 将设计好的位置反馈信号处理芯片将设计好的位置反馈信号处理芯片XC9572XC9572芯片与差分接收芯片芯片与差分接收芯片AM26LS32AM26LS32、光电隔离芯片、光电隔离芯片6NI376NI37按照图按照图9.229.22所示的关系实现正确连接。其所示的关系实现正确连接。其中,中,AM26LS32AM26LS32与与6NI376NI37在系统中的电路连接如图在系统中的电路连接如图9.239.23所示所示(X(X、Y Y、Z Z三轴各三轴各有一套这样的电路,这里只画出第一套有一套这样的电路,这里只画出第一套) )。这样,由光电编码器反馈输出。这样,由光电编码器反馈输出的信号的信号( (iAiA十、十、iAiA-, -, iBiB十、十、iBiB- -和和iZ+,iZiZ+,iZ-)-),经,经AM26LS232AM26LS232处理和经处理和经6NI376NI37光电隔离后,即可相继得到编码器三相信号(光电隔离后,即可相继得到编码器三相信号(iAiA、iBiB、iZiZ)和()和(AiAi、BiBi、ZiZi),其中),其中i i1 1,2 2,3 3。图图9.23 AM26LS329.23 AM26LS32与与6NI376NI37在系统中的电路连接在系统中的电路连接 9.3.2 三关节机器人控制系统的硬件电路设计 驱动脉冲输出电路驱动脉冲输出电路 系统中采用系统中采用LPC2212LPC2212所具有的所具有的6 6路路PWMPWM方式输出驱动脉冲,可编程实现脉方式输出驱动脉冲,可编程实现脉冲和方向信号冲和方向信号PLUSnPLUSn、DIRn(nDIRn(n=1,2,3)=1,2,3)的模式或是正负脉冲的模式或是正负脉冲PLUSnPLUSn十、十、PLUSn-PLUSn-(n(n=1,2,3)=1,2,3)的模式,以满足不同应用的需要。基于与上同样的原因,系统中选用的模式,以满足不同应用的需要。基于与上同样的原因,系统中选用了四路线性差分驱动芯片了四路线性差分驱动芯片AM26LS31AM26LS31实现将每一路的信号转换为差分信号,具体实现将每一路的信号转换为差分信号,具体实现电路如图实现电路如图9.249.24所示。同样,为防止电机等外界干扰源的干扰信号的窜入,所示。同样,为防止电机等外界干扰源的干扰信号的窜入,在驱动脉冲信号输出前也经高速光耦器在驱动脉冲信号输出前也经高速光耦器6N1376N137实现信号的电气隔离。实现信号的电气隔离。图图9.23 AM26LS329.23 AM26LS32与与6NI376NI37在系统中的电路连接在系统中的电路连接 9.3.2 三关节机器人控制系统的硬件电路设计 4 4 特殊功能特殊功能I/OI/O电路电路 运动控制器在实际应用中,还应为各关节(运动轴)设置一些特运动控制器在实际应用中,还应为各关节(运动轴)设置一些特殊功能的殊功能的I/OI/O信息,如限位输入信号、原点输入信号、报警条件输入信号信息,如限位输入信号、原点输入信号、报警条件输入信号和使能驱动输出信号、复位驱动输出信号等,以便作相应的处理。同时,和使能驱动输出信号、复位驱动输出信号等,以便作相应的处理。同时,还应该为伺服电机驱动器提供一些输出信号,去控制其相关特殊功能。表还应该为伺服电机驱动器提供一些输出信号,去控制其相关特殊功能。表9.29.2所示的即为本系统控制器所设置的一些特殊功能信号,以及与之对应所示的即为本系统控制器所设置的一些特殊功能信号,以及与之对应的的LPC2212LPC2212连接引脚。考虑到每个运动轴都有左、右两个限位信号,如果连接引脚。考虑到每个运动轴都有左、右两个限位信号,如果将它们均直接引入将它们均直接引入LPC2212LPC2212的外部中断引脚,不仅没有必要,也浪费微控的外部中断引脚,不仅没有必要,也浪费微控制器片上有限的资源,为此本系统为每个轴都引入了一个制器片上有限的资源,为此本系统为每个轴都引入了一个74097409与门,将其与门,将其左、右限位信号左、右限位信号“负或负或”后,再输入到后,再输入到LPC2212LPC2212相应的中断引脚。这样,相应的中断引脚。这样,6 6个限位信号只需对应个限位信号只需对应3 3个中断引脚。另外,为了提高抗干扰性,实际电路个中断引脚。另外,为了提高抗干扰性,实际电路中还在每个中还在每个I/OI/O信号与信号与LPC2212LPC2212的对应引脚间都引入了一个光电隔离器。的对应引脚间都引入了一个光电隔离器。 9.3.2 三关节机器人控制系统的硬件电路设计表表9.2 9.2 特殊功能特殊功能I/OI/O信号及其对应的信号及其对应的LPC2212LPC2212连接引脚连接引脚I/OI/O信号信号对应的的LPC2212LPC2212连接引脚接引脚限位限位输入信号(每入信号(每轴左、右两个)左、右两个)EIN0(P0.16), EIN1(P0.3), EIN0(P0.16), EIN1(P0.3), EIN2(P0.15)EIN2(P0.15)原点原点输入信号(每入信号(每轴1 1个)个)P0.23P0.23,P0.24P0.24,P0.25P0.25报警条件警条件输入信号(每入信号(每轴1 1个)个)P2.28P2.28,P2.29P2.29,P2.30P2.30使能使能驱动输出信号(每出信号(每轴1 1个)个)P0.27P0.27,P0.28P0.28,P0.29P0.29复位复位驱动输出信号(每出信号(每轴1 1个)个)P3.22P3.22,P3.23P3.23,P3.28P3.28通用通用I/OI/O信号(信号(2525路)路)P1.16P1.16P1.25P1.25,P2.16P2.16P2.25P2.25,P3.16P3.16P3.20P3.20 9.3.2 三关节机器人控制系统的硬件电路设计特殊功能特殊功能I/OI/O信号的具体电路连接如图信号的具体电路连接如图9.259.25所示。所示。图图9 9. .2 25 5 特特殊殊功功能能I I/ /O O信信号号的的电电路路 9.3.2 三关节机器人控制系统的硬件电路设计 5. 5. 辅助性电路辅助性电路 包括工作电源、时钟和复位等电路。包括工作电源、时钟和复位等电路。 电源电路电源电路 本系统需使用本系统需使用3 3种电源:种电源:3.3V 3.3V ,用于,用于LPC2212LPC2212的的I/OI/O口供电;口供电;1.8V1.8V,用于内核及片内外设供电;,用于内核及片内外设供电;5V 5V ,用于,用于LCMLCM及其它一些外围器件供及其它一些外围器件供电。为简化电源设计,只从外部为系统提供一个高质量的电。为简化电源设计,只从外部为系统提供一个高质量的5V5V直流稳压电直流稳压电源输入,然后在内部通过两个低压差电源芯片源输入,然后在内部通过两个低压差电源芯片LM1117MPX-1.8LM1117MPX-1.8和和LM LM 117MPX-3.3117MPX-3.3,分别得到,分别得到3.3V3.3V和和1.8V1.8V的稳压输出电源,如图的稳压输出电源,如图9.269.26所示。其所示。其中输出端所接的中输出端所接的lOFlOF电容用于改善瞬态响应特性和稳定性。电容用于改善瞬态响应特性和稳定性。 9.3.2 三关节机器人控制系统的硬件电路设计图图9.26 9.26 系统电源电路系统电源电路 9.3.2 三关节机器人控制系统的硬件电路设计 时钟电路时钟电路 本系统中,根据本系统中,根据LPC2212LPC2212的最高工作频率以及的最高工作频率以及PLLPLL电路的工作方式,电路的工作方式,为为LPC2212LPC2212设置了设置了lOMHzlOMHz的外部晶振。为使晶振易于起振,在其两端并接了一的外部晶振。为使晶振易于起振,在其两端并接了一个个1M1M的电阻。晶振电路如图的电阻。晶振电路如图9.279.27所示。所示。1OMHz1OMHz的晶振频率经过的晶振频率经过LPC2212LPC2212片内片内的的PLLPLL电路倍频后,最高可达电路倍频后,最高可达60MHz60MHz。片内的。片内的PLLPLL电路除有倍频功能外,还有电路除有倍频功能外,还有信号提纯的功能,因此,系统不仅可以较低时钟频率获得较高工作频率,而信号提纯的功能,因此,系统不仅可以较低时钟频率获得较高工作频率,而且可降低因高速开关时钟所造成的高频噪声。且可降低因高速开关时钟所造成的高频噪声。图图9 9. .2 27 7 时时钟钟电电路路 9.3.2 三关节机器人控制系统的硬件电路设计 复位电路复位电路 本系统使用专用微处理器电源监控芯片本系统使用专用微处理器电源监控芯片MAX708SDMAX708SD外加三态缓冲外加三态缓冲门门74HC12574HC125构成复位电路,如图构成复位电路,如图9.289.28所示。其中,信号所示。其中,信号nRSTnRST和和nTRSTnTRST分别分别连接到连接到LPC2212LPC2212芯片的复位引脚芯片的复位引脚/REST/REST和内部和内部JTAGJTAG接口电路复位引脚接口电路复位引脚/TRST/TRST。当复位按键。当复位按键SB1SB1按下时,按下时,MAX708SDMAX708SD的引脚的引脚/RST/RST立即输出低电平复立即输出低电平复位信号,使两个位信号,使两个74HC125A74HC125A导通,致使导通,致使nRSTnRST、nTRSTnTRST两个复位信号有效。两个复位信号有效。平时平时MAX708SDMAX708SD的的/RST/RST输出高电平,两个输出高电平,两个74HC125A74HC125A均截止,由上拉电阻均截止,由上拉电阻R3R3、R4R4将信号将信号nRSTnRST、nTRSTnTRST上拉为高电平,系统可正常运行或进行上拉为高电平,系统可正常运行或进行JTAGJTAG仿真仿真调试。调试。 9.3.2 三关节机器人控制系统的硬件电路设计图图9.28 9.28 复位电路复位电路 9.3.3 三关节机器人控制系统的软件设计 本控制系统是基于本控制系统是基于ARMARM嵌入式控制器建立的,其软件只能在嵌入式控制器建立的,其软件只能在PCPC机机上编写和调试,然后将调试好的程序(扩展文件名为上编写和调试,然后将调试好的程序(扩展文件名为* *. .TdfTdf的的G G代码文件)代码文件)通过一个通过一个USBUSB下载软件,下载到嵌入式控制器。下载软件,下载到嵌入式控制器。 嵌入式控制系统的软件包括实时操作系统和用户应用程序两大嵌入式控制系统的软件包括实时操作系统和用户应用程序两大部分。由于部分。由于ARM7TDMIARM7TDMI芯片中没有芯片中没有MMUMMU,所以其操作系统和应用程序的地,所以其操作系统和应用程序的地址编译完全是固定的,并编译在一起,最后生成一个文件,下载到嵌入址编译完全是固定的,并编译在一起,最后生成一个文件,下载到嵌入式控制器中执行。这与在式控制器中执行。这与在DOSDOS或或WindowsWindows环境下的环境下的PCPC机上开发软件是大不机上开发软件是大不相同的。在相同的。在PCPC机上,操作系统文件和用户应用程序是分开的,而且可以机上,操作系统文件和用户应用程序是分开的,而且可以有多个应用程序同时存在于主机中;而有多个应用程序同时存在于主机中;而ARMARM嵌入式控制器中的操作系统嵌入式控制器中的操作系统和应用程序不可分,当然就只能合二而一,形成一个统一的程序了,要和应用程序不可分,当然就只能合二而一,形成一个统一的程序了,要想换另一个应用,必须重新将它和操作系统一起编译、重新下载想换另一个应用,必须重新将它和操作系统一起编译、重新下载 。 9.3.3 三关节机器人控制系统的软件设计 本嵌入式控制器使用基于本嵌入式控制器使用基于CC/OS-II/OS-II内核的内核的RTOSRTOS操作系统。其用户应操作系统。其用户应用程序大体包括人机界面、数字输入输出、运动控制和与用程序大体包括人机界面、数字输入输出、运动控制和与PCPC机通信等四大机通信等四大功能模块,各大模块均由若干子模块组成,模块与模块间的通信通过操作功能模块,各大模块均由若干子模块组成,模块与模块间的通信通过操作系统提供的消息、消息邮箱等机制来完成。整个系统的软件结构如图系统提供的消息、消息邮箱等机制来完成。整个系统的软件结构如图9.299.29的框图所示。的框图所示。 与与PCPC机通信模块:机通信模块: USBUSB数据发送;数据发送;USBUSB数据接收数据接收运动控制模块:运动控制模块: 插补算法;插补算法; 位置反馈位置反馈PIDPID算法算法CC/OS-II/OS-IIRTOSRTOS数字输入输出模块:数字输入输出模块:各轴位置采集;各轴位置采集;驱动输出;驱动输出;限位、驱动限位、驱动 人机界面模块:人机界面模块: 键盘输入;键盘输入;液晶显示液晶显示图图9.29 9.29 系统的软件结构框图系统的软件结构框图 9.3.3 三关节机器人控制系统的软件设计 显然,整个系统的软件设计,首先需要将显然,整个系统的软件设计,首先需要将CC/OS-II/OS-II实时操作系实时操作系统移植到统移植到ARMARM处理器芯片处理器芯片LPC2212LPC2212上,使之能在微控制器上运行。有关上,使之能在微控制器上运行。有关CC/OS-II/OS-II操作系统的移植方法,可见有关专门参考文献(如书后文献操作系统的移植方法,可见有关专门参考文献(如书后文献【8787】等),甚至可直接采用一些公司(如周立功公司等)提供的移等),甚至可直接采用一些公司(如周立功公司等)提供的移植代码,本书不赘述。这里仅对用户应用程序的设计有重点地加以说植代码,本书不赘述。这里仅对用户应用程序的设计有重点地加以说明。明。 9.3.3.1 主要应用程序模块的设计 1. 1. 人机界面模块人机界面模块 人机界面分两部分:键盘输入与液晶显示。人机界面分两部分:键盘输入与液晶显示。 键盘输入模块键盘输入模块 键盘输入子模块负责识别键盘的按键操作,如有键按下且合法键盘输入子模块负责识别键盘的按键操作,如有键按下且合法有效,则转到相应的处理任务去完成相应键功能。有效,则转到相应的处理任务去完成相应键功能。 键盘输入采用的是循环扫描方式:在系统中创建一个键盘扫描键盘输入采用的是循环扫描方式:在系统中创建一个键盘扫描任务,按照预定的扫描周期,对键盘输入进行检测。检测到合法有效任务,按照预定的扫描周期,对键盘输入进行检测。检测到合法有效按键后,就将该按键的扫描码写入消息发送给其他任务,通知系统某按键后,就将该按键的扫描码写入消息发送给其他任务,通知系统某按键被按下。本系统通过建立一个如图按键被按下。本系统通过建立一个如图9.309.30所示的状态机来实现按键所示的状态机来实现按键的扫描及相应功能。的扫描及相应功能。 9.3.3.1 主要应用程序模块的设计图图9.30 9.30 键盘扫描任务状态机键盘扫描任务状态机 9.3.3.1 主要应用程序模块的设计 该状态机在每次去除回弹周期内执行一次,每该状态机在每次去除回弹周期内执行一次,每KEY_ KEY_ SCAN_TASK_DLYSCAN_TASK_DLY毫秒时间内执行四分之一个状态,即:刚开始时,状态毫秒时间内执行四分之一个状态,即:刚开始时,状态机处于机处于KEY_STATE_UPKEY_STATE_UP状态;当有键被按下时,状态改变为状态;当有键被按下时,状态改变为KEY_ KEY_ STAT_DEBOUNCESTAT_DEBOUNCE,然后延时,然后延时KEY_SCAN_DLYKEY_SCAN_DLY毫秒;延时后若发现键未被释毫秒;延时后若发现键未被释放,则状态机再延时放,则状态机再延时KEY_SCAN_ASK_DLYKEY_SCAN_ASK_DLY毫秒;再延时后若发现键已释毫秒;再延时后若发现键已释放,则返回到放,则返回到KEY_STAT_UPKEY_STAT_UP状态;若键依然被按下,则任务通过调用函状态;若键依然被按下,则任务通过调用函数数KeyDecodeKeyDecode()()得到键的扫描码,并通过调用函数得到键的扫描码,并通过调用函数KeyButlnKeyButln()(),把扫描,把扫描码存入键盘数据缓存区和通知系统按键被按下。如果该键按下的时间码存入键盘数据缓存区和通知系统按键被按下。如果该键按下的时间超过超过KEY_RPT_START_ DLYKEY_RPT_START_ DLY扫描时间,则启动自动重复功能,再次将该扫描时间,则启动自动重复功能,再次将该键的扫描码存入缓存区,等效于再次按下该键,且状态机的状态改变键的扫描码存入缓存区,等效于再次按下该键,且状态机的状态改变为为KEY_ STATE_ DEBOUNCEKEY_ STATE_ DEBOUNCE状态,用于去除键被释放时的回弹。状态,用于去除键被释放时的回弹。 9.3.3.1 主要应用程序模块的设计 液晶显示模块液晶显示模块 液晶显示模块负责提供液晶显示所需的硬件驱动程序,包括液液晶显示模块负责提供液晶显示所需的硬件驱动程序,包括液晶显示器初始化程序和一系列与显示任务有关的其他接口函数子程序。晶显示器初始化程序和一系列与显示任务有关的其他接口函数子程序。通过将液晶显示的硬件细节隐藏在这些接口函数中,其他应用程序就通过将液晶显示的硬件细节隐藏在这些接口函数中,其他应用程序就可以只需调用这些硬件无关的接口函数来完成显示任务了。本系统提可以只需调用这些硬件无关的接口函数来完成显示任务了。本系统提供的几种接口函数有供的几种接口函数有: : . . DispInitDispInit():():液晶初始化函数。它假设操作系统的多任务己液晶初始化函数。它假设操作系统的多任务己经启动,并要使用实时内核提供的服务。该函数初始化硬件,创建信经启动,并要使用实时内核提供的服务。该函数初始化硬件,创建信号量,并设置号量,并设置LCDLCD模块的操作模式。必须在使用任何其他函数之前调用模块的操作模式。必须在使用任何其他函数之前调用它。它。 9.3.3.1 主要应用程序模块的设计 . . DispCharDispChar():():单个字符显示函数。用于在显示器的任意位置单个字符显示函数。用于在显示器的任意位置显示单个字符。显示单个字符。 . . DispCIrLineQDispCIrLineQ: :行清除函数。用于清除行清除函数。用于清除LCDLCD模块的某一行,即模块的某一行,即用空格字符的用空格字符的 ASCIIASCII码码Ox20HOx20H填充。填充。 . . DisCIrScrDisCIrScr():():清屏函数。清屏后使光标位于左上角。清屏函数。清屏后使光标位于左上角。 . . DispDefCharDispDefChar():():字符字符/ /符号定义函数。用于使字符符号定义函数。用于使字符/ /符号位于符号位于CGRAMCGRAM区域,设置其像素为区域,设置其像素为 58, 58, 代码为代码为Ox80HOx80HOxFFHOxFFH。 . . DispStrDispStr():():字符串显示函数。用于在显示器任何位置显示字符串显示函数。用于在显示器任何位置显示ASCIIASCII字符串。字符串。 以上这些函数可以被应用程序调用,以完成需要的显示功能。以上这些函数可以被应用程序调用,以完成需要的显示功能。 9.3.3.1 主要应用程序模块的设计 显然,这些函数是硬件无关性的。硬件的驱动部分被封装在以显然,这些函数是硬件无关性的。硬件的驱动部分被封装在以下三个函数之中:下三个函数之中: . . DisplnitPort():IDisplnitPort():I/O/O端口初始化函数。用于初始化与端口初始化函数。用于初始化与LCDLCD模模块相连接的输入输出端口。块相连接的输入输出端口。 . . DispDataWrDispDataWr():():单字节写函数。用于写一个字节数据到单字节写函数。用于写一个字节数据到LCDLCD模模块。根据块。根据C/ DC/ D的状态,该字节发往命令寄存器或数据寄存器。的状态,该字节发往命令寄存器或数据寄存器。 . . DispSel():CDispSel():C/D/D状态改变函数。用于改变状态改变函数。用于改变C/DC/D的状态,其参数的状态,其参数只有只有DISP_ SEL_CMD_REGDISP_ SEL_CMD_REG和和DISP_SE_ AT_REGDISP_SE_ AT_REG两种,分别用来选中命令两种,分别用来选中命令寄存器和数据寄存器。寄存器和数据寄存器。 9.3.3.1 主要应用程序模块的设计 3. 3. 数字输入输出模块数字输入输出模块 数字输入输出模块负责完成各关节(运动轴)的位置反馈信号数字输入输出模块负责完成各关节(运动轴)的位置反馈信号采集和驱动脉冲输出。采集和驱动脉冲输出。 对于多轴联动控制系统来说,这部分的性能至关重要。位置反对于多轴联动控制系统来说,这部分的性能至关重要。位置反馈信号是由光电编码器转换而来的脉冲或数字信号,其采集和限位输入、馈信号是由光电编码器转换而来的脉冲或数字信号,其采集和限位输入、驱动使能输出一样,实现起来比较简单。在本系统中,使用邮箱来存储驱动使能输出一样,实现起来比较简单。在本系统中,使用邮箱来存储光电编码器位置反馈值,当系统执行驱动脉冲输出程序被光电编码器位置反馈值,当系统执行驱动脉冲输出程序被DDADDA周期定时周期定时中断后,位置检测任务则将位置反馈值存入邮箱中,而相应的位置控制中断后,位置检测任务则将位置反馈值存入邮箱中,而相应的位置控制任务如发现该邮箱中有新的消息产生,就会对应的作出位置比较,修改任务如发现该邮箱中有新的消息产生,就会对应的作出位置比较,修改位置误差。位置误差。 9.3.3.1 主要应用程序模块的设计 下面是主程序等待位置反馈值并在有反馈时将它接收并存入邮箱下面是主程序等待位置反馈值并在有反馈时将它接收并存入邮箱的程序段:的程序段: void void MainseMainse Task(voidTask(void *id) *id) PosmsgPosmsg pmsgpmsg=0=0; for(for(;) pmsgpmsg = = WaitMessageWaitMessage()(); /等待消息等待消息 Switch(pmsgSwitch(pmsg-message-message Feedback(pmsgFeedback(pmsg-posvalueposvalue) );/接收反馈值接收反馈值 BreakBreak; DeleteMessage(pmsgDeleteMessage(pmsg); /删除消息,释放资源删除消息,释放资源 9.3.3.1 主要应用程序模块的设计 各关节的运动方向控制及其驱动脉冲产生输出的任务,本系统是基各关节的运动方向控制及其驱动脉冲产生输出的任务,本系统是基于于LPC2212LPC2212的的PWMPWM功能来实现的。功能来实现的。LPC2212LPC2212的的PWMPWM功能是建立在标准的定时器功能是建立在标准的定时器之上的,它具有之上的,它具有3232位定时器、预分频控制电路和位定时器、预分频控制电路和7 7个匹配寄存器,可实现个匹配寄存器,可实现6 6个单边个单边PWMPWM输出和输出和3 3个双边个双边PWMPWM输出,也可采用这两种类型的混合输出,具输出,也可采用这两种类型的混合输出,具有匹配中断、匹配有匹配中断、匹配PWMTCPWMTC复位和匹配复位和匹配PWMTCPWMTC停止等功能。其比较匹配功能的停止等功能。其比较匹配功能的实现框图如图实现框图如图9.319.31所示。定时器比较匹配由控制寄存器所示。定时器比较匹配由控制寄存器PWMMCRPWMMCR进行匹配操进行匹配操作设置,而作设置,而PWMMRO-6PWMMRO-6则为则为7 7路比较匹配通道的比较值寄存器。当比较匹配路比较匹配通道的比较值寄存器。当比较匹配时,将会按照时,将会按照PWMMCRPWMMCR设置的方法产生中断或复位设置的方法产生中断或复位PWMTCPWMTC等,而且等,而且PWMPCRPWMPCR可可以控制允许以控制允许/ /不允许不允许PWMPWM输出和单边输出和单边/ /双边双边PWMPWM输出。另外,输出。另外,LPC2212LPC2212使用了使用了一个一个PWMLERPWMLER锁存使能寄存器,可确保对锁存使能寄存器,可确保对PWMMRO-6PWMMRO-6的比较值进行修改过程中的比较值进行修改过程中不影响不影响PWMPWM输出。当修改输出。当修改PWMMRO-6PWMMRO-6的比较值时,只有使的比较值时,只有使PWMLERPWMLER的对应位置的对应位置1 1,在匹配,在匹配0 0事件发生后此值才会生效。事件发生后此值才会生效。 9.3.3.1 主要应用程序模块的设计图图9.31 PWM9.31 PWM的比较匹配寄存器功能框图的比较匹配寄存器功能框图 9.3.3.1 主要应用程序模块的设计 系统采用了配置单边系统采用了配置单边PWMPWM、复位、复位PWMTCPWMTC功能,可输出脉冲功能,可输出脉冲/ /方向模方向模式和正负脉冲模式供用户选择。在使用单片式和正负脉冲模式供用户选择。在使用单片PWMPWM输出时,在输出时,在PWMPWM周期开周期开始时为高电平,匹配后为低电平,使用始时为高电平,匹配后为低电平,使用PWMMROPWMMRO作为作为PWMPWM周期控制,周期控制,PWMMRxPWMMRx作为占空比控制。若作为占空比控制。若PWMMRxPWMMRx的匹配值为的匹配值为0 0,则该引脚输出在该,则该引脚输出在该PWMPWM周期内一直为低;反之,若匹配值等于周期内一直为低;反之,若匹配值等于MROMRO,则输出在该周期一直,则输出在该周期一直为高。经过设计,本系统可以在同一时刻产生三个关节的驱动脉冲输为高。经过设计,本系统可以在同一时刻产生三个关节的驱动脉冲输出。出。 9.3.3.1 主要应用程序模块的设计 以下是输出脉冲以下是输出脉冲/ /方向模式的例程方向模式的例程: : void servo_ control() void servo_ control() PINSELO PINSELOOxOOOA80OA; /OxOOOA80OA; /设置设置PWM1-PWM6PWM1-PWM6连接到相应的输连接到相应的输 出引脚出引脚 PINSELIPINSELIOxOO000400;OxOO000400; PWM_InitPWM_Init(); /PWM(); /PWM初始化初始化 pwmdataOpwmdataO= =cycle_datacycle_data; ; pwmdatalpwmdatal= =x_plusx_plus; ; pwmdata2= pwmdata2=x_dirx_dir; ; pwndata3= pwndata3=y_plusy_plus; ; pwmdata4= pwmdata4=y_diry_dir; ; pwmdata5= pwmdata5=z_plusz_plus; ; 9.3.3.1 主要应用程序模块的设计pwmdata6=z dir;pwmdata6=z dir; while(1) while(1) PWMMRO= PWMMRO=pwmdataOpwmdataO; /; /设置设置PWMPWM周期周期 PWMMRlPWMMRl= =pwmdatalpwmdatal; /; /运动脉冲输出运动脉冲输出 PWMMR2=pwmdata2; /PWMMR2=pwmdata2; /运动方向输出运动方向输出 PWMMR3=pwmdata3;PWMMR3=pwmdata3; PWMMR4=pwmdata4; PWMMR4=pwmdata4; PWMMR5=pwmdata5; PWMMR5=pwmdata5; PWMMR6=pwmdata6; PWMMR6=pwmdata6; PWMLER= 0x41; /PWMMRO PWMLER= 0x41; /PWMMRO6 6锁存,更新锁存,更新PWMPWM占空比占空比 9.3.3.1 主要应用程序模块的设计 4. 4. 运动控制模块运动控制模块 运动控制模块主要的任务是实现与运动控制有关的算法。运动控制模块主要的任务是实现与运动控制有关的算法。 鉴于鉴于CC/OS-II/OS-II实时操作系统支持对键盘事件的响应,本系统的实时操作系统支持对键盘事件的响应,本系统的运动控制程序模块基于以下思想设计:提供一个主功能菜单,通过键盘运动控制程序模块基于以下思想设计:提供一个主功能菜单,通过键盘选择不同的菜单功能,每一个菜单功能下对应着一个相应的处理程序;选择不同的菜单功能,每一个菜单功能下对应着一个相应的处理程序;在通过键盘操作选择不同菜单功能项的同时,还可以往文本框中键入信在通过键盘操作选择不同菜单功能项的同时,还可以往文本框中键入信息,进行一些参数的设置。因此,运动控制程序模块的设计,实际上主息,进行一些参数的设置。因此,运动控制程序模块的设计,实际上主要就是建立一个基于菜单的控制功能表和设计相应的控制菜单响应函数。要就是建立一个基于菜单的控制功能表和设计相应的控制菜单响应函数。 9.3.3.1 主要应用程序模块的设计 基于菜单的控制功能表建立基于菜单的控制功能表建立 本系统的控制菜单结构如图本系统的控制菜单结构如图9.329.32所示。所示。主菜单主菜单轨迹调入轨迹调入参数设置参数设置机器人控制机器人控制轨迹下载轨迹下载PID参数参数重复执行重复执行执行轨迹执行轨迹运动速度运动速度轨迹精度轨迹精度系统时间系统时间传动参数传动参数手动控制手动控制自动寻零自动寻零臂臂 长长码码 盘盘KpKiKd减速器减速器返回零点返回零点图图9 9. .3 32 2 控控制制菜菜单单结结构构 9.3.3.1 主要应用程序模块的设计 按该菜单结构,定义一个对应的菜单响应函数指针数组,数组按该菜单结构,定义一个对应的菜单响应函数指针数组,数组中放置的是指向各菜单响应函数的指针。这样建立起来的响应函数指针中放置的是指向各菜单响应函数的指针。这样建立起来的响应函数指针数组实际上就是基于菜单的控制功能表。有关定义的程序段如下。数组实际上就是基于菜单的控制功能表。有关定义的程序段如下。void *void *MainFunctionMainFunction=(void*)(void*)OnLoadPath,(voidOnLoadPath,(void*)*)OnSetPara,(voidOnSetPara,(void*)*)OnRoboContOnRoboControl,(voidrol,(void*)*)OnUsb_DownloadOnUsb_Download;void *void *SetParaFunctionSetParaFunction=(void*)(void*)OnSetPID,(voidOnSetPID,(void*)*)OnSetMoveSpeed,(voidOnSetMoveSpeed,(void*)*)OnSetPaOnSetPathAccurate,(voidthAccurate,(void*)*)OnSetTimeOnSetTime, (void*), (void*)OnSetMoveParaOnSetMovePara;void *void *RoboControlFunctionRoboControlFunction=(void*)(void*)OnManual,(voidOnManual,(void*)*)OnAutoFindZero,(voidOnAutoFindZero,(void*)*)OnImpleOnImplementPath,(voidmentPath,(void*)*)OnRepeatPath,(voidOnRepeatPath,(void*)OnReturn2Zero;*)OnReturn2Zero; 9.3.3.1 主要应用程序模块的设计 有了上述菜单结构及菜单响应函数指针数组,操作系统便可以有了上述菜单结构及菜单响应函数指针数组,操作系统便可以进行消息分配了。对于菜单上的每一个菜单项都有一个状态,用进行消息分配了。对于菜单上的每一个菜单项都有一个状态,用mainstatusmainstatus变量记住这个状态。当在不同的状态下时,根据菜单控件的变量记住这个状态。当在不同的状态下时,根据菜单控件的当前高亮显示的内容,有一个函数与之对应。于是,当在某个状态下单当前高亮显示的内容,有一个函数与之对应。于是,当在某个状态下单击击OKOK按钮时,便会执行相对应的菜单控件上当前选项所对应的处理函数。按钮时,便会执行相对应的菜单控件上当前选项所对应的处理函数。例如,若在例如,若在mainstatusmainstatus为为MAIN_PARASETMAIN_PARASET(对应参数设置菜单)时单击了(对应参数设置菜单)时单击了OKOK按钮,且此时菜单上的选择条位于第二项,即按钮,且此时菜单上的选择条位于第二项,即“传动参数传动参数”,则,则OnSetMoveParaOnSetMovePara()()函数将得到执行。再如,当在函数将得到执行。再如,当在“机器人控制机器人控制 自动归零自动归零”状态下单击状态下单击了了OKOK按钮时,则其按钮时,则其mainstatusmainstatus为为MAIN_ROBOCONTROLMAIN_ROBOCONTROL,且,且pMainListCtrlpMainListCtrl- - CurrentSelCurrentSel为为2 2,则会对应地调用,则会对应地调用OnAutoFindZeroOnAutoFindZero()()函数。所有的控制函数。所有的控制函数,均是按这种方法实现的。函数,均是按这种方法实现的。 9.3.3.1 主要应用程序模块的设计 主要控制菜单响应函数的设计主要控制菜单响应函数的设计 控制菜单响应函数的设计,也即与运动控制有关的控制功能的实控制菜单响应函数的设计,也即与运动控制有关的控制功能的实现。现。 本三关节(运动轴)机器人控制系统是三个方向的速度和位移控本三关节(运动轴)机器人控制系统是三个方向的速度和位移控制系统。工作时,首先,通过制系统。工作时,首先,通过PCPC机根据运动控制所要达到的目标,进行图机根据运动控制所要达到的目标,进行图像数据处理、轨迹规划、预处理等工作,从而得到运动控制所需的各种参像数据处理、轨迹规划、预处理等工作,从而得到运动控制所需的各种参数,通过数,通过USBUSB下载到下载到U U盘中;然后,运动控制器通过盘中;然后,运动控制器通过USBUSB读取读取U U盘的运动控制盘的运动控制参数,存入插补缓冲区供插补任务处理;插补任务在插补任务周期内完成参数,存入插补缓冲区供插补任务处理;插补任务在插补任务周期内完成各个轴的位置增量计算,产生各轴所需的控制脉冲给位置控制任务;同时各个轴的位置增量计算,产生各轴所需的控制脉冲给位置控制任务;同时,位置反馈检测任务在同周期内完成各个轴的实际位置增量计算,并反馈,位置反馈检测任务在同周期内完成各个轴的实际位置增量计算,并反馈给位置控制任务;最后,位置控制任务通过理论位置与实际位置的比较,给位置控制任务;最后,位置控制任务通过理论位置与实际位置的比较,发出运动指令控制各个轴的运动,实现坐标轴的协同移动。图发出运动指令控制各个轴的运动,实现坐标轴的协同移动。图9.339.33所示即所示即为系统控制流程示意图。为系统控制流程示意图。 9.3.3.1 主要应用程序模块的设计图图9.33 9.33 系统控制流程示意图系统控制流程示意图 由上可见,控制菜单响应函数涉及的控制功能程序模块、子模块由上可见,控制菜单响应函数涉及的控制功能程序模块、子模块很多。下面仅就自动寻零、插补控制和伺服驱动几个核心功能模块的设很多。下面仅就自动寻零、插补控制和伺服驱动几个核心功能模块的设计作一介绍。计作一介绍。 9.3.3.1 主要应用程序模块的设计void void OnAutoFindZeroOnAutoFindZero()() /两个臂均以低速度、高加速度顺时针(负向)运动两个臂均以低速度、高加速度顺时针(负向)运动DM_ServoLoadTraj(1,VEL_MODE|LOAD_VEL|LOAD_ACC|ENABLE_SERVO|DM_ServoLoadTraj(1,VEL_MODE|LOAD_VEL|LOAD_ACC|ENABLE_SERVO| START_NOW|REVERSE,0,SpeedFactor1*20,AccFactor1*550,0); START_NOW|REVERSE,0,SpeedFactor1*20,AccFactor1*550,0); DM_ServoLoadTraj(2,VEL_MODE|LOAD_VEL|LOAD_ACC|ENABLE_SERVO|DM_ServoLoadTraj(2,VEL_MODE|LOAD_VEL|LOAD_ACC|ENABLE_SERVO| START_NOW|REVERSE,0,SpeedFactor2*20,AccFactor1*550,0); START_NOW|REVERSE,0,SpeedFactor2*20,AccFactor1*550,0);/等待状态,当碰到限位开关时停止等待状态,当碰到限位开关时停止for(;!(bAxislCWLimit&bAxis2CWLimit);)for(;!(bAxislCWLimit&bAxis2CWLimit);)/循环直到两个顺时针限位开关都被触发循环直到两个顺时针限位开关都被触发 【自动寻零模块自动寻零模块】 以下是自动寻找机器人坐标零点的程序模块:以下是自动寻找机器人坐标零点的程序模块: 9.3.3.1 主要应用程序模块的设计 DM_DefineStatus(1,SEND_AUX); /DM_DefineStatus(1,SEND_AUX); /获取轴获取轴1 1极限开关的状态极限开关的状态 AuxlAuxl=DM_GetStat(1);=DM_GetStat(1); if(Auxl&LIMIT1)=0) / if(Auxl&LIMIT1)=0) /是否碰到左极限是否碰到左极限 DM_DefineStatus(1,SEND_AUX); DM_DefineStatus(1,SEND_AUX); AuxlAuxl=DM_GetStat(1); /=DM_GetStat(1); /两次检测,防止错误信号两次检测,防止错误信号 if(Auxl&LIMIT1)=0) bAxis1ACWLimit=TRUE;if(Auxl&LIMIT1)=0) bAxis1ACWLimit=TRUE; else else bAxis1ACWLimit=FALSE; bAxis1ACWLimit=FALSE; if(Auxl&LIMIT2)=0) / if(Auxl&LIMIT2)=0) /是否碰到右极限是否碰到右极限 DM_DefineStatus(1,SEND_AUX); DM_DefineStatus(1,SEND_AUX); AuxlAuxl=DM_GetStat(1); /=DM_GetStat(1); /两次检测,防止错误信号两次检测,防止错误信号 if(Auxl&LIMIT2)=0) bAxis1CWLimit=TRUE;if(Auxl&LIMIT2)=0) bAxis1CWLimit=TRUE; 9.3.3.1 主要应用程序模块的设计 elseelse bAxis1CWLimit=FALSE; bAxis1CWLimit=FALSE; DM_DefineStatus(2,SEND_AUX); / DM_DefineStatus(2,SEND_AUX); /获取轴获取轴2 2极限开关的状态极限开关的状态 Aux2=DM_GetStat(2);Aux2=DM_GetStat(2); if(Aux2&LIMIT1)=0) if(Aux2&LIMIT1)=0) DM_DefineStatus(2,SEND_AUX); DM_DefineStatus(2,SEND_AUX); Aux2=DM_GetStat(2); / Aux2=DM_GetStat(2); /两次检测,防止错误信号两次检测,防止错误信号 if(Aux2&LIMIT1)=0) bAxis2ACWLimit=TRUE;if(Aux2&LIMIT1)=0) bAxis2ACWLimit=TRUE; else else bAxis2ACWLimit=FALSE; bAxis2ACWLimit=FALSE; if(Aux2&LIMIT2)=0) if(Aux2&LIMIT2)=0) DM_DefineStatus(2,SEND_AUX); DM_DefineStatus(2,SEND_AUX); Aux2=DM_GetStat(2); / Aux2=DM_GetStat(2); /两次检测,防止错误信号两次检测,防止错误信号 9.3.3.1 主要应用程序模块的设计 if(Aux2&LIMIT2)=0) bAxis2CWLimit=TRUE;if(Aux2&LIMIT2)=0) bAxis2CWLimit=TRUE; else else bAxis1CWLimit=FALSE; bAxis1CWLimit=FALSE; if(bAxis1CWLimit=0x01) if(bAxis1CWLimit=0x01) DM_ServoStopMotor(1,STOP_ABRUPT|AMP_ENABLE);/ DM_ServoStopMotor(1,STOP_ABRUPT|AMP_ENABLE);/停止限位停止限位 /已经到达的电机已经到达的电机 if(bAxis2CWLimit=0x01) if(bAxis2CWLimit=0x01) DM_ServoStopMotor(2,STOP_ABRUPT|AMP_ENABLE);/ DM_ServoStopMotor(2,STOP_ABRUPT|AMP_ENABLE);/停止限位停止限位 /已经到达的电机已经到达的电机 / /等到达极限后将极限位置设为电机新的零点等到达极限后将极限位置设为电机新的零点 DM_ServoResetPos(1);DM_ServoResetPos(1); DM_ServoResetPos(2); DM_ServoResetPos(2); 9.3.3.1 主要应用程序模块的设计 bAxis1CWLimit=bAxis2CWLimit=0x00;/ bAxis1CWLimit=bAxis2CWLimit=0x00;/ 并且极限触发状态复位并且极限触发状态复位 /然后两轴同时逆时针转到然后两轴同时逆时针转到X X轴起点(转多少根据实际情况调整)轴起点(转多少根据实际情况调整) DM_ServoLoadTraj(1,LOAD_POS|LOAD_VEL|LOAD_ACC|ENABLE_SERVO| DM_ServoLoadTraj(1,LOAD_POS|LOAD_VEL|LOAD_ACC|ENABLE_SERVO| START_NOW|PositionFactor1*12,SpeedFactor1*60,AccFactor1*550,0); START_NOW|PositionFactor1*12,SpeedFactor1*60,AccFactor1*550,0); DM_ServoLoadTraj(2,LOAD_POS|LOAD_VEL|LOAD_ACC|ENABLE_SERVO|START_ DM_ServoLoadTraj(2,LOAD_POS|LOAD_VEL|LOAD_ACC|ENABLE_SERVO|START_ NOW|PositionFactor2*12,SpeedFactor2*60,AccFactor2*550,0); NOW|PositionFactor2*12,SpeedFactor2*60,AccFactor2*550,0); / /以下检测是否到达以下检测是否到达X X轴起点轴起点 DM_DefineStatus(1,SEND_AUX);DM_DefineStatus(1,SEND_AUX); DM_DefineStatus(2,SEND_AUX); DM_DefineStatus(2,SEND_AUX); Aux1=DM_GetStat(1); Aux1=DM_GetStat(1); Aux2=DM_GetStat(2); Aux2=DM_GetStat(2); while(1) while(1) / /到达到达X X轴起点轴起点 9.3.3.1 主要应用程序模块的设计 if(Aux1&MOVE_DONE)=0x01)&(Aux2&MOVE_DONE)=0x01)if(Aux1&MOVE_DONE)=0x01)&(Aux2&MOVE_DONE)=0x01) DM_ServoResetPos(1); / DM_ServoResetPos(1); /将当前位置再次设为零将当前位置再次设为零, ,成为真正的机器成为真正的机器人坐标人坐标 零点零点 DM_ServoResetPos(2);DM_ServoResetPos(2); break; / break; /退出循环退出循环, ,机器人自动找零结束机器人自动找零结束 / IF / IF / /如果没有达到预定位置则再继续检测如果没有达到预定位置则再继续检测 DM_DefineStatus(1,SEND_AUX);DM_DefineStatus(1,SEND_AUX); DM_DefineStatus(2,SEND_AUX); DM_DefineStatus(2,SEND_AUX); Aux1=DM_GetStat(1); Aux1=DM_GetStat(1); Aux2=DM_GetStat(2); Aux2=DM_GetStat(2); /WHILE/WHILE 9.3.3.1 主要应用程序模块的设计 【插补控制模块插补控制模块】 插补控制模块是生成机器人实时运动轨迹的核心模块。其功能是:插补控制模块是生成机器人实时运动轨迹的核心模块。其功能是:从插补准备数据区获取数据,按照一定的插补算法,完成各运动轴的位置从插补准备数据区获取数据,按照一定的插补算法,完成各运动轴的位置增量的计算,得到一个新的控制量或控制增量增量的计算,得到一个新的控制量或控制增量( (即各运动轴所需的脉冲数即各运动轴所需的脉冲数) ),然后将它发送给位置控制任务。由位置控制任务再通过调用数字输入,然后将它发送给位置控制任务。由位置控制任务再通过调用数字输入输出模块,将控制量输出到伺服电机驱动器输出模块,将控制量输出到伺服电机驱动器, ,从而完成一次控制作用。可从而完成一次控制作用。可见,插补控制功能的主体是插补算法及计算,其工作流程如图见,插补控制功能的主体是插补算法及计算,其工作流程如图9.349.34所示。所示。 9.3.3.1 主要应用程序模块的设计图图9.34 9.34 插补控制模块流程图插补控制模块流程图 9.3.3.1 主要应用程序模块的设计 目前普遍应用的插补算法有许多种。综合利弊,本系统采用快速目前普遍应用的插补算法有许多种。综合利弊,本系统采用快速DDADDA插补算法。这是一种快速数字积分式脉冲增量插补算法,具有实现简单、运插补算法。这是一种快速数字积分式脉冲增量插补算法,具有实现简单、运算速度快、脉冲分配均匀、易干实现多坐标联动等优点。算速度快、脉冲分配均匀、易干实现多坐标联动等优点。 DDADDA插补算法的实现原理是插补算法的实现原理是: :脉冲源每产生一个脉冲,就控制被积函数脉冲源每产生一个脉冲,就控制被积函数进入累加器中作一次累加进入累加器中作一次累加( (等效于积分等效于积分) )运算,累加到超过累加器容量时,便运算,累加到超过累加器容量时,便产生溢出脉冲,并控制响应坐标移动相当于一个脉冲当量的位移量。由于产生溢出脉冲,并控制响应坐标移动相当于一个脉冲当量的位移量。由于n n位位累加器的控制极限为累加器的控制极限为2n2n,所以累加器中溢出脉冲的快慢与被积函数大小成正,所以累加器中溢出脉冲的快慢与被积函数大小成正比,而与累加器的位数成反比。当累加器的位数较多而移动路径较短时,就比,而与累加器的位数成反比。当累加器的位数较多而移动路径较短时,就会出现累加很多次才溢出一个脉冲,从而减慢移动速度,影响控制效果。针会出现累加很多次才溢出一个脉冲,从而减慢移动速度,影响控制效果。针对这一问题,对这一问题,DDADDA插补时,一般都先通过左移规格化法处理,将插补时,一般都先通过左移规格化法处理,将n n维直线插补维直线插补下的下的n n个被积函数寄存器同时左移个被积函数寄存器同时左移m m位位( (即放大即放大2m2m倍倍) ),以使其中一个被积函数,以使其中一个被积函数的最高有效位为的最高有效位为1 1,或将圆弧插补下坐标值最大的被积函数寄存器左移至次高,或将圆弧插补下坐标值最大的被积函数寄存器左移至次高位为位为l l 。这样,不仅提高了溢出脉冲速度,而且使溢出脉冲变得比较均匀。这样,不仅提高了溢出脉冲速度,而且使溢出脉冲变得比较均匀。 9.3.3.1 主要应用程序模块的设计 以上是普通以上是普通DDADDA插补算法的原理。快速插补算法的原理。快速DDADDA插补算法的原理与此基本相插补算法的原理与此基本相同,主要区别在于累加控制极限的不同。普通同,主要区别在于累加控制极限的不同。普通DDADDA插补算法以累加器的容量作插补算法以累加器的容量作为累加控制极限,而快速为累加控制极限,而快速DDADDA插补算法改进为以插补直线或圆弧的最大尺寸作插补算法改进为以插补直线或圆弧的最大尺寸作为累加控制极限,从而使插补运算更加简单合理,插补输出脉冲分布更加均匀,为累加控制极限,从而使插补运算更加简单合理,插补输出脉冲分布更加均匀,插补速度和精度进一步提高。插补速度和精度进一步提高。 图图9.359.35给出了快速给出了快速DDADDA直线插补算法的实现程序流程图。图中,设插补直线插补算法的实现程序流程图。图中,设插补直线直线OEOE的起点在坐标原点的起点在坐标原点O O,终点为,终点为E( E( XeXe ,Ye) ,Ye)且且 XeXe Ye Ye,XeXe、YeYe分别存放在分别存放在各自的被积函数寄存器各自的被积函数寄存器JxJx、JyJy中,中,RxRx、RyRy为各坐标方向的积分累加器,插补运为各坐标方向的积分累加器,插补运算总循环次数为算总循环次数为JN,JN,累加控制极限为累加控制极限为K K。插补开始前取。插补开始前取K = K = max(Xe,Yemax(Xe,Ye), JN), JNK, K, Rx=Rx=XeXe, , RyRy=Ye=Ye。这样,控制器每发一个插补迭代脉冲,累加器就产生一个溢出。这样,控制器每发一个插补迭代脉冲,累加器就产生一个溢出脉冲。程序设计时,首先判断插补的两点坐标差值绝对值最大的轴,在插补驱脉冲。程序设计时,首先判断插补的两点坐标差值绝对值最大的轴,在插补驱动中,此轴动中,此轴( (称为长轴称为长轴) )连续输出脉冲,其他轴连续输出脉冲,其他轴( (称为短轴称为短轴) )根据直线插补运算的根据直线插补运算的结果,有时输出脉冲,有时不输出脉冲。如图结果,有时输出脉冲,有时不输出脉冲。如图9.369.36所示,给出的是一个以所示,给出的是一个以XeXe=20=20、Ye=9Ye=9为终点的直线插补实例。为终点的直线插补实例。 9.3.3.1 主要应用程序模块的设计图图9.35 9.35 快速快速DDADDA直线插补流程图直线插补流程图 9.3.3.1 主要应用程序模块的设计图图9.36 9.36 以以(x:20,Y:9)(x:20,Y:9)为终点的直线插补实例为终点的直线插补实例 9.3.3.1 主要应用程序模块的设计 图图9.379.37给出了快速给出了快速DDADDA圆弧插补算法的实现程序流程图。图中,设圆弧轨圆弧插补算法的实现程序流程图。图中,设圆弧轨迹的半径为迹的半径为r,r,起点坐标为起点坐标为(x0, y0)(x0, y0),终点坐标为,终点坐标为( (xexe ,ye), ,ye),圆心在坐标原点。圆心在坐标原点。Jx(yJx(y) )、Jy(xJy(x) )为为x x、y y坐标方向的被积函数寄存器;坐标方向的被积函数寄存器;RxRx、RyRy为为x x、y y坐标方向的积坐标方向的积分累加器,累加控制极限为分累加器,累加控制极限为K K。插补开始取。插补开始取K = K = r,Jxr,Jx (y)= (y)=yO,RxyO,Rx=r/ 2=r/ 2;Jy(xJy(x)=x0, )=x0, RyRy = r/ 2 = r/ 2。这样,插补一开始,被积函数值等于圆弧半径的坐标。这样,插补一开始,被积函数值等于圆弧半径的坐标轴就产生溢出脉冲,明显加快了插补速度,简化了插补运算过程。程序设计前轴就产生溢出脉冲,明显加快了插补速度,简化了插补运算过程。程序设计前,考虑由,考虑由x x轴和轴和y y轴定义一个平面,绕中心坐标把它分为轴定义一个平面,绕中心坐标把它分为0-70-7的的8 8个象限。程序设个象限。程序设计时,首先判断插补的两点坐标差值绝对值最小的轴,例如在计时,首先判断插补的两点坐标差值绝对值最小的轴,例如在0 0象限的插补坐象限的插补坐标标( (x,yx,y) )上,上,y y绝对值一直比绝对值一直比x x的绝对值小,设绝对值小的轴为短轴,绝对值长的绝对值小,设绝对值小的轴为短轴,绝对值长的轴为长轴。这样,的轴为长轴。这样,1 1、2 2、5 5、6 6象限是象限是x x为短轴,为短轴,0 0、3 3、4 4、7 7象限是象限是y y为短轴。为短轴。然后在确定长短轴的基础上,短轴在这些象限之间连续输出驱动脉冲,长轴则然后在确定长短轴的基础上,短轴在这些象限之间连续输出驱动脉冲,长轴则根据圆弧插补运算结果,有时输出脉冲,有时不输出脉冲。根据圆弧插补运算结果,有时输出脉冲,有时不输出脉冲。 9.3.3.1 主要应用程序模块的设计图图9.37 9.37 快速快速DDADDA圆弧插补流程图圆弧插补流程图 9.3.3.1 主要应用程序模块的设计 为了保证各关节(运动轴)运动的协调控制,各关节应同时开始和为了保证各关节(运动轴)运动的协调控制,各关节应同时开始和同时结束位置控制信号的发送。从开始到结束的时间间隔定义为一个同时结束位置控制信号的发送。从开始到结束的时间间隔定义为一个DDADDA循循环,循环周期由软件通过设定环,循环周期由软件通过设定LPC2212LPC2212的定时器的定时器1 1获得。由于快速获得。由于快速DDADDA插补所插补所产生的脉冲是经产生的脉冲是经LPC2212LPC2212的的PWMPWM输出通道设置脉冲的宽度和周期后再发送给输出通道设置脉冲的宽度和周期后再发送给各运动轴的,因此程序中设置的各运动轴的,因此程序中设置的DDADDA周期应该为输出脉冲周期的整数倍,这周期应该为输出脉冲周期的整数倍,这样才能保证一个样才能保证一个DDADDA周期中脉冲发送的完整性。周期中脉冲发送的完整性。 显然,显然,DDADDA循环周期越短,则控制软件的实时性越好,但循环时间循环周期越短,则控制软件的实时性越好,但循环时间取得太小,其取得太小,其CPUCPU占用率太高,则其他实时控制模块无法正常运行,故各实占用率太高,则其他实时控制模块无法正常运行,故各实时任务的执行频率应依据其优先级和最坏情况下的运行时间来选取。时任务的执行频率应依据其优先级和最坏情况下的运行时间来选取。 9.3.3.1 主要应用程序模块的设计 DDADDA循环中的每一个输出脉冲代表伺服电机转动若干度,即代表一循环中的每一个输出脉冲代表伺服电机转动若干度,即代表一个位置给定。可以在软件中动态地设定每个个位置给定。可以在软件中动态地设定每个DDADDA循环中的脉冲数来反映在该循环中的脉冲数来反映在该循环中位置改变的总量。对伺服电机驱动器连续地输出脉冲,在客观效果循环中位置改变的总量。对伺服电机驱动器连续地输出脉冲,在客观效果上便表现为位置的平稳改变。每个上便表现为位置的平稳改变。每个DDADDA循环中输出脉冲序列的频率则代表了循环中输出脉冲序列的频率则代表了关节电机的运动速度。关节电机的运动速度。 为了获得满意的位置、速度控制效果,本系统采用了比例闭环控制为了获得满意的位置、速度控制效果,本系统采用了比例闭环控制方式,并内建了速度反馈环和偏移量机制来消除在输入很小时而产生的静方式,并内建了速度反馈环和偏移量机制来消除在输入很小时而产生的静态误差。系统通过态误差。系统通过LPC2212LPC2212的的PWMPWM输出通道产生连续的给定脉冲,在每个输出通道产生连续的给定脉冲,在每个DDADDA周期,此控制脉冲与编码盘产生的反馈脉冲在比较器进行比较,比较结果周期,此控制脉冲与编码盘产生的反馈脉冲在比较器进行比较,比较结果送入比例控制器后,由比例控制器输出控制脉冲,驱动伺服电机,完成闭送入比例控制器后,由比例控制器输出控制脉冲,驱动伺服电机,完成闭环位置和速度控制。环位置和速度控制。 9.3.3.1 主要应用程序模块的设计 【伺服驱动伺服驱动】 控制器产生的伺服驱动脉冲,是通过串口送给直流伺服驱动器的。控制器产生的伺服驱动脉冲,是通过串口送给直流伺服驱动器的。但要注意,嵌入式控制器的串口通信编程与但要注意,嵌入式控制器的串口通信编程与PCPC机上的串口通信编程有很大机上的串口通信编程有很大不同:在不同:在PCPC机上,机上,WindowsWindows将包括串行设备在内的所有外设都用文件的形将包括串行设备在内的所有外设都用文件的形式统一管理,利用串口通信时具有串口发送缓冲和接受缓冲的功能,可任式统一管理,利用串口通信时具有串口发送缓冲和接受缓冲的功能,可任意设定发送缓冲区和接收缓冲区,所以在发送以后,不用立即进行接收等意设定发送缓冲区和接收缓冲区,所以在发送以后,不用立即进行接收等待,因为发送过去的数据肯定会在接收缓冲区内,只要接收缓冲区未满就待,因为发送过去的数据肯定会在接收缓冲区内,只要接收缓冲区未满就可进行下一次发送;而在嵌入式控制器中,串口的发送和接收都是直接访可进行下一次发送;而在嵌入式控制器中,串口的发送和接收都是直接访问端口,没有缓冲的概念,只有把上次发送的数据接收走了,才能发送新问端口,没有缓冲的概念,只有把上次发送的数据接收走了,才能发送新的数据,否则就会冲掉上次的数据。的数据,否则就会冲掉上次的数据。 9.3.3.1 主要应用程序模块的设计 因因此此,在在对对嵌嵌入入式式控控制制器器进进行行串串口口通通信信编编程程时时,一一定定要要采采取取措措施施,确确保保每每次次发发送送新新数数据据之之前前知知道道对对方方已已接接收收上上次次数数据据。措措施施之之一一,是是让让控控制制器器每每当当向向伺伺服服驱驱动动器器发发送送控控制制信信号号后后,驱驱动动器器在在接接收收后后返返回回一一个个接接收收标标志志,而而控控制制器器则则在在发发送送后后立立即即进进入入等等待待对对方方接接收收标标志志的的状状态态中中,而而且且这这种种等等待待时时间间还还必必须须较较长长,因因为为驱驱动动器器何何时时向向控控制制器器返返回回标标志志很很难难说说,如如果果等等待待时时间间过过短短,依依然然可可能能导导致致数数据据丢丢失失。措措施施之之二二,是是为为串串口口通通信信专专门门创创建建一一个个任任务务,这这个个任任务务不不停停地地读读取取串串口口,将将其其从从驱驱动动器器返返回回的的接接收收状状态态信信息息存存放放到到一一个个数数组组(发发送送信信息息前前先先清清空空)中中,而而程程序序在在读读取取串串口口返返回回信信息息时时,只只需需要要读读取取这这个个数数组组即即可可,读读取取的的时时间间只只要要在在下下次次发发送送之之前前就就可可以以。这这样样,就就避避免免了了一一定定要要在在发发送送串串口口数数据据后后立立即即读读取取串串口口返返回回信信息息的的限限制制,增增加加了了程程序序的的灵灵活活性性。而而这这个个用用于于放放置置返返回回信信息息的的数数组组,实实际际上上也也就就是是起起到到缓缓冲冲区的作用。区的作用。 9.3.3.1 主要应用程序模块的设计 本本系系统统采采用用上上述述措措施施一一的的思思想想编编程程。以以下下是是嵌嵌入入式式控控制制器器通通过过串串口口发送和接收数据的发送和接收数据的C C语言程序段。语言程序段。 Uart_Init(0,0,115200);/void Uart_Init(0,0,115200);/void Uart_Init(intUart_Init(int Uartnum,intUartnum,int mclk,intmclk,int baud) / baud) /先对先对 串口初始化串口初始化 /下面使用下面使用Uart_SendByte()Uart_SendByte()和和Uart_Getch()Uart_Getch()两个函数通过串口发送和接收数据两个函数通过串口发送和接收数据 #define rUTRSTAT0 (*(volatile unsigned*)0x1d00010) / #define rUTRSTAT0 (*(volatile unsigned*)0x1d00010) /定义两个与硬件接口直接定义两个与硬件接口直接 /相关的状态相关的状态UTRSTAT0UTRSTAT0和和UTRSTAT1 UTRSTAT1 #define rUTRSTAT1 (*(volatile unsigned*)0x1d04010) #define rUTRSTAT1 (*(volatile unsigned*)0x1d04010) #define WrUTXH0(ch) (*(volatile unsigned char*)0x1d00020)=(unsigned char)(ch) #define WrUTXH0(ch) (*(volatile unsigned char*)0x1d00020)=(unsigned char)(ch) / /定义发送数据端口定义发送数据端口WrUTXH0(ch)WrUTXH0(ch)和和WrUTXH1(ch)WrUTXH1(ch) #define WrUTXH1(ch) (*(volatile unsigned char*)0x1d04020)=(unsigned char)(ch) #define WrUTXH1(ch) (*(volatile unsigned char*)0x1d04020)=(unsigned char)(ch) void void Uart_sendByte(intUart_sendByte(int Uartnum,U8 data) /ok Uartnum,U8 data) /ok ericeric rongrong 9.3.3.1 主要应用程序模块的设计 if(Uartnumif(Uartnum=0) /=0) /判断是否使用串口判断是否使用串口0 0 while(!(rUTRSTAT0&0x2); / while(!(rUTRSTAT0&0x2); /等待状态空闲时等待状态空闲时 Delay(10); /Delay(10); /延时延时 WrUTXH0(data); /WrUTXH0(data); /向端口向端口0 0发送数据发送数据 else / else /判断是否使用串口判断是否使用串口1 1 while(!(rUTRSTAT1&0x2); / while(!(rUTRSTAT1&0x2); /等待状态空闲时等待状态空闲时 Delay(10); /Delay(10); /延时延时 WrUTXH1(data); /WrUTXH1(data); /向端口向端口1 1发送数据发送数据 / /定义两个读端口地址定义两个读端口地址 #define RdURXH0 (*(volatile unsigned char*)0x1d00024) #define RdURXH0 (*(volatile unsigned char*)0x1d00024) #define RdURXH1 (*(volatile unsigned char*)0x1d04024) #define RdURXH1 (*(volatile unsigned char*)0x1d04024) 9.3.3.1 主要应用程序模块的设计 /从两个读端口读取数据从两个读端口读取数据 char char Uart_Getch(charUart_Getch(char* * RevdataRevdata, , intint Uartnum,intUartnum,int timeout) timeout) intint i=0; i=0; if(Uartnumif(Uartnum=0)=0) while(!(rUTRSTAT0&0x1); / while(!(rUTRSTAT0&0x1); /端口端口0 0接收数据已准备好接收数据已准备好 OSTimeDly(1); OSTimeDly(1); if(timeoutif(timeout=0)=0) continue; continue; if(+=timeout) / if(+=timeout) /如果等待时间超时则返回错误如果等待时间超时则返回错误 return FALSE;return FALSE; * *RevdataRevdata=RdURXH0(); /=RdURXH0(); /将读端口将读端口0 0数据赋给变量数据赋给变量 return TRUE;return TRUE; else else 9.3.3.1 主要应用程序模块的设计 while(!(rUTRSTAT1&0x1); /while(!(rUTRSTAT1&0x1); /端口端口1 1接受数据准备好接受数据准备好 OSTimeDly(1); OSTimeDly(1); if(timeoutif(timeout=0)=0) continue; continue; if(+iif(+i=timeout) /=timeout) /如果等待时间超时则返回错如果等待时间超时则返回错误误 return FALSE;return FALSE; * *RevdataRevdata=RdURXH1(); /=RdURXH1(); /将端口将端口1 1数据赋给变量数据赋给变量 return TRUE;return TRUE; 9.3.3.1 主要应用程序模块的设计 4. 4. 与与PCPC机通信模块机通信模块 与与PCPC机通信模块主要负责通过机通信模块主要负责通过USBUSB总线实现与总线实现与PCPC机的通信任务。机的通信任务。 本系统采用嵌入式本系统采用嵌入式USBUSB主机的模式间接地与主机的模式间接地与PCPC机实现通信功能。控机实现通信功能。控制器利用制器利用USBUSB接口,通过接口,通过U U盘读取盘读取PCPC机处理好的数据文件,由于机处理好的数据文件,由于USBUSB数据传数据传输速度很快,所以必须将该数据存储在控制器缓冲区中,以供插补任务读输速度很快,所以必须将该数据存储在控制器缓冲区中,以供插补任务读取使用。取使用。 数据存取处理程序就是为实现上述数据缓存而设计的,它包含数数据存取处理程序就是为实现上述数据缓存而设计的,它包含数据存储和数据读取两个子程序。数据存储子程序是将据存储和数据读取两个子程序。数据存储子程序是将LPC2212LPC2212从从PCPC机接收机接收的数据送入专门的数据缓存区;数据读取子程序则是在插补程序执行之前,的数据送入专门的数据缓存区;数据读取子程序则是在插补程序执行之前,从缓存区读取数据以供插补运算用。缓存区采用的是先进先出从缓存区读取数据以供插补运算用。缓存区采用的是先进先出(FIFO)(FIFO)的数的数据队列存取方式,用于平衡速率不同的两个部件,使快速部件无需等待慢据队列存取方式,用于平衡速率不同的两个部件,使快速部件无需等待慢速部件。速部件。 9.3.3.1 主要应用程序模块的设计数据队列使用了一个结构体存储队列信息,其数据结构如下:数据队列使用了一个结构体存储队列信息,其数据结构如下:typedeftypedef def def QUEUE_DATA_TYPE *Out QUEUE_DATA_TYPE *Out; /指向数据输出位置指向数据输出位置 QUEUE_DATA_TYPE *InQUEUE_DATA_TYPE *In; /指向数据输入位置指向数据输入位置 QUEUE_DATA_TYPE *EndQUEUE_DATA_TYPE *End; /指向指向BufBuf的结束位置的结束位置 INT32U INT32U NdataNdata; /队列中数据个数队列中数据个数 INT32U INT32U MaxDataMaxData; /队列中允许存储的最多数据个数队列中允许存储的最多数据个数 INT8U (*INT8U (*ReadEmptyReadEmpty)()(); /读空时用户处理函数读空时用户处理函数 INT8U (*INT8U (*WriteFullWriteFull)()(); /写满时用户处理函数写满时用户处理函数 QUEUE_DATA_TYPE BuQUEUE_DATA_TYPE Bu用;用; /存储数据的空间存储数据的空间 DataQueueDataQueue; 9.3.3.1 主要应用程序模块的设计 按按照照该该数数据据结结构构建建立立数数据据队队列列后后,应应以以FIFOFIFO方方式式存存储储数数据据和和接接收收数数据据。数数据据存存储储以以LPC2212LPC2212和和U U盘盘的的成成功功通通信信为为基基础础,首首先先是是获获得得数数据据,再再将将数数据据存存入入数数据据队队列列中中,数数据据存存储储子子程程序序流流程程图图如如图图9.389.38所所示示。由由于于在在PCPC机机中中处处理理的的数数据据可可能能比比较较大大,一一次次性性难难以以将将数数据据全全部部存存入入队队列列中中,因因此此在在数数据据存存储储区区满满时时,就就等等待待若若干干个个时时钟钟节节拍拍,直直至至整整个个数数据据全全部部存存储储结结束束。数数据据读读取取是是数数据据插插补补的的准准备备阶阶段段,其其流流程程图图如如图图9.399.39所所示示。当当有有数数据据存存入入数数据据缓缓冲冲区区时时,USBUSB通通信信任任务务则则发发送送一一信信号号量量,标标志志数数据据存存储储成成功功事事件件的的发发生生;插插补补任任务务通通过过获获取取该该信信号号量量,取取得得数数据据缓缓冲冲区区资资源源的的使使用用权权,调调用用数数据据读读取取子子程程序序,并并进进入入就就绪绪状状态态,如如果果是是当当前前最最高高优优先先级级的任务,则插补任务立刻开始运行。的任务,则插补任务立刻开始运行。 9.3.3.1 主要应用程序模块的设计图图9.38 9.38 数据存储流程图数据存储流程图 图图9.39 9.39 数据读取流程图数据读取流程图 9.3.3.1 主要应用程序模块的设计 上述有关函数及功能说明如下上述有关函数及功能说明如下: : INT8U INT8U QueueCreate(voidQueueCreate(void * *BufBuf, INT32U , INT32U SizeOfBufSizeOfBuf, , INT8U(*INT8U(*ReadEmptyReadEmpty)(), )(), INT8U(* INT8U(*WriteFullWriteFull():():建立数据队列,第一个参数为指向数据建立数据队列,第一个参数为指向数据队列的指针;第二个参数为分配给数据队列的内存大小,以字节为单位,队列的指针;第二个参数为分配给数据队列的内存大小,以字节为单位,本系统中分配了本系统中分配了256K256K字节;第三个参数为读取数据时如果队列为空时的字节;第三个参数为读取数据时如果队列为空时的处理函数;第四个参数为存储数据时如果队列为满时的处理函数。处理函数;第四个参数为存储数据时如果队列为满时的处理函数。 INT8U INT8U QueueWrite(QUEUE_DATA_TYPEQueueWrite(QUEUE_DATA_TYPE Data, void * Data, void *BufBuf):):写写数据入队列函数,以数据入队列函数,以FIFOFIFO方式存储数据。方式存储数据。 9.3.3.1 主要应用程序模块的设计 INT8U INT8U QueueRead(QUEUE_DATA_YPEQueueRead(QUEUE_DATA_YPE *Ret, void * *Ret, void *BufBuf):):读队读队列数据函数,读取队列的队首数据。列数据函数,读取队列的队首数据。 INT8U INT8U WriteFull(voidWriteFull(void * *BufBuf, QUEUE_DATA_TYPE Data):, QUEUE_DATA_TYPE Data):写满写满处理函数,函数首先判断数据队列是否有空间存储新数据,如果没有,处理函数,函数首先判断数据队列是否有空间存储新数据,如果没有,就等待一段时间,直到插补任务调用数据读取函数读至队列半空时,返就等待一段时间,直到插补任务调用数据读取函数读至队列半空时,返回数据入队列函数回数据入队列函数QueueWriteQueueWrite()()。 INT8U INT8U ReadEmpty(voidReadEmpty(void * *BufBuf, QUEUE_DATA_TYPE Data):, QUEUE_DATA_TYPE Data):读空读空处理函数,函数首先判断数据队列是否有数据读取,如果没有,就等待处理函数,函数首先判断数据队列是否有数据读取,如果没有,就等待一段时间,直到有新的数据时,返回读数据函数一段时间,直到有新的数据时,返回读数据函数QueueReadQueueRead()()。 9.3.3.2 应用程序主任务模块的设计 对于上述各应用程序模块,需要通过一个主程序模块将它们连对于上述各应用程序模块,需要通过一个主程序模块将它们连接起来。通常将这样的主程序称为主任务,而将各应用程序称为子任务。接起来。通常将这样的主程序称为主任务,而将各应用程序称为子任务。 主任务模块的程序如下:主任务模块的程序如下: intint nNodenNode; ; void void Main_Task(voidMain_Task(void *Id) / *Id) /主任务主任务 POSMSG POSMSG pMsgpMsg; ; structRECTstructRECT rectrect; ; char char axispicfilenameaxispicfilename=A,X,I,S, , , =A,X,I,S, , , , ,B,M,P,0; , ,B,M,P,0; intint NodeNumberNodeNumber=0;=0; intint ReSendCommReSendComm; ; 9.3.3.2 应用程序主任务模块的设计 ClearScreenClearScreen();(); ReDrawOSCtrlReDrawOSCtrl(); /(); /绘制所有的操作系统的控件绘制所有的操作系统的控件 DM_Init(1,19200,&NodeNumber); /DM_Init(1,19200,&NodeNumber); /调用网络直流驱动器模块的初始化函数调用网络直流驱动器模块的初始化函数 /该函数将由该函数将由NodeNumberNodeNumber返回在网络中找到的模块返回在网络中找到的模块数数 while(NodeNumberwhile(NodeNumber!=2)&(+ReSendComm)7) DM_Init(1,19200,!=2)&(+ReSendComm)-TextCtrlRect.topTextCtrlRect.top; ; rect.bottomrect.bottom= =pStatusTextCtrlpStatusTextCtrl-TextCtrlRect.bottomTextCtrlRect.bottom; ; rect.rightrect.right= =pStatusTextCtrlpStatusTextCtrl-TextCtrlRect.rightTextCtrlRect.right; ; rect.leftrect.left=rect.right-19;=rect.right-19; pStatusTextCtrlpStatusTextCtrl-TextCtrlRect.rightTextCtrlRect.right-=20;-=20; RoboInitRoboInit(); /(); /对电机的伺服状态进行初始化,为发送伺服命令做准备对电机的伺服状态进行初始化,为发送伺服命令做准备 CreatePictureCtrl(ID_MotorPicStatus,&rectCreatePictureCtrl(ID_MotorPicStatus,&rect, , axispicfilename,CTRL_STYLE_3DUPFRAME); axispicfilename,CTRL_STYLE_3DUPFRAME); RedrawOSCtrlRedrawOSCtrl(); /(); /绘制所有的操作系统的控件绘制所有的操作系统的控件 /* /*以下进入消息循环,检测键盘消息以下进入消息循环,检测键盘消息( (如上、下、左、右方向键,如上、下、左、右方向键,“确定确定”键或键或“开始开始”键等),并向操作系统发送消息键等),并向操作系统发送消息* */ / 9.3.3.2 应用程序主任务模块的设计 for(;) for(;) pMsgpMsg=WaitMessage(0);=WaitMessage(0); switch(pMsgswitch(pMsg-Message)-Message) case OSM_KEY case OSM_KEY;/如果按下键时如果按下键时onKey(pMsgonKey(pMsg-WParam,pMsgWParam,pMsg-LParamLParam););break;break; case OSM_LISTCTRL_SELCHANGE case OSM_LISTCTRL_SELCHANGE;/如果在功能菜单上移动按钮时如果在功能菜单上移动按钮时onListselChange(pMsgonListselChange(pMsg-WParam,pMsgWParam,pMsg-LParamLParam););break;break; DeleteMessage(pMsgDeleteMessage(pMsg); ); 9.3.3.2 应用程序主任务模块的设计 主任务在进行完必要的初始化工作后,便进入了消息循环主任务在进行完必要的初始化工作后,便进入了消息循环中,等待用户的操作。例如,若用户按下了某个键,便会触发相应的消中,等待用户的操作。例如,若用户按下了某个键,便会触发相应的消息。机器人控制程序便位于这些消息响应函数的末端。息。机器人控制程序便位于这些消息响应函数的末端。第第9 9章结束!章结束! 第9章 单片机应用系统设计实例
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号