
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》
❄专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》
❄专栏传送门 :《产品测评专栏》
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连
目录
前言
在上两篇文章中,我们已经完成了控制任务的核心框架搭建:
第一篇:实现 IDLE/RUN 双模式状态机, 并通过 FreeRTOS 任务通知机制,让控制任务能高效响应通信指令,实现了从休眠到运行的平滑切换。
第二篇:完成了从上层指令到电机驱动的完整闭环链路 ,包括运动学逆解、PID 速度控制和 PWM 输出,为底盘控制提供了坚实的理论和代码基础。
要验证这一整套闭环逻辑是否有效,就必须让 "目标速度" 和 "实际速度" 形成交互。在真实硬件(编码器、电机)尚未完全就绪的开发初期,为了不中断调试流程,我们引入了仿真电机模型。它为 PID 控制器提供了一个软件层面的 "虚拟反馈源",让我们可以在纯软件环境下,完整跑通整个闭环控制流程,提前验证算法的正确性和稳定性。
一、仿真电机模型
在项目开发初期,为了在最小的硬件依赖下完成控制逻辑的验证,我们引入了一个简化的仿真电机模型。它的作用并非精确还原真实电机的所有物理特性,而是提供一个行为合理、响应连续的速度反馈源,让我们在没有真实硬件的情况下,也能构建起完整的 "指令下发 → 控制计算 → 反馈更新" 闭环控制链路。
仿真电机模型的基本思路是:将 PID 输出的 PWM 指令视为 "期望驱动强度",并通过两步转换得到一个近似真实的 "测量速度":
线性映射:PWM → 目标速度
首先,将逻辑 PWM 值按比例映射为一个目标线速度。
当 PWM 输出为最大值时,对应电机可达到的最大速度,由一个参数变量指定。
当 PWM 较小时,目标速度也按比例缩小。
这一映射基于工程上常用的近似假设:在工作区间内,PWM 与稳态速度之间近似呈线性关系,足以满足算法调试阶段的需求。
一阶惯性模型:模拟动态响应
得到目标速度后,系统并不会立即将其作为测量速度输出,而是引入了一个一阶惯性模型来模拟电机的动态响应过程。
核心思想:当前速度变化的快慢,取决于当前速度与目标速度之间的差值。差值越大,速度变化越快;差值越小,变化越慢。
效果:该模型能自然表现出电机启动时的 "爬升过程" 和制动时的 "衰减过程",而不是瞬间跳变,完美模拟了真实电机的惯性和机械特性。

二、代码实现
在代码中,这一过程通过一个简单而高效的离散公式实现。每个控制周期内,模型会根据当前周期时间 dt 和设定的时间常数 SIM_TAU_SEC 计算出一个权重系数 alpha,用于决定本周期速度更新的幅度。随后,测量速度会在当前值与目标值之间进行平滑过渡,避免突变。
cpp
/* ==================================================
* 仿真电机模型: PWM -> v_meas (mm/s)
* 用于没有编码器时测试闭环:
* PWM -> v_cmd(线性映射) -> 一阶惯性 -> v_meas
* ================================================== */
static void MotorSim_Update(int16_t pwmL, int16_t pwmR, float dt) {
// 1. PWM 线性映射为目标速度
float vL_cmd = ((float)pwmL / (float)PWM_MAX) * SIM_MAX_SPEED_MMPS;
float vR_cmd = ((float)pwmR / (float)PWM_MAX) * SIM_MAX_SPEED_MMPS;
// 2. 一阶惯性模型更新
// alpha = dt / (tau + dt),决定响应速度
float alpha = dt / (SIM_TAU_SEC + dt); // 取值范围 0~1
// 速度平滑过渡
vL_meas += alpha * (vL_cmd - vL_meas);
vR_meas += alpha * (vR_cmd - vR_meas);
}
SIM_MAX_SPEED_MMPS :定义了 PWM 满幅时电机的理论最大速度,单位为 mm/s。
SIM_TAU_SEC :仿真模型的时间常数,反映了电机 "响应快慢" 的特性。当 SIM_TAU_SEC 较小时,模型表现为响应迅速,接近理想电机。
当 SIM_TAU_SEC 较大时,模型表现为响应迟缓,惯性明显。
通过调整该参数,可以模拟不同类型电机或不同负载情况下的动态行为,从而全面观察 PID 控制器在各种条件下的表现。
总结
至此,我们完成了从上层指令到闭环验证的全部软件逻辑链路:
第一期搭建了控制任务的双模式调度框架。
第二期实现了运动学逆解、PID 控制和 PWM 驱动。
本期引入仿真电机模型,在纯软件环境下完成了闭环控制的完整验证。