1、第17章油门控制系统引子你开过车吗?听过这些关键词吗?离合器油门踏板刹车油门控制系统压力变化数据采集计算踩踏量步进电机修正指示灯修正信号生成17.1 项目目标本次项目要求用应变桥传感器、步进电机、编码器和指示灯设计实现汽车油门控制系统的模拟。要求实现:当油门踏板被踩下或松开后,汽车转速有变化,并有相应指示。本次项目要求实现模拟油门控制系统,实现如下要求:(1)应变梁所受压力的变化来表征当前油门踏板的踩踏量。压力越大,表示踩踏量越大,发动机进气量越大,则汽车速度越快。(2)根据应变桥输出电压的大小控制步进电机的转速高低。用光电编码器来测速。(3)使用多个发光二极管垂直(横向)排列,作为当前油门踏
2、板踩踏量的变化的指示或者说表征当前车轮转速高低(或者说发动机进气量的多少)。通过本项目的设计、实施,要求学生:(1)掌握使用NI-DAQmx实现多任务(模拟信号采集、数字信号输出、角度测量)数据采集程序设计;(2)了解双循环如何实现数据传递;(3)了解主从结构、掌握生产者/消费者结构的使用。17.2 项目分析 由项目目标知本项目涉及的相关传感器有:应变桥传感器、步进电机、编码器和发光二极管。用应变桥传感器输出变化来模拟油门踏板的踩踏量;步进电机运转来模拟车速,编码器来检测速度快慢;用六个发光二极管来提示进气量的大小(或速度快慢);其中步进电机的转动与应变桥所受压力的关系为:(1)当压力增大时,
3、步进电机转速逐渐增大,期间,编码器读取已发脉冲数值,判定转速是否达到设定的最大值。发光二极管随着进气量的增大,其点亮的个数逐渐增多,到全亮;当超过规定的进气量(车速),则六个发光二极管进行闪烁作为报警。(2)当压力变小时,步进电机转速逐渐减小直到0。发光二极管随着进气量的减小,其点亮的个数逐渐减少,到全灭。(3)当压力为0且无任何操作时,发光二极管不亮。本项目相关的硬件设计已在前面的章节中说明,从以上的项目分析中知:在软件设计中同时需涉及模拟量的输入(应变传感器信号检测)数字量的输出(步进电机控制、发光二极管的亮灭)计数器输入(编码器检测步进电机转过的角度)在完成整个程序设计前可以首先完成对各
4、部分的软硬件调试,继而对其进行整合。整个程序架构可考虑用状态机、生产者消费者结构等。17.3 项目实现17.3.1 17.3.1 生产者消费者结构生产者消费者结构 17.3.2 17.3.2 前面板前面板设计设计17.3.3 17.3.3 程序框图设计程序框图设计1双循环结构2生产者消费者设计模式17.3 项目实现 在前几章项目实现中多采用了状态机架构或带事件结构的状态机架构,无论哪一个在任何时刻只能有一个状态在运行。大多数比较复杂的应用至少应该有“菜单”和“采集”两个状态,如果数据采集程序在运如果数据采集程序在运行时仍然希望系统能够处理菜单的事件,这是在传统的状态机或者事件行时仍然希望系统能
5、够处理菜单的事件,这是在传统的状态机或者事件结构中无法实现的结构中无法实现的。因为无论是状态机结构还是事件结构,都是由一个循环组成的,不同的状态是无法同时被响应和处理的。因LabVIEW本身就是一种多线程的程序设计语言,要解决这个问题是比较简单,如可以再加一个循环或者另外开一个程序独立运行。但是这样也会带来一些新的问题,比如:(1)两个循环(程序)之间如何交换和共享数据。(2)两个循环(程序)都有着独立的错误处理系统,它们之间是如何协调的。(3)两个循环如何分工呢?应该以哪种方式对状态进行分类以将不同的状态放置在不同的循环(程序)中?(4)一个程序如何控制另一个程序的运行和停止。本项目首先使用
6、“多循环”来解决程序并行运行的问题,两个循环采用全局变量或局域变量进行数据交互和共享。但当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。多循环之间可能使用LabVIEW提供的队列操作函数,在数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步所带来的影响,即生产者消费者结构。17.3.1 生产者消费者结构 NI LabVIEW 中提供了六种最基本的设计模式:标准状态机、队列消息处理器、生产者/消费者设计模式(事件)、生产者/消费者设计模式(数据)、用户界面事件处理器、主/从设计模式。其中状态机和生产者/消费者设计模式应用最为广泛,而主/从设计模式与生产者/消费者设计模式结
7、构上极为相似,两者的区别就是通知器和队列之间的区别;本小节主要介绍生产者/消费者设计模式。生产者消费者模型如同生活中的供水系统,在数据产生/采集端(供水局)产生数据后,并不直接向终端用户供水,因为前者产生水的速率与后者消耗水的速率并不相同。此时需要建造蓄水池将供水局产生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。当终端用户需要用水时,直接从蓄水池中获取就可以了,同理在进行数据显示和分析时直接从数据缓冲区中获取就可以了。LabVIEW中的队列函数提供了一种很好的方式规避了这个问题,由于队列中的元素是“先进先出”的,因此确保了接收到的数据是有序的。在LabVIEW的队列操作中(元素入队列
8、和 元素出队列函数),提供了timeout选项以处理数据缓冲区的溢出或不足。当数据溢出时,元素入队列函数(数据进入队列)将停止发送数据(处于等待状态),直到缓冲区存在数据空间或者达到了timeout设置的时间;而当数据不足时,元素出队列函数(数据流出队列)将停止接收数据(处于等到状态),直到缓冲区进入了新的数据或者达到了timeout设置的时间。值得注意的值得注意的是,使用队列最后一定要用 释放队列引用 函数将内存释放,否则程序会因内存泄露而报警。基于事件的生产者/消费者模式与基于数据的生产者/消费者模式没有本质上的区别,只是数据的来只是数据的来源不同源不同。基于事件的生产者/消费者模式是用户
9、在前面板上进行操作,从而触发了生产者中的事件结构。获取队列引用 函数将数据传递给 元素入队列 函数,通过队列的执行顺序关系,元素出队列 函数将数据传递给消费者,执行相应的程序。17.3.2 前面板设计 油门控制系统前面板如图17-5所示。使用波形图表查看测得的应变量。使用仪表控制查看速度,用6个布尔控制指示速度等级,当超速时6个布尔控制一起闪烁进行报警。17.3.3 程序框图设计1双循环结构 当用手指按压应变桥悬臂梁,压力越大(进气量大),电机转速(车速)越快,亮灯盏数越多;当减小压力(进气量)时,电机转速(车速)减缓,指示灯盏数减少。2生产者消费者设计模式 双循环中可以利用全局变量或局部变量
10、传递数据,但是当两个循环执行的速率不相等时,会造成数据的丢失或重复。因此可以考虑用生产者消费者模式,尽管本系统是相对较为简单的数据处理,使用生产着消费者模式,有一点点大材小用,但对于该程序设计模式进一步深入了解掌握是有好处的。生产者负责采集应变梁的应变信号,使用队列函数传递踩踏量,传递至消费者循环,在消费者循环中,根据踩踏量,做相应处理。思考题17-1 同步VI和函数除了队列还有哪些?17-2 LabVIEW有6种基本的编程模式,分别是哪几种,各有何优缺点?17-3 请用基于事件的生产者/消费者结构和基于数据的生产者/消费者结构编写本项目程序,并调试。17-4 双循环结构如何实现循环间的数据传递,可能存在哪些问题?17-5 请将图17-7所示的双循环架构改为用生产者/消费者设计模式来实现。