PX4-Autopilot PWM怠速值与最小值机制技术分析文档

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::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值