无人机PX4飞控 | 电源系统详解与相关代码
无人机需要一个稳压电源用于飞控供电,同时用于电机、舵机、外围设备等的供电。供电系统一般是一块电池或多块电池
电源模块通常用于“分离”飞行控制器的稳压电源,也用于测量电池电压和PX4学习笔记飞行器消耗的总电流。
PX4可以使用这些信息来推断剩余的电池容量,并提供低电量警告和一些故障保护行为。
分电板(PDB,Power Distribution Board)可用于简化将电池输出到飞行控制器、电机和其他外围设备的布线。
PX4也可以接收更全面的电池/电源信息作为MAVLink遥测,而不是使用电源模块。能够提供MAVLink信息的电池有时被称为“智能电池”。
电源模块/ 分电板
电源模块提供一个稳压电源给飞控,通过也给飞控电池的电压和电流信息。
电压/电流信息用于确定消耗的功率,从而估计剩余的电池容量。
飞控提供的故障安全保护警告和行为的设置可以通过参数进行设置。
电源模块同样有一些参数要配置。
同时电源模块目前也分为好多种:
模拟电压和电流电源模块
数字电压和电流电源模块
DroneCAN 电源模块
下面以一个DroneCAN 模块 为例进行介绍
CAN PMU Lite
简介
CAN PMU Lite 是 CUAV 标准版电源管理模块,内置 STM32F412 处理器,支持10~62V 电压输入与 5.2V/4A 稳压输出。相较 HV_PM,它采用先进的CAN总线通信,支持标准的 UAVCAN 协议。PMU Lite 内置 ITT 温度补偿算法并进行出厂校准,保证在不同温度下均能获得较精准的电压电流数据。
注意支持的固件为 V1.10.1 以上
主要功能:
支持 10~62V 电压输入
最大通过电流:最大 90A
精度电压电流检测:80A 内电流准确度 0.2,电压准确度 0.15V
稳压输出:可为外设提供最高 21W 5.2V/4A 电源输出
电源指示 LED,直观指示 Lipo 电压状态
线路连接,就是一端接电池 ,一端接 电调的供电 ,另外的6Pin 接口,插在飞控的Power C 口
电源状态灯
绿灯闪:每节电池电压 4.0~4.3V
黄灯闪:每节电池电压低于 4.0V 但高于 3.7V
红灯闪:每节电池电压低于 3.5v
启动电流电压检测方法:
在 QGroundControl 的参数表设置以下参数并写入后重启
UAVCAN_ENABLE 设置为 Sensors Automatic config
UAVCAN_SUB_BAT 参数设置为Raw Date
电源模块参数设置
下面是电源模块的参数设置方法
电池估计功能使用测量的电压和电流来估计剩余的电池容量。
这很重要,因为它允许PX4在飞行器接近耗尽电力时采取行动(也可以防止过放而损坏电池)
PX4 提供了许多可用于估计容量的方法:
1.基本电池设置:原始测量电压与没电和满电电压之间的范围进行比较。这样的估计较为粗略,因为测量的电压(及其相应的容量)将在负载下产生波动。
2.负载补偿的基于电压的估计:抵消负载对电池容量计算的影响。
3.带电流积分的基于电压的估计:将带负载补偿的基于电压的剩余容量估算值与基于电流的已消耗电量估算值融合。这样的容量估计相当于智能电池的容量估计。
后面的方法建立在前面的方法之上。使用的方法将取决于机体的电源模块是否可以测量电流。
基本电池设置
基本电池设置将PX4配置为使用默认方法进行容量估算。此方法将测得的原始电池电压没电 和 满电电芯的电池电压范围进行比较(按芯数量缩放)。
由于带载下,估计电荷波动带来测得的电压发生变化,因此这种方法会得到相对粗略的估计。
配置电池1的基本参数:
首先打开 QGroundControl 并且连接飞机
通过Q图标选择 Vehicle Setup 然后 选择Power 来打开电池设置页面
其中设置页面是这样的:
Source : 如果是通过电源模块来获得电压与电流的,那么则选择 Power Module
Number of Cells(in Series) : 电池的芯数(串联),通常被称为几S的电池,一般电池上面都有写,例如3S,6S。
单个原电池的电压取决于电池的化学性质。锂聚合物(LiPo)电池和锂离子电池的标称电池电压都是3.7V。为了获得更高的电压(这将更有效地为飞机供电),多个电池串联在一起。终端的电池电压是电池电压的倍数。如果没有提供电池的电芯数量,可以通过将电池电压除以单个电池的标称电压来计算。
这里的设置对应的就是参数 BAT1_N_CELLS ,在哪里设置都可以
Full Voltage(per cell) :满电电压(单个电芯),这设置了每个电池的标称最大电压(电池被认为是“满”的最低电压)。该值应设置略低于电池的标称最大电池电压,但不能低到飞行几分钟后估计容量仍为100%。适当的值可以是 LiPo 电池 4.05 V (充电后,充满电池的电压可能会随着时间的推移而下降少量。设置一个略低于最大值的值来补偿这个下降。)
这里的设置对应的就是参数 BAT1_V_CHARGED ,在哪里设置都可以
Empty Voltage(per cell) :没电电压(单个电芯),这设置了每个电池的最小安全电压(低于此电压使用可能会损坏电池)。没有一个准确的值,可以描述电池没电电压,如果这个值设置的过低,那么过放会损坏电池,这个值设置的过高,那么会减少飞行时间。根据经验,LiPo电池在单节3.5v时 负载飞行时的最小电压,3.0v时具备负载则会毁坏电池。
这里的设置对应的就是参数 BAT1_V_EMPTY ,在哪里设置都可以
Voltage divider : 电压分压器。如果有一个通过电源模块和飞行控制器的ADC测量电压的飞行器,那么应该检查和校准每块板一次的测量值。为了校准,需要一个万用表。
如果飞机所报告的电池电压与使用电压表测量的电压读数有很大差异,那么可以调整电压乘数值来修正。点击旁边的计算,出现下面的窗口,输入用电压表测量的电压,然后点击计算就可以了。
这里的设置对应的就是参数 BAT1_V_DIV ,在哪里设置都可以
Amps per volt :安培/伏特 , 如果使用负载补偿或电流积分,则必须校准每伏特分压器的安培数。设置方法类似,用万用表测量电流,然后填入,点击计算
这里的设置对应的就是参数 BAT1_A_PER_V ,在哪里设置都可以
基于电压估计的负载补偿
通过配置好的负载补偿,用于电池容量估计的电压更加稳定,上下飞行时的变化要小得多。
负载补偿试图抵消使用基本配置时在负载下测得的电压/估算容量的波动。这可以通过估算空载电池的电压,然后使用该电压(而不是测得的电压)估算剩余电量来实现。
要使用负载补偿,您仍然需要设置基本配置。该空电压(BAT_V_EMPTY)因为已经应用了负载补偿;所以需要被设置为比正常空电压高。
PX4支持两种负载补偿方法,可通过设置以下两个参数之一来启用:
BAT1_R_INTERNAL - 基于电流的负载补偿。
这种负载补偿方法依靠电流测量来确定负载。它比基于推力的负载补偿要精确得多,但需要使用电流传感器。要启用此功能:将参数BAT1_R_INTERNAL设置为电池1的内部电阻(对于其它电池重复此操作)。LiPo充电器,可以测量电池的内部电阻。典型值为每个电池5mΩ,但这会随放电电流额定值,电池寿命和健康状况而变化。还应该在基本设置屏幕中校准每伏分压器的安培数。
BAT1_V_LOAD_DROP - 基于推力补偿。
这种负载补偿方法基于电机控制推力输出来估算负载。该方法不是特别准确,因为推力指令与电流之间存在延迟,并且推力与电流不成线性比例。要启用改功能:参数 BAT1_V_LOAD_DROP 设置为在全油门负载下电池显示的电压降.
基于电压的估计与电流积分相融合
这是测量相对电池消耗的最准确方法。如果每次启动时都使用健康,新鲜的充电电池正确设置,则估计质量将与智能电池相当(并且理论上可以进行准确的剩余飞行时间估计)。
该方法通过将可用容量的基于电压的估计值与已消耗电荷的基于电流的估计值相融合,来评估电池的剩余容量。它需要能够准确测量电流的硬件。
要启用此功能:首先使用基于电流的负载补偿建立准确的电压估算。包括校准安培每伏特分压器设置。
将参数BAT1_CAPACITY设置为电池容量的大约90%(通常印在电池标签上)
相关代码
这部分是通过UAVCAN来获得电池信息部分的代码
在 sensor_bridge.cpp 文件中
根据 UAVCAN_SUB_BAT 参数 来进行 相关信息的订阅
// battery int32_t uavcan_sub_bat = 1; param_get(param_find("UAVCAN_SUB_BAT"), &uavcan_sub_bat);
if (uavcan_sub_bat != 0) { list.add(new UavcanBatteryBridge(node)); }
在 battery.cpp 文件中,则对订阅到的信息进行了处理
电池信息的回调函数
voidUavcanBatteryBridge::battery_sub_cb(const uavcan::ReceivedDataStructure<uavcan::equipment::power::BatteryInfo> &msg)
根据得到的电池信息进行赋值
_battery_status.timestamp = hrt_absolute_time(); _battery_status.voltage_v = msg.voltage; _battery_status.voltage_filtered_v = msg.voltage; _battery_status.current_a = msg.current; _battery_status.current_filtered_a = msg.current; _battery_status.current_average_a = msg.current;
if (_batt_update_mod == BatteryDataType::Raw) { sumDischarged(_battery_status.timestamp, _battery_status.current_a); _battery_status.discharged_mah = _discharged_mah; }
_battery_status.remaining = msg.state_of_charge_pct / 100.0f; // between 0 and 1 // _battery_status.scale = msg.; // Power scaling factor, >= 1, or -1 if unknown _battery_status.temperature = msg.temperature + CONSTANTS_ABSOLUTE_NULL_CELSIUS; // Kelvin to Celsius // _battery_status.cell_count = msg.; _battery_status.connected = true; _battery_status.source = msg.status_flags & uavcan::equipment::power::BatteryInfo::STATUS_FLAG_IN_USE; // _battery_status.priority = msg.; _battery_status.capacity = msg.full_charge_capacity_wh; _battery_status.full_charge_capacity_wh = msg.full_charge_capacity_wh; _battery_status.remaining_capacity_wh = msg.remaining_capacity_wh; // _battery_status.cycle_count = msg.; _battery_status.time_remaining_s = NAN; // _battery_status.average_time_to_empty = msg.; _battery_status.serial_number = msg.model_instance_id; _battery_status.id = msg.getSrcNodeID().get();
发布相关内容
if (_batt_update_mod == BatteryDataType::Raw) { publish(msg.getSrcNodeID().get(), &_battery_status); }
https://mmbiz.qpic.cn/sz_mmbiz_jpg/ZUHCFZqSZzsB5aLJapOexn57VhuVWEs1jT95AVTQBROtLepn66KQVNl52hbp8GZ4UmOrvc3kjxCr0mpjzibiccZw/640?wx_fmt=other&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1
https://mmbiz.qpic.cn/sz_mmbiz_png/ZUHCFZqSZzsicxj35DbPAicxz5LgNbQf3qpznH9FFgaETeoxTaNvbU42ZCuQpbxiabeeTT87bacQ9icWvxScNpx98g/640?wx_fmt=other&from=appmsg&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp
https://mmbiz.qpic.cn/sz_mmbiz_jpg/ZUHCFZqSZzsSR0RUCKGibVLNDUPWWSCbBLs2R3ovcq79dMVtF4KpjVCR3UT6ibChFEXlvksdKFQhWZiaeuBYYPMSA/640?wx_fmt=other&from=appmsg&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp
https://mmbiz.qpic.cn/sz_mmbiz_jpg/ZUHCFZqSZzsSR0RUCKGibVLNDUPWWSCbB11nyprbcdAThfFaZaicbRQ4NvthSv5k3G3SFf8x7xaShGfYP4ZlUhdQ/640?wx_fmt=other&from=appmsg&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp
点击“阅读原文”查看详情
页:
[1]