PX4-Autopilot PWM怠速值与最小值机制技术分析文档
作者:李荣江
时间:2025年6月13日
执行摘要
本文档对PX4-Autopilot v1.16.0-rc3版本中PWM怠速值(Disarmed PWM)和最小PWM值(Minimum PWM)的实现机制进行了全面的源码级分析。通过深入研究混合输出模块(MixingOutput)、PWM输出驱动(PWMOut)以及底层硬件接口,本文档详细阐述了这两个关键PWM参数的定义、存储、配置以及它们之间的过渡算法。
1. 系统架构概述
1.1 PWM输出系统分层架构
PX4的PWM输出系统采用模块化分层设计,数据流从高层控制指令逐层传递到底层硬件:
┌──────────────────────┐
│ ControlAllocator │ 控制分配器 - 将控制指令分配到各执行器
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ MixingOutput │ 混合输出模块 - PWM值计算和状态管理
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ PWMOut │ PWM输出驱动 - 硬件抽象层
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ up_pwm_servo_* │ 底层硬件接口 - 定时器配置
└──────────────────────┘
1.2 关键模块文件位置
- 混合输出模块:
src/lib/mixer_module/mixer_module.cpp|hpp - PWM输出驱动:
src/drivers/pwm_out/PWMOut.cpp|hpp - 参数定义:
src/drivers/pwm_out/module.yaml - 硬件接口定义:
src/drivers/drv_pwm_output.h
2. PWM参数定义与存储机制
2.1 怠速PWM值 (Disarmed PWM)
2.1.1 参数定义
文件位置: src/drivers/pwm_out/module.yaml:8
disarmed: {
min: 800, max: 2200, default: 1000 }
2.1.2 参数命名规则
- 主通道:
PWM_MAIN_DIS1~PWM_MAIN_DIS8 - 辅助通道:
PWM_AUX_DIS1~PWM_AUX_DIS8
2.1.3 数据结构存储
文件位置: src/lib/mixer_module/mixer_module.hpp:243
class MixingOutput : public ModuleParams
{
private:
uint16_t _disarmed_value[MAX_ACTUATORS] {
}; // 存储每个通道的怠速PWM值
// MAX_ACTUATORS = 16 (支持最多16个执行器)
};
2.1.4 参数加载逻辑
文件位置: src/lib/mixer_module/mixer_module.cpp:168-170
void MixingOutput::updateParams()
{
for (unsigned i = 0; i < _max_num_outputs; i++) {
int32_t val;
// 从参数存储中读取怠速PWM值
if (_param_handles[i].disarmed != PARAM_INVALID &&
param_get(_param_handles[i].disarmed, &val) == 0) {
_disarmed_value[i] = val;
}
}
}
2.2 最小PWM值 (Minimum PWM)
2.2.1 参数定义
文件位置: src/drivers/pwm_out/module.yaml:9
min: {
min: 800, max: 1400, default: 1000 }
2.2.2 参数命名规则
- 主通道:
PWM_MAIN_MIN1~PWM_MAIN_MIN8 - 辅助通道:
PWM_AUX_MIN1~PWM_AUX_MIN8
2.2.3 数据结构存储
文件位置: src/lib/mixer_module/mixer_module.hpp:244
uint16_t _min_value[MAX_ACTUATORS] {
}; // 存储每个通道的最小PWM值
2.2.4 参数加载逻辑
文件位置: src/lib/mixer_module/mixer_module.cpp:172-174
// 从参数存储中读取最小PWM值
if (_param_handles[i].min != PARAM_INVALID &&
param_get(_param_handles[i].min, &val) == 0) {
_min_value[i] = val;
}
2.3 最大PWM值 (Maximum PWM)
2.3.1 参数定义
文件位置: src/drivers/pwm_out/module.yaml:10
max: {
min: 1600, max: 2200, default: 2000 }
2.3.2 数据结构存储
文件位置: src/lib/mixer_module/mixer_module.hpp:245
uint16_t _max_value[MAX_ACTUATORS] {
}; // 存储每个通道的最大PWM值
3. PWM输出状态机实现
3.1 状态定义
文件位置: src/lib/mixer_module/mixer_module.hpp:249-253
enum class OutputLimitState {
OFF = 0, // 未解锁状态 - 输出怠速PWM值
RAMP, // 过渡状态 - 从怠速渐变到最小值
ON // 激活状态 - 正常PWM输出范围[min, max]
} _output_state{
OutputLimitState::OFF};
3.2 状态转换逻辑
文件位置: src/lib/mixer_module/mixer_module.cpp:550-582
void MixingOutput::

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



