基于μC/OS—II的两轮平衡车
2019-03-08黄忠
黄忠
实时操作系统是嵌入式的热门话题,其早期历史可追溯至1992年美国嵌入式系统专家Jean J.Labrosse在《嵌入式系统编程》中的一篇连载文章。
随着嵌入式的发展,实时操作系统的发展日新月异。而μC/OS-II仍然是其中的佼佼者。究其原因无非是因为它专门为计算机的嵌入式应用设计,更加符合应用需求。同时μC/OS-II执行效率高、占用空间小(最小内核可编译至 2KB)、实时性能优良和可扩展性强等特点。抢先于其他实时操作系统μC/OS-II 已经移植到了几乎所有知名的CPU 上,提前抢占了用户市场。
两轮电动平衡车,又被称为体感车、思维车等。其运作原理主要是建立在一种被称为“动态稳定”(Dynamic Stabilization)的基本原理上。是现代人用来作为代步工具、休闲娱乐的一种新型的绿色环保的产物。它与电动自行车和摩托车车轮前后排列方式不同,而是采用两轮并排固定的方式,这是一种独特的平衡设计方案。同时蓄电池供电,对环境完全无污染,绝对绿色环保,并可以反复充电使用。而且电动机的运行效率高,噪声低效率高,因此既降低了噪声污染,也节约了能源。无刷电机驱动,加上单片机控制,姿态传感器采集角速度和角度信号,共同协调控制车体的平衡,仅仅依靠人体重心的改变便可以 实现车辆的启动、加速、减速、停止等动作。综上,因为体积小,携带方便,造价低,适合在小空间范围内使用,无刹车系统,控制极其方便等特点,两轮电动平衡车一经发布便受到了社会上的极大关注。
主要的技术难度在于车辆本身的自动平衡能力。以内置的精密固态陀螺仪(Solid-StateGyroscopes)来判断车身所处的姿势状态,透过精密且高速的中央微处理器计算出适当的指令后,驱动马达来做到平衡的效果。
由于平衡车采用的传感器及控制算法是大学生竞赛中常用的模块,所以两轮平衡车成为了大学生学习单片机的入门以及PID控制算法的不二选择。网上也有许多相关的开源资料。
不过就目前而言暂时未曾发现有将μC/OS-II和两轮平衡车结合在一起的开源资料如今μC/OS-II作为开源的实时操作系统主要是用于飞控上,主要原因是四轴飞行器对系统的实时性有一定的要求。而两轮平衡车在大学里主要是作为PID及单片机运用的入门学习套件,很少有人在小车平衡之后进行复杂的开发。而μC/OS-II作为嵌入式的主流开源系统用在单一的平衡车上又显得大材小用。这大概是没有相关资料的主要原因了。不过,相对来说如果把μC/OS-II加到两轮平衡车的控制程序中可以大幅度的增加代码的可靠性。
平衡车的主要控制思路涉及到三个PID环,分别是角度环、速度环、转向环。角度环一般又叫做直立环,但理解为角度环更容易和反馈量结合起来。角度环通过陀螺仪得到车架的姿态角度,通过当前角度与目标角度比对的差值进行一定的计算控制轮子,以保证车架维持在目标角度附近。总结一句话来说就是直立环保证车架站起来并且稳住;速度环是直立环的辅助调节,直立环能够保证车架直立,但是不能保证车直立的速度为零,速度环就可以保证车架保持直立的同时控制此时的速度;转向环,控制車架的方向。平衡车顾名思义平衡是最重要的,即角度环是核心,其它两个是辅助。具体的PID调试网上有很多前人的经验,在这里就不赘述了。
μC/OS-II是最常用的“嵌入式实时操作系统”,不少人说无非就是一个最高优先级始终运行,并非真正的实时操作系统。事实上一般来说,“实时”一方面指的是系统(如中断,任务等)响应时间短,另一方面指的是系统响应时间确定(常数)。 uCOS在这两方面的指标均不错。说是“嵌入式实时操作系统”绝对名不虚传。实时系统的概念首先是前后台系统。后台行为:无限循环的应用程序,也可以叫做任务级,在平衡车系统中可以概括为直立。前台行为:中断服务程序处理异步事件,也可以叫做中断级,是面对异常是的处理,对直立异常的处理可以放到前台行为中。与一般的任务调度不同的是μC/OS-II有临界区,临界区指处理时不可分割的代码(为了确保临界段代码的执行不被中断,在进入临界段之前必须关中断,而临界段代码执行完后,须马上打开中断)这个是必须注意的,不然程序会很轻易的跑飞。而系统最重要的便是任务的调度,一个任务,即一个线程,是一个简单的程序,该程序可以认为CPU完全只属于该程序自己,每个任务都被赋予一定的优先级,有自己的一套CPU寄存器和栈空间。每个任务都是无线循环的,都可能处于以下5种状态之一休眠态,就绪态,运行态,挂起态,被中断态。在控制系统中不可避免的是任务的优先级。任务越重要,赋予的优先级应越高。就大多数内核而言,每个任务的优先级是由用户决定的。
将不同的任务赋予不同的优先级,μC/OS-II拥有256个任务优先级最低优先级两个任务用作系统任务,其他的都是可以自由运用的。不过一般来说,不会把这些任务数设定的太大,每一个人物在系统初始化的时候,都需求分配一块内存作为任务的控制块。把最大任务书设定的太大,要占用许多的ram空间。设定ucos任务数的原则应该是够用就好。
优先级越高,越容易抢占。我们可以将直立环的优先级放到较高的位置,速度环和转向环放到较为靠近的优先级。而类似LCD显示之类的任务则放到优先级较低的位置,这样平衡车的控制系统就能稳定运行了。