PX4飞控之PWM输出控制

2023-05-16

PX4飞控之PWM输出控制

多旋翼电调如好盈XRotor,DJI通用电调等都支持PWM信号来传输控制信号。常用的400Hz电调信号对应周期2500us,一般使用高电平时间1000us~2000us为有效信号区间,即1000us为最低输出,2000us为最高输出,锁定(停转)信号一般取900us(或950us,太低电调会判断成无信号,太高容易误判成有输出而意外启动)。一般电调也都支持有效信区间设置,可以在典型值附近自定义。
为了保证安全,电调上电后需要先检测到锁定信号,即900us左右的高电平时间,上电后检测到锁定信号电调会长叫一声(这个声音通过电机发出来的,电动机跟扬声器原理上很像,接上声音信号放放音乐也是毫无压力的==),从锁定信号到最低输出信号(1000us)需要有加速过程(即分多次慢慢增加到1000us),加速完成后,进入开启模式,这时就可以在有效信号区间内直接输出给定值。如果电调上电后飞控直接输出有效信号或从锁定信号直接跳变到有效信号都会导致电调进入报警模式(急促“嘀嘀嘀”报警声),而且控制器的输出信号区间(如-1~1)也需要量化到电调的有效区间,因此需要有一个电调控制程序来启动电调和量化有效信号。分享下PX4的电调控制程序。

Firmware\src\modules\systemlib\pwm_limit\pwm_limit.c


  • pwm_limit中使用状态机来标志电调控制的不同阶段
enum {
    PWM_LIMIT_STATE_INIT = 0,  // 启动时初始化状态,等待一定时间后自动切换到锁定状态
    PWM_LIMIT_STATE_OFF,       // 锁定状态
    PWM_LIMIT_STATE_RAMP,      // 加速状态
    PWM_LIMIT_STATE_ON         // 开启状态,此时可以在有效区间内给任意控制信号
};
  • 初始化:将state切到初始化状态,重置解锁时间
