软件功能

本小节对「小霸王Lite」两轮自平衡小车的软件功能进行简单说明。

两轮自平衡小车的关键点在于保持自平衡,程序中的首要任务,就是优先保障小车的直立平衡,即其他功能任务都是在不干扰直立平衡的情况下进行添加。

「小霸王Lite」两轮自平衡小车软件流程图
Image 2.15.1 - 「小霸王Lite」两轮自平衡小车软件流程图

「小霸王Lite」两轮自平衡小车的程序的主要功能包括:

  1. 程序初始化;
  2. 对传感器数据、编码器脉冲数据进行读取、处理;
  3. 直立控制、速度控制、方向控制;
  4. 计算 PWM 输出控制电机;
  5. 其他辅助功能:蓝牙遥控、超声波读取、红外信号处理、显示屏刷新、上位机监控等。

上述功能可以分成两大类:第一类包括 2、3、4 功能,它们属于需要精确时间周期执行,因此可以放在一个周期定时中断里完成。第二类包括 1、5 功能,它们的执行不需要精确的时间周期。可以放在程序的主程序中完成。这两类任务之间可以通过全局变量实现相互的通讯。

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

初始化完成后,首先进入小车直立平衡检测子程序。该程序通过角度判断车体是否处于可控角度范围内,如果处于可控范围,则立刻启动车体直立控制、速度控制、方向控制以及电机输出。如果不处于可控范围,则一直等待,直到符合条件。

程序在主循环中不停发送监控数据,通过串口与蓝牙模块进行全双工通信,将数据发送到手机或电脑进行监控。同时,在主循环中接受来自手机或手机的要控制指令。

小车的直立控制、速度控制、方向控制以及电机输出都是在定时中断程序中完成。通过全局标志变量确定是否进行这些闭环控制。提起识别、着陆识别、跌倒识别功能函数同样放在中断里,一旦检测到车体失控,则停止电机输出,直至重新符合直立条件。

因为大部分定时器我们都另有他用,于是我们使用 STM32 的滴答定时器,产生 1 毫秒定时中断。中断服务程序的任务被均匀分配在 0~4 的中断片段中,所有中断片段全部执行一遍需要 5ms。因此每个中断片段中的任务执行的频率为 200Hz,即 5ms。

将任务分配到不同的中断片段中,一方面防止这些任务累积执行时间超过 1ms,扰乱 1ms 中断的时序,同时也考虑到这些任务之间的时间先后顺序。当然,也可以将所有的中断任务都合并在一起,使用一个 5ms 的定时中断来完成。

这些任务包括:

  • 电机测速脉冲计数器读取与清除。累积电机转动角度。累积电机速度,为后面速度控制提供平均数。
  • 读取传感器的加速度数据、陀螺仪数据。
  • 直立控制过程,包括姿态角度计算、直立控制计算。
  • 速度控制过程,在这个 1ms 时间片段中,又进行 0~5 计数。在其中第 0 片段中,进行速度 PID 调节。因此,速度调节的周期为 5×5=25 毫秒,也就是每秒钟调节 40次。
  • 方向控制过程,根据 APP 或上位机控制指令(或寻迹时读取红外传感器数值等),计算偏差数值,然后计算电机差速控制输出。
  • 电机使能与失能控制,包括提起识别(悬空检测)、着陆检测、跌倒检测等。
  • 电机输出,融合直立控制、速度控制、方向控制叠加值,最终赋予电机输出。

以上每个中断任务都占用不同的时间,上文中提到,我们设定一个 1ms 定时中断,让这些任务分配在各自的1ms内执行,划分了 0~4 共 5 个 1ms 时间片段,全部任务执行一遍需要 5ms。在程序调试时,需要保证它们都不会超过 1ms。每个任务具体执行时间可以通过示波器测量单片机 IO 引脚电平翻转得到,设定执行某任务前单片机的指定 IO引脚为低电平,执行完任务后,引脚电平翻转为高电平。

从上面任务中断时间波形可以得到每个任务消耗的时间: 在中断退出之后,程序继续回到主程序往下执行,完成蓝牙通信和监控调试等工作。