程序框架介绍
本小节对程序框架和运行流程进行说明。
打开 MiaowLabs两轮自平衡小车「小霸王Lite」光盘\02、程序源代码\Mwbalanced-stm32-小霸王Lite-firmware-互补滤波-none V3.33\BasicBalance.uvprojx 工程文件,展开工程分组如下图所示:

如图所示,可以看到工程分有 6 个分组,其中 FWlib 分组主要是 HAL 库的文件代码,CMSIS 分组主要是 Cortex-M3 核心的文件代码,Startup 分组是 stm32f10x 的启动文件代码,BSP 分组主要是外设硬件的驱动程序代码,比如 MPU6050、oled 等,SYS 分组主要是滴答定时器和调试相关的配置代码,USER 分组是用户代码。
下面我们先讲解一下 USER 分组的 main.c。main.c 包含了所有硬件初始化和参数初始化代码。初始化代码如下:
初始化代码主要是硬件底层驱动和系统参数的初始化。下面我们来讲解一下功能函数的具体作用。
BspInit 主要是硬件底层驱动的初始化,包括 STM32 外设的初始化、外围模块比如 MPU-6050 的初始化。具体见下面代码:
PIDInit 主要是小车系统的 PID 参数初始化。
CarUpstandInit 主要是小车系统的各种参数初始化。
SysTick_Init 是系统滴答定时器 SysTick 的初始化,在这里设置为 1ms 中断一次。
if(IsInfrareOK()) g_iGravity_Offset = 1; 检测是否悬挂红外循迹模块,如果有则需要修改重心偏移值。因为在一侧悬挂红外后,小车重心会偏移。
ShowHomePageInit 主要是在 OLED 显示 logo。
while(1) 主循环中主要是执行一些非实时任务(早些迟些执行都无所谓的任务),人为定义一个秒级任务,轮询执行这些任务。这些非实时任务有上报数据、调试数据、解析协议、刷新 OLED 数据、读取距离等。
执行完初始化,代码会由于滴答定时器 SysTick 进入中断而转跳到 SysTick 定时中断服务函数中执行。在 stm32f10x_it.c 中可以找到 SysTick_Handler 定时中断服务函数。代码具体内容如下:
SoftTimerCountDown 是软定时器在 SysTick 中断中得到精确的递减。
g_u8MainEventCount 是主事件计数变量。我们需要在中断中运行的代码,在 1ms 内运行不完,所以需要主事件计数变量将代码合理分段,放到 5 个 1ms 内运行。
g_u8SpeedControlPeriod 是速度环的控制周期计数变量。
在 5ms 内执行 GetMotorPulse、MPU6050_Pose、AngleCalculate、AngleControl、MotorManage、MotorOutput,而速度环是 25ms 运行一次。
最后更新于
这有帮助吗?