Pixhawk原生固件PX4之调节怠速

欢迎交流~ 个人 Gitter 交流平台,点击直达:


怠速

这里怠速指的是Pixhawk解锁后电机的转速。是电机最小的转速,油门打到最低依然存在的转速。

根据这个思路我们找到了PWM_MIN

/**
 * Set the minimum PWM for the main outputs
 *
 * IMPORTANT: CHANGING THIS PARAMETER REQUIRES A COMPLETE SYSTEM
 * REBOOT IN ORDER TO APPLY THE CHANGES.
 *
 * Set to 1000 for industry default or 900 to increase servo travel.
 *
 * @reboot_required true
 *
 * @min 800
 * @max 1400
 * @unit us
 * @group PWM Outputs
 */
PARAM_DEFINE_INT32(PWM_MIN, 1000);

根据代码可以看出主通道输出的最小PWM值为1000,但是问题是博主刷完固件在QGC地面站上配置时默认的PWM_MIN = 1230

Pixhawk原生固件PX4之调节怠速_第1张图片

明显与我们设置的PWM_MIN不一致,既然所有的参数都是编译得到的,那么PWM_MIN这一项必定是在代码中某一个位置被赋值了,全局搜索后发现:

# Firmware/ROMFS/init.d/px4fmu_common/4011_dji_f450

sh /etc/init.d/4001_quad_x

if [ $AUTOCNF == yes ]
then
    ...
    # DJI ESCs do not support calibration and need a higher min
    param set PWM_MIN 1230
fi

在机型配置时,在相应的脚本文件中重写了PWM_MIN为1230,这样才导致看到地面站上的数值是1230而不是1000。

修改怠速可以从这里入手了,最低设置为800(怠速为0),最高1400。

但是建议不要关闭怠速,因为修改怠速之后整个油门行程都改变了。起初默认1230us,开始就转这么快 然后推油门就加转速;把怠速调小了,油门需要先推一段才能达到默认怠速的转速。

好比以前40%油门起飞,现在要45%。改与不改、如何修改还看各位看官的感觉了。

其余机型方法无异,不再赘述

电机控制

前文提到的1000us、1200us代表什么?

与Pixhawk配套使用的是BLDC(Brushless Direct Current)无刷直流电机,通过ESC(Electronic Speed Control)电子调速器控制电机转速。

也就是常说的PWM控制,就是通过占空比控制输出电压,占空比是一个周期内高电平时间与总时间之比,例如周期1s,高电平0.2s,那么占空比就是1 : 5 。若直流电机的供应电源电压为10伏特,乘以20%的工作周期即得到2伏特的输出至电机上,不同的工作周期对应出不同电压让直流电机转速产生不同的变化。

与转速的关系可简单由下式表达

=KV
/**
 * Set the PWM output frequency for the main outputs
 *
 * IMPORTANT: CHANGING THIS PARAMETER REQUIRES A COMPLETE SYSTEM
 * REBOOT IN ORDER TO APPLY THE CHANGES.
 *
 * Set to 400 for industry default or 1000 for high frequency ESCs.
 *
 * @reboot_required true
 *
 * @min -1
 * @max 2000
 * @unit Hz
 * @group PWM Outputs
 */
PARAM_DEFINE_INT32(PWM_RATE, 400);

PX4中PWM波的更新频率为400Hz,一个周期为2500us。PWM输出范围为800~2200。现在就可以根据上面的公式对转速有一个大致的估算了。

问题: 为什么当PWM_MIN设置为800的时候,怠速就为 0 了呢?莫非是有一个起转电压吗?
待解决

Tips

不要疑惑为什么Pixhawk上有两个控制器(PX4FMU和PX4IO)却只用一根连接到PX4FMU的USB线就可以完成刷固件的操作了。

int
px4io_main(int argc, char *argv[])
{
  ...
  ...

        PX4IO_Uploader *up;
        const char *fn[4];

        /* work out what we're uploading... */
        if (argc > 2) {
            fn[0] = argv[2];
            fn[1] = nullptr;

        } else {
#if defined(CONFIG_ARCH_BOARD_PX4FMU_V1)
            fn[0] = "/etc/extras/px4io-v1.bin";
            fn[1] = "/fs/microsd/px4io1.bin";
            fn[2] = "/fs/microsd/px4io.bin";
            fn[3] = nullptr;
#elif defined(CONFIG_ARCH_BOARD_PX4FMU_V2) || \
      defined(CONFIG_ARCH_BOARD_AUAV_X21) || \
      defined(CONFIG_ARCH_BOARD_PX4FMU_V4PRO)
            fn[0] = "/etc/extras/px4io-v2.bin";
            fn[1] = "/fs/microsd/px4io2.bin";
            fn[2] = "/fs/microsd/px4io.bin";
            fn[3] = nullptr;
#else
#error "unknown board"
#endif
        }

        up = new PX4IO_Uploader;
        int ret = up->upload(&fn[0]);
        delete up;
    ...
    ...
}

PX4FMU(STM32F4)与PX4IO(STM32F1)仅通过一个串口线相连接,F4芯片会完成为F1芯片刷固件的操作,编译出来的可烧录固件nuttx-px4fmu-v2-default.px4Firmware/build_px4fmu-v2_default/src/firmware/nuttx目录下,px4io-v2.bin./extras目录下,一并被烧到主控制器的Flash中去了。

问题:一直传言说PX4IO是作为故障协处理器存在的,但是源码中一直未能找到其故障保护的逻辑,目前其只是负责PWM输出以及安全开关的按下与否。对于其实际的故障保护功能目前存疑……


                                          By Fantasy

你可能感兴趣的:(Pix学习笔记)