欢迎交流~ 个人 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
明显与我们设置的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伏特的输出至电机上,不同的工作周期对应出不同电压让直流电机转速产生不同的变化。
与转速的关系可简单由下式表达
/**
* 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 了呢?莫非是有一个起转电压吗?
待解决
不要疑惑为什么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.px4
在Firmware/build_px4fmu-v2_default/src/firmware/nuttx
目录下,px4io-v2.bin
在./extras
目录下,一并被烧到主控制器的Flash中去了。
问题:一直传言说PX4IO是作为故障协处理器存在的,但是源码中一直未能找到其故障保护的逻辑,目前其只是负责PWM输出以及安全开关的按下与否。对于其实际的故障保护功能目前存疑……
By Fantasy