零基础制作两轮自平衡小车


layout: wiki

title: 软件框架讲解-裸机版本

作者:Songyimiao

MWbalancedSTC15是最早使用STC15系列单片机作为控制芯片的两轮自平衡小车项目。MWbalancedSTC控制源代码,都是属于一砖一瓦敲出来的。没有移植嵌入式实时操作系统(RTOS)的源代码,我们称之为裸机代码,托管在Github,命名方式为为"MWbalanced-firmware-none",尾缀none表示未使用操作系统,裸奔的意思。

裸机代码的主要功能包括有:

  1. 各传感器信号的采集、处理;
  2. 电机输出控制;
  3. 车模运行控制:直立控制、速度控制、方向控制;
  4. 车模运行流程控制:程序初始化、车模启动与结束、车模状态监控;
  5. 车模信息显示与参数设定:状态显示、上位机监控、参数设定等。

上述功能可以分成两大类:

第一类包括 1-3 功能,它们属于需要精确时间周期执行,因此可以在一个周期定时中断里完成。

第二类包括 4-5 功能。它的执行不需要精确的时间周期。可以放在程序的 主程序中完成。这两类任务之间可以通过全局变量实现相互的通讯。

现在结合裸机代码,来说说MWbalanced的软件框架。

主程序框架

MWbalanced主程序框架,如图1:

图1 主程序框架

程序上电运行后,便进行单片机的初始化。初始化的工作包括有两部分,第一部分是对于单片机各个应用到的模块进行初始化。第二部分是应用程序初始化,是对于车模控制程序中应用到的变量值进行初始化。

初始化完成后,首先进入车体直立检测子程序。该程序通过读取加速度计的数值判断车体是否处于可控角度范围状态。如果一旦处于可控范围则启动车体直立控制、速度控制以及蓝牙遥控。

程序在主循环中不停发送监控数据,在通过串口发送到上位机进行监控。同时检查车模是否跌倒。跌倒判断可以通过车模倾角是否超过一定范围进行确定。一旦车体跌倒,则停止车体运行,包括车体直立控制、速度控制以及方向控制,然后重新进入车体直立判断过程。

车体的直立控制、速度控制以及蓝牙遥控都是在中断程序中完成。通过全局标志变量确定是否进行这些闭环控制。

初始化

程序上电运行后,便进行单片机的初始化。初始化的工作包括有两部分,第一部分是对于单片机各个应用到的模块进行初始化。这部分的代码由懒人工具STC-ISP软件生成。第二部分是应用程序初始化,是对 于车模控制程序中应用到的变量值进行初始化。

其中单片机的初始化,包括GPIO初始化、PWM初始化、定时器初始化、串口初始化等。

初始化完成后,首先进入车模直立检测子程序。该程序通过读取加速度计的数值判断车模是否处于直立状态。如果一旦处于直立状态则启动车模直立控制、方向控制以及速度控制。

程序在主循环中不停发送监控数据,在通过串口发送到上位机进行监控。同时检查车模是否跌倒。跌倒判断可以通过车模倾角是否超过一定范围进行确定。一旦车模跌倒,则停止车模运行,包括车模直立控制、速度控制以及方向控制。然后重新进入车模直立判断过程。

接着,进入主循环while(1)之中。主循环是整个程序功能实现的关键,程序进入这里面就在里面循环运行了。中断来时,会打断主循环去运行中断服务程序,完事后再跳回到主循环运行。

主循环-125Hz循环

控制程序中最关键的部分,就是125Hz(8ms)中断服务函数。车模的直立控制、速度控制以及方向控制都是在中断服务函数中完成。通过全局标志变量确定是否进行这些闭环控制。

125Hz中断服务函数进行的任务有:

  1. 各传感器信号的采集、处理;
  2. 电机输出控制;
  3. 车模运行控制:直立控制、速度控制、方向控制;

以上每个任务都占用不同的时间,在程序调试时,需要保证它们都不会超过8毫秒。每个任务具体执行时间可以通过单片机的端口显示出来,可以用示波器去测量时间。

两轮自平衡小车以125Hz的刷新率,去检测与调整自身的状态。对于数字系统而言,刷新率越高,控制越精准。但是,也要结合MCU运算速度(程序的执行效率)合理制定主程序的刷新率,否则将会导致姿态检测错乱等问题。