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 ---- Mixer

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • 【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
  • jetson nx fan auto pwm

    参考 xff1a Jetson Nano PWM自动调速 Ay yzx的博客 CSDN博客 代码 xff1a usr bin env python import os import commands from the path of thi
  • 关于github px4 gps 驱动的开发的总结

    源码编译上边已经写过文章了 遇到的几个问题 1 解决虚拟机不能共享文件夹的问题 一开始虚拟机的更新 vmware tools 是灰色的 xff0c 不能点 xff0c 然后通过关掉虚拟机 xff0c 然后再开启的时候 xff0c 在没有启动
  • px4仿真无法起飞问题(Failsafe enabled: no datalink)

    报错信息 问题描述 xff1a 使用JMAVSim和gazebo仿真px4起飞时报错如下 xff1a WARN commander Failsafe enabled no datalink 说不安全 解决方法 打开QGC 就可以起飞了
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • stm32定时器与定时器中断

    1 定时器种类 注 主要使用通用定时器 2 通用计时器特点描述 说明 四个通道互不影响 3 定时器中断触发条件 4 定时器计数模式 分为向上 向下 向上向下模式 5 通用定时器作用用途 测量输入输出波长度等 说明 每个定时器完全独立没有共享
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • STM32通用定时器使用详解

    1 通用定时器基本介绍 通用定时器包括TIM2 TIM3 TIM4和TIM5 STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成 每个定时器都是完全独立的 没有互相共享任何资源 它们可以一起同步操作 定时器可以进行定

随机推荐

  • vs运行,f10失效

    在 Visual Studio 中 xff0c 按 F10 快捷键是用于单步执行代码的调试命令 如果该快捷键失效了 xff0c 可以尝试以下方法进行排除问题 xff1a 确保当前处于调试模式 xff1a 在 Visual Studio 的菜
  • 嵌入式linux应用开发入门纲要

    目录 C语言基础C 43 43 拓展linux基本操作io操作数据结构进程线程网络编程sqlite数据库实战项目 C语言基础 基本数据类型 条件语句 循环语句 函数 算术运算 逻辑运算 指针 结构体 联合体 枚举 malloc C 43 4
  • 全能扫地机器人的想法

    他要会自己充电 最好 xff0c 他是可以太阳能充电 xff0c 没电了 xff0c 他自己去晒太阳 他要自己规划路线 他最好我不在家的时候工作 他得会自己打包好垃圾 他要会拖地 我可以语音控制他 我叫他的时候 xff0c 他可以报告自身的
  • qt根据组件名字找到组件

    比方说知道一个在tw下QPushButton的ObjectNam为 34 ok 34 xff0c 那么它的组件指针就是 xff1a auto btn 61 ui gt tw gt findChild lt QPushButton gt 34
  • linux下zip加密压缩和解压

    对于目录a的无密码压缩 xff1a zip r aa zip aa 对于目录a的无密码j解压 xff1a unzip aa zip 对于目录a的加密压缩 xff0c 密码为123456 xff1a zip rP 123456 a zip a
  • SESSION 的数据保存在哪里呢?

    SESSION 的数据保存在哪里呢 xff1f 当然是在服务器端 xff0c 但不是保存在内存中 xff0c 而是保存在文件或数据库中 默认情况下 xff0c php ini 中设置的 SESSION 保存方式是 files xff08 s
  • 在ubuntu20.04安装vscode

    在PC上安装 照以下步骤在Ubuntu 20 04上安装VS Code xff1a 打开终端 添加Microsoft的软件包存储库到APT包管理器中 xff0c 输入以下命令 xff1a curl https packages micros
  • 有两个以上的USB设备,他们的Vendor ID和Product ID都一样,如何指定对应的usb插口和/dev/ttyUSB的序号?

    如果有两个以上的USB设备 xff0c 他们的Vendor ID和Product ID都一样 xff0c 那么无法通过Vendor ID和Product ID来区分它们 需要采取其他方式来指定对应的USB插口和 dev ttyUSB的序号
  • Could not find a configuration file for package “OpenCV“ that is compatible with requested version “

    错误详情 xff1a Could not find a configuration file for package 34 OpenCV 34 that is compatible with requested version 34 3 0
  • 在ubuntu安装c++版本的absl库

    对于 C 43 43 xff0c 您可以通过以下步骤安装 absl xff1a 1 安装必要的依赖项 xff1a sudo apt get install cmake g 43 43 git 2 克隆 absl 代码库 xff1a git
  • 一个带有信号量的列表,有什么作用

    一个带有信号量的列表可以用于在多线程环境下实现线程间的同步和通信 具体来说 xff0c 它可以实现以下功能 xff1a 1 限制列表的大小 xff1a 通过设置列表的最大容量 xff0c 可以限制列表中元素的数量 xff0c 避免列表过大导
  • TR069是什么鬼

    一 xff0c TR069是什么 1 xff0c 概念 搞嵌入式或通信设备的 xff0c 或多或少都会听说TR069 那他是什么鬼 xff1f TR069 xff0c 就是CPE广域网管理协议 它用于ACS和CPE之间的自动协商交互 xff
  • 为 Konsole 单独设置暗色主题

    在 KDE 中设置亮色主题后 xff0c konsole 主体的黑色的 xff0c 但是菜单栏是白色的 对于终端 xff0c 我更偏向于使用暗色主题 xff0c 有以下思路 xff1a KWin Rule修改 konsole 配置文件命令行
  • 2019年年终总结(流水账)

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

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

    文章目录 生产者和消费者1 代码示例 生产者和消费者 生产者消费者问题 xff08 英语 xff1a Producer consumer problem xff09 xff0c 也称有限缓冲问题 xff08 英语 xff1a Bounded
  • Linux下做SSH服务(远程登录)配置

    准备工作 1 检查是否安装ssh rpm q OpenSSH server 一般自带 xff0c 不用安装 2 安装ssh服务 xff1a yum list installed grep openssh server 服务器端配置 1 cd
  • Openlayer 计算多个feature的外接矩形,并且缩放到合适的视角显示

    开发gis系统的时候需要点击一个工程然后打开openlayers地图并且将该工程的线条缩放到合适的区域 xff0c 对这个问题的解决方案 xff1a 1 旋转卡壳法求点集的最小覆盖矩形面积以及周长 https www cnblogs com
  • 程序员改变世界,从未如此直观

    万万没想到 xff0c 包博士的代码让一个六岁的小学生哇哇大哭 这个让小学生流眼泪的 科学家代表 有非常漂亮的履历 xff1a 清华大学毕业 博士曾在斯坦福就读 xff0c 他现在是VIPKID的首席AI科学家 xff0c 带领四十多人的产
  • PX4飞控之PWM输出控制

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