void pwm_limit_init(pwm_limit_t *limit)
{
    // 初始化状态机,重置解锁时间
    limit->state = PWM_LIMIT_STATE_INIT;
    limit->time_armed = 0;
    return;
}
  • 状态机切换
    switch (limit->state) {
    case PWM_LIMIT_STATE_INIT:

        if (armed) {

            /* set arming time for the first call */
            if (limit->time_armed == 0) {
                limit->time_armed = hrt_absolute_time();
            }

            // 开机等待50ms后再进入锁定状态,在锁定状态下才能进入其他状态
            if (hrt_elapsed_time(&limit->time_armed) >= INIT_TIME_US) {
                limit->state = PWM_LIMIT_STATE_OFF;
            }
        }

        break;

    case PWM_LIMIT_STATE_OFF:
        if (armed) {
            // 解锁后进入加速状态
            limit->state = PWM_LIMIT_STATE_RAMP;

            /* reset arming time, used for ramp timing */
            // 记录下开始加速的时间
            limit->time_armed = hrt_absolute_time();
        }

        break;

    case PWM_LIMIT_STATE_RAMP:
        if (!armed) {
            // 加速状态中检测到飞机锁定(disarm),则切换回锁定状态
            limit->state = PWM_LIMIT_STATE_OFF;

        } else if (hrt_elapsed_time(&limit->time_armed) >= RAMP_TIME_US) {
            // 加速时间到达500ms后,切换到开启状态
            limit->state = PWM_LIMIT_STATE_ON;
        }

        break;

    case PWM_LIMIT_STATE_ON:
        if (!armed) {
            // 飞机锁定,切换到锁定状态
            limit->state = PWM_LIMIT_STATE_OFF;
        }

        break;

    default:
        break;
    }
  • 不同状态下的输出值

    /* then set effective_pwm based on state */
    switch (local_limit_state) {
    case PWM_LIMIT_STATE_OFF:
    case PWM_LIMIT_STATE_INIT:
        // 锁定状态和初始化状态下,所有通道都输出锁定的PWM值(900us高电平时间)
        for (unsigned i = 0; i < num_channels; i++) {
            effective_pwm[i] = disarmed_pwm[i];
        }
    
        break;
    
    case PWM_LIMIT_STATE_RAMP: {
            // 计算进入加速状态到现在的时间
            hrt_abstime diff = hrt_elapsed_time(&limit->time_armed);
    
            // 转换成百分比(整型计算,先放大PROGRESS_INT_SCALING倍,后面再除回来)
            progress = diff * PROGRESS_INT_SCALING / RAMP_TIME_US;
    
            if (progress > PROGRESS_INT_SCALING) {
                progress = PROGRESS_INT_SCALING;
            }
    
            for (unsigned i = 0; i < num_channels; i++) {
    
                float control_value = output[i];
    
                /* check for invalid / disabled channels */
                if (!isfinite(control_value)) {
                    effective_pwm[i] = disarmed_pwm[i];
                    continue;
                }
    
                uint16_t ramp_min_pwm;
    
                /* if a disarmed pwm value was set, blend between disarmed and min */
                if (disarmed_pwm[i] > 0) {
    
                    /* safeguard against overflows */
                    unsigned disarmed = disarmed_pwm[i];
    
                    if (disarmed > min_pwm[i]) {
                        // 预防参数设置错误导致锁定PWM值大于最低PWM
                        disarmed = min_pwm[i];
                    }
    
                    // 计算锁定PWM值和有效输出的最低PWM值之间的差值
                    unsigned disarmed_min_diff = min_pwm[i] - disarmed;
                    // 计算当前最小值
                    ramp_min_pwm = disarmed + (disarmed_min_diff * progress) / PROGRESS_INT_SCALING;
    
                } else {
    
                    /* no disarmed pwm value set, choose min pwm */
                    ramp_min_pwm = min_pwm[i];
                }
    
                if (reverse_mask & (1 << i)) {
                    control_value = -1.0f * control_value;
                }
    
                // 量化控制器输出
                effective_pwm[i] = control_value * (max_pwm[i] - ramp_min_pwm) / 2 + (max_pwm[i] + ramp_min_pwm) / 2;
    
                /* last line of defense against invalid inputs */
                if (effective_pwm[i] < ramp_min_pwm) {
                    effective_pwm[i] = ramp_min_pwm;
    
                } else if (effective_pwm[i] > max_pwm[i]) {
                    effective_pwm[i] = max_pwm[i];
                }
            }
        }
        break;
    
    case PWM_LIMIT_STATE_ON:
    
        for (unsigned i = 0; i < num_channels; i++) {
    
            float control_value = output[i];
    
            /* check for invalid / disabled channels */
            if (!isfinite(control_value)) {
                effective_pwm[i] = disarmed_pwm[i];
                continue;
            }
    
            if (reverse_mask & (1 << i)) {
                control_value = -1.0f * control_value;
            }
    
            // 开启状态,直接量化控制器输出到有效区间
            effective_pwm[i] = control_value * (max_pwm[i] - min_pwm[i]) / 2 + (max_pwm[i] + min_pwm[i]) / 2;
    
            /* last line of defense against invalid inputs */
            if (effective_pwm[i] < min_pwm[i]) {
                effective_pwm[i] = min_pwm[i];
    
            } else if (effective_pwm[i] > max_pwm[i]) {
                effective_pwm[i] = max_pwm[i];
            }
    
        }
    
        break;
    
    default:
        break;
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4飞控之PWM输出控制 的相关文章

  • PX4 ---- Indoor Flight

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之二十四:内部ADC模块

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • Hi3798 PWM输出控制背光

    一 PWM配置说明 Hi3798 具有3个PWM输出端口 通过查阅 Hi3798M V200 低功耗方案 使用指南 pdf 可得 xff1a 通过查阅Hitool工具可以查看到三个PWM端口的寄存器分别为 xff1a 通过原理图可得 xff
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • PWM互补输出,以及死区时间计算

    本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波 xff0c 且进行死区时间的计算说明 代码 互补输出对应的定时器初始化代码 xff1a bsp advance tim c span class token comment
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • PX4通过参数脚本给飞控导入参数

    PX4通过参数脚本给飞控导入参数 先找一架正常能飞的无人机连接地面站 在参数页面右上角点击工具 gt 保存到文件 保存的时候文件名注明参数的相关信息 然后将需要加载参数的无人机连接至地面站 xff0c 注意需要加载参数的无人机必须和保存的参
  • STM32F103控制PCA9685产生16路PWM波控制SG90舵机

    STM32控制PCA9685产生16路PWM波控制SG90舵机 如果你能点开这篇文章 xff0c 说明你已经知道PCA9685是多么强大 xff0c NXP公司原本做这片芯片是为了提供给LED使用 xff0c 在其官方文档里也能看到所有PW
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设
  • 魔方机器人之下位机编程-----两种串口通信方式的比较

    由于上位机软件的串口通信部分和魔方复原算法部分已经完成 接下来的一步就是如何将魔方复原的具体步骤 字符串的形式 通过串口发送给单片机MC9S12XS128单片机了 调试的过程中 采用了两种串口通信的方式 一种是查询的方式 另一种是中断的方式
  • stm32f103 TIM2定时器4路PWM输出实验

    这里以TIM2为例 pwm c include pwm h uint16 t TIM2 CCR1 Val uint16 t TIM2 CCR2 Val uint16 t TIM2 CCR3 Val uint16 t TIM2 CCR4 Va
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后

随机推荐

  • KiCAD绘制原理图---------创建一个新的原理图符号

    1 创建一个新的原理图库文件 第1步 xff0c 打开原理图器件编辑界面 如图1 1 1所示 xff0c 点击 Smbol Editor 图标进入器件编辑界面 第2步 xff0c 进入文件管理菜单 如图1 2 1所示 xff0c 点击 Fi
  • ubuntu 查看内存命令

    Linux中使用free 可以查看系统内存使用状态 默认单位为KB 为单位 xff0c 在此我以MB为单位说明 lostman 64 lostman MS 6702E 桌面 free m total used free shared buf
  • Nvidia Xavier Nx平台SD卡热插拔检测失效问题调试记录

    1 前言 Xaiver NX上 使用sdmmc3为sd卡 正常工作 但是 当热插拔时会检测不到 使用GPIO12 GPIO3 PCC 04 作为cd gpio cd gpios lt amp tegra aon gpio TEGRA194
  • MobaXterm连接虚拟机超时:Connection timed out

    折腾了几个小时 来两句废话 1 首先我确认了虚拟机防火墙已关 2 ip配置无问题 3 重置VMware网络设置啥的 然而并没有卵用 4 虚拟机ping百度正常 主机ping虚拟机正常 以上4条依然无效 解决方案 原理不清楚 但是解决了 通过
  • Windows下python激活虚拟环境后仍然使用全局python和pip

    这么过分一定要发CSDN jpg 在windows下 xff0c 激活python虚拟环境后 xff0c 使用的python和pip仍然是全局的python和pip 如图 使用pip list 可以看到这个包这么多 xff0c 显然不是我刚
  • openmv 自学笔记(APRILTAG标记追踪)

    由图可知 id 为5 旋转角度 为11 0 左边旋转 角度增加 正式时候调度接近0 右边旋转 角度减少 由360度 向右减少 Tx 在左边的时候 为负数 右边为正值 Ty 在上边的时候为正数 左边为负值 Tz 从远处 到近处 由负数到向正数
  • 学习STM32(3)-电源、时钟、复位电路

    Stm32 时钟分析 该分析材料大部分来自opendev 论坛 xff0c 我所做的只不过是加上一些自己的分析和整理 xff0c 由于个人能力有限 xff0c 纰漏之处在所难免 xff0c 欢迎指正 一 硬件上的连接问题 如果使用内部RC振
  • 只是运行roslauch来发布一次TF

    如果只是希望运行roslaunch来发布一次TF xff0c 可以使用launch文件中的node标签来实现 下面是一个发布一次TF的launch文件例子 xff1a lt launch gt lt node pkg 61 34 tf2 r
  • 2019年年终总结(流水账)

    2019年年终总结 流水账 前言 马上就要是2020年了 xff0c 我此时敲下我的第一篇年终总结 马上就要过去的2019年对于我来说是平凡但却不平淡的一年 xff0c 这一年里我经历了很多 xff0c 虽然这些在别人眼中可能是微不足道的
  • 融资租赁与经营租赁的区别

    我现在手上项目的客户是一家销售公司 xff0c 他们有把自己的商品租赁给别的公司经营的业务 于是就有了上面的融资租赁与经营租赁 xff0c 这两种方式在财务上对资产的处理是不一样的 下面我们来看看这个场景 xff1a A公司把资产租给B公司
  • 【Linux网络编程(五)】TCP编程流程

    文章目录 TCP编程1 TCP介绍 编程流程2 TCP C S架构3 TCP客户端编程流程1 创建TCP套接字2 connect连接服务器3 send发送请求4 recv接收应答 xff08 默认带阻塞 xff09 5 close6 客户端
  • ESP32-Drone四旋翼无人机代码编译发现的二个问题及解决方法

    摘要 ESP32 Drone四旋翼无人机是乐鑫的一个开源项目 xff0c 我根据官方的硬件参考设计 xff0c 重新使用KiCAD绘制了原理图和PCB板 xff0c 并制作了控制板样板 xff0c 在配置了ESP idf 4 4编程环境编译
  • 小觅相机运行vins-mono

    小觅相机运行vins mono span class token function mkdir span p mynt eye vins catkin ws src span class token function cd span myn
  • 程序员改变世界,从未如此直观

    万万没想到 xff0c 包博士的代码让一个六岁的小学生哇哇大哭 这个让小学生流眼泪的 科学家代表 有非常漂亮的履历 xff1a 清华大学毕业 博士曾在斯坦福就读 xff0c 他现在是VIPKID的首席AI科学家 xff0c 带领四十多人的产
  • 【Linux系统编程(十五)】信号量

    文章目录 信号量1 信号量1 1 信号量的概述1 2 信号量的API1 2 1 初始化信号量1 2 2 信号量减一 xff08 P操作 xff09 1 2 3 尝试对信号量减一1 2 4 信号量加一 xff08 V操作 xff09 1 2
  • 【ESP32_FreeRTOS篇】

    FreeRTOS 是一款 开源免费 的实时操作系统 xff0c 遵循的是 GPLv2 43 的许可协议 这里说 到的开源 xff0c 指的是你可以免费得获取到 FreeRTOS 的源代码 xff0c 且当你的产品使用了 FreeRTOS 且
  • 【FreeRTOS(十四)】StreamBuffer

    文章目录 数据流创建 xStreamBufferCreate发送 xStreamBufferSend接受 xStreamBufferReceive查询流缓冲区 xStreamBufferSpacesAvailable代码示例 数据流 创建
  • 【FreeRTOS(十五)】MessageBuffer

    文章目录 MessageBuffer创建 xMessageBufferCreate发送 xMessageBufferSend接收 xMessageBufferReceive代码示例 MessageBuffer 创建 xMessageBuff
  • 【Git】Git修改 commit 的信息

    Git 修改 commit 的信息 xff1a git log 查看提交日志 xff0c 找到要修改的commit xff1a git rebase i HEAD n 1 切换到需要修改的 commit 中 xff0c n为commit的序
  • PX4飞控之PWM输出控制

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor xff0c DJI通用电调等都支持PWM信号来传输控制信号 常用的400Hz电调信号对应周期2500us xff0c 一般使用高电平时间1000us 2000us为有效信号区间 xf