周首杰,李 湾,明 瑞,周 贤,明兴祖,
(1.湖南汽车工程职业学院,湖南 株洲 412000;2.湖南工业大学机械工程学院,湖南 株洲412007;3.湖北文理学院机械工程学院,湖北 襄阳 441053)
嵌入式控制应用已深入到了每一种智能控制中,特别是随着芯片性能的提高,嵌入式产品也越来越智能化,人性化[1]。嵌入式控制通常有顺序结构、多任务等控制方式[2]。顺序结构控制适用于简单、没有多任务同时执行控制的情况[3]。多任务控制能同时处理多个任务,高档的嵌入式多任务系统有操作系统来做支撑,如手机就有安卓、苹果等操作系统支撑,由操作系统来进行多任务管理。在工业控制中,赵俊囡等[4]研究和设计了一种基于XC2785 单片机和嵌入式实时操作系统的汽车运行参数记录仪方案。采用嵌入式实时多任务操作系统可以提高系统效率、实时性及可靠性,但由于商业嵌入式实时多任务操作系统版权费高,特别是单片机嵌入式系统资源有限,对开发人员技术能力的要求较高,限制了嵌入式操作系统的应用[3,5]。
在工业产品控制中,还有一部分嵌入式系统是没有操作系统来支撑的,其开发应用针对性和灵活性强。刘燚荣[2]、赵飞等[3]利用通用型嵌入式系统软件框架,构建一个实时多任务控制机制,提供一套软件定时器,实现了电力设备智能传感器软件快速开发。但这样的多任务实时处理要由软件设计工程师来完成多任务的管理,因此产生了相当大的难度[6]。本文在分析嵌入式控制中顺序结构控制流程与特性的基础上,根据小车多任务智能控制处理要求,提出了单片机多任务控制的方法与设计应用。
在嵌入式控制中,最简单的就是顺序结构,即一个任务接一个任务地完成,在完成了一个任务后再继续完成另外一个任务。如图1所示为智能小车行进路线图,一辆智能小车,沿着粗实线往前走,要求在十字路口需自动往右拐弯。
图1 智能小车行进路线
在图1中,起始时刻给小车发出一个向前行驶的命令,由底层驱动机构执行小车前行,同时小车需不停检测是否到了十字路口,小车主控CPU执行检测任务。当检测到了十字路口,小车主控CPU再向底层驱动机构发出停止命令,以完成该第1个任务。接着再准备第2个任务,向底层驱动机构发出右转90°命令。第2个任务完成后,再进行第3个任务,即检测右转90°是否到位,如检测右转到位,第3个任务完成,接着是下一个任务,如此运行下去,直到整个任务执行完毕。小车前进右转的顺序结构程序流程如图2所示。
图2 小车前进右转的顺序结构程序流程
在顺序结构程序控制的运行过程中,主控CPU发出前进命令,小车前进,同时主控CPU不停地等待检测是否到达了十字路口。同理主控CPU发出右转指令后,主控CPU也是在等待中检测右转到位信息。但由于是顺序结构,上一个任务没完成时,下一个任务是不能开启的;只有在上一个任务完成后,下一个任务才会开始。
顺序结构控制是按工作流程一个接一个往下顺序执行。在图1嵌入式控制中,由于小车按照相应的路线依次完成每一个任务,中间不会穿插别的任务,不能加入人为控制命令,也不需要由主控CPU来控制显示其他信息等,采用顺序结构可以很好地完成控制,小车能自动完成所有任务,因此顺序结构适用于简单、没有多任务同时执行控制的情况[7]。
CPU的PC指针控制。程序的执行是由CPU中的PC指针来控制的,PC指针决定着程序的执行过程。CPU当前要执行某条命令是由PC指针来指向该命令语句的所在地址。在1片CPU中只有1个PC指针,在一时刻点CPU只能运行1条语句[8]。任务由多条语句组成,所以任务也只能是一个一个地完成,不可能同时运行2个及以上任务。当执行中断时,也是CPU停止运行现在的任务,转而由PC指针转向中断服务程序地址,执行PC指针所指的中断服务任务[9]。因此一个时刻是只能运行一条语句,一段时间内只能完成一个任务。
随着单片机运行速度的提升,单片机在嵌入式多任务智能控制中应用广泛。例如单片机运行一条语句的速度可以用ns计,那么由几十条甚至上千条语句所组成的一个完整的任务,单片机也只要几个μs就可以完成[10]。如果没有延时等待等过程,那么单片机运行完由多个任务所组成的系统也只要几十ms,甚至更短的时间。ms级别的时间长度,实际应用中无法感知出来。实质上单片机执行任务还是有先后顺序的,可以非常快地处理多个任务,能够在极短时间检测到输入信息,并根据输入信息来完成相关任务,这也体现了单片机的实时处理功能。嵌入式多任务单片机控制就是按该思路进行设计和应用。
在多任务执行过程中,单片机的运行速度关键。如果单片机的速度太慢,是无法做到多任务同时完成,实时处理的。现在的单片机运行速度都比较快,所以这一点在一般情况下不存在了。如果有单个的任务确实数据量很大,也可以选用更高级、速度更快的单片机;或者可以采用专用的大数据处理芯片来完成数据处理。设计人员在编程时要特别注意程序的运行速度,优化程序编写。在完成一个任务时,如果编程者使用了大量的延时等待程序,让CPU延时等待当前任务的完成,那么完成一个任务就需要较长时间,就不能感觉是同时处理多个任务;或者感觉到运行速度太慢,经常出现任务执行被卡住等现象,也可能造成有些任务根本无法完成[11]。因此,要合理设计延时等待程序的编写。
单片机运行速度越快,任务完成的实时性也越好。每个任务的执行时间短,所有任务执行的时间也越短,人们感觉就是所有任务都是在同一时间段内同时完成。
每个任务的执行是要占用一定时间的。如果在每一轮程序运行循环中,每个任务都去执行一次,那是没有必要的[12]。例如按键检测任务,数码管显示任务等。按键可以快速按下去,再松开,整个过程可快到100 ms之内完成,但与CPU的运行速度相比是极慢的。所以按键检测是可以用定时方式去检测,例如在50 ms检测1次就足够了。数码管显示也是如此,由于人的视觉暂留,对每一张图片是有100 ms时间保留在脑海中,也称人类的视觉暂留功能,因此对数码管可100 ms刷新1次;为防画面闪烁,也可以是50 ms刷新1次。对如图1中的小车行进是否到达十字交叉口的检测,可以采用定时检测的方式进行。由于小车的行驶速度较慢,可以是几十ms检测1次。
另外对于一些紧急的、重要的任务,还可采用优先等级的方式进行处理,比如按中断服务程序中的优先等级制处理。
对于图1的智能小车行进控制,小车在前进过程中,要求进行行进速度的显示。采用2个数码管来显示小车的行进速度,设计的数码管显示小车速度电路原理如图3所示。
图3 数码管显示小车速度电路原理
从图3中可以看出,2个数码管是不可能同时显示的,一次只能有一个数码管点亮,须以很快的速度来对每个数码管进行刷新,即2个数码管显示对应的2个任务要快速执行。同时,主控CPU还要不停地检测小车是否到达十字路口,这又是另一个任务。主控CPU还有可能要接收通过WIFI组件发送过来的信息;同时也还要检测按键等,所以此控制就有多个任务要求同时运行。
采用定时中断来进行定时,可将定时器1设置成1 ms中断1次,这样就定了一个时间标准。如果要定时50 ms,那么就设置一个计数变量,在定时器中断服务程序中进行计数,当计数50次后就是定时达到50 ms,设计的定时器中断服务程序流程如图4所示。
图4 定时器中断服务程序流程
在主程序中执行各任务,由于有了定时器定时,所以各任务就可在规定时间下分时执行。设计的多任务控制主程序流程如图5所示。
图5 多任务控制主程序流程
从图5可以看到:每个任务的执行在主程序中不是每一次循环都执行,而是要等到相应的时间到了,轮到实施该任务时才执行;任务的执行按其性质不同,可根据经验或者现场情况进行时间分配,有些任务可以执行次数少,而有些任务必须执行次数多,例如检测是否到十字路口的程序,是每10 ms就运行1次,而显示程序为了视觉舒服,需加快数码管刷新速度,每30 ms刷新1个数码管,而按键检测程序在每50 ms检测1次,使其程序少运行,以加快单片机的运行速度;对于特别重要的任务,或者是运行时间特别短的任务,也可以直接采取优先等级中断服务程序的处理方式进行执行。
根据图1的智能小车行进路线以及标志物,要求竞赛小车在接到启动命令后,须完全在自动模式下完成所有进程,设计的嵌入式单片机智能控制系统由STM32F103主控芯片和驱动芯片以及电机组成驱动系统,由安装于小车前边的传感器和另一片STM32F103芯片组成路面检测系统向主STM32F103发送信息。通过试验得到该系统主要性能参数为:主频设置为72 MHz,一条单周期指令运行时间为1/72 μs;完成一个到达十字交叉口的检测任务信息,根据波特率设置成11 520,通信设置成9位二进制每帧,致使检测一条信息不到0.1 ms,发送一个转弯命令也不到0.1 ms;显示任务时间更短,完成1个数码管显示只需要1 μs以内。该系统测试中,按键发出启动命令,完成小车行进、在点检测、转弯命令等进程,并完成双数码管分段分时显示行进速度任务。
在嵌入式的单片机智能控制中,通常有顺序结构控制和多任务控制等方式,均需由单片机PC指针来控制程序每一个语句命令的执行,以及每一个任务的完成。顺序结构控制下,通过分析其程序流程、控制特性,得出适用于控制简单、没有多任务同时执行控制的情况。根据多任务控制的需要,为实现感觉和视觉、实时性等应用问题,通过单片机运行速度对多任务控制的影响分析、多任务管理等研究,结合智能控制设计应用,采用运行速度高的单片机主程序进行合理的任务与等级安排、时间控制和优化编制延时等待程序,运用适合的定时检测方式,以及优先等级制中断服务程序处理,解决了智能小车嵌入式智能控制应用中多任务同时运行、实时执行的技术问题。