FreeRTOS 控制任务设计 (3)--- 闭环控制验证:仿真电机模型与软反馈实现

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《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 驱动。

本期引入仿真电机模型,在纯软件环境下完成了闭环控制的完整验证。

相关推荐
凉、介7 小时前
C 语言类型强转引发的隐蔽内存破坏问题分析
c语言·开发语言·笔记·学习·嵌入式
嵌入式小企鹅1 天前
嵌入式面试宝典
学习·面试·嵌入式·嵌入式工程师·高薪offer
星瞳科技OpenMV1 天前
国家级高新技术企业星瞳科技,定义嵌入式机器视觉行业新标杆
人工智能·嵌入式·图像识别·机器视觉·openmv·星瞳科技·星瞳科技openmv
Hello_Embed1 天前
【无标题】
网络·笔记·网络协议·tcp/ip·嵌入式
XD7429716361 天前
001. MSP430G2553 入门总述:从零开始学习这颗单片机
单片机·嵌入式硬件·学习·嵌入式·msp430g2553
CinzWS1 天前
A53 FPGA原型验证:从RTL到可运行系统的挑战
arm开发·嵌入式·芯片验证·原型验证·a53
Freak嵌入式1 天前
亲测可用!可本地部署的 MicroPython 开源仿真器
ide·驱动开发·嵌入式·仿真·micropython·upypi
嵌入式小企鹅1 天前
CPU供需趋紧、DeepSeek V4全链适配、小米开源万亿模型
人工智能·学习·开源·嵌入式·小米·算力·昇腾
FreakStudio2 天前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机