BetaFlight开源代码之电流校准
1. 源由
前些时间遇到两个情况:
- Ardupilot飞控如何设置BATT_AMP_PERVLT?
- 遇到一些飞控板子出现电流数据不准确的问题?
当然数据不准确一定是问题,但是导致问题的原因不同,解决方法就会不同。
因此,要解决不准确的现象,必须找到导致该现象的原因:可能是单一个因素,也可能是多种因素。
这里就有个最为简单的工程技术逻辑:如何分析root cause?
这也是工程技术人员必须具备的能力,而往往多因素工程技术分析能力是研发入门的难点,不是说技术上难,而是在思维上难。类似点、线、面(二维)、立体(三维)、时空(四维)中,定位一个点的问题。
好了,不在多说,很多或者说大部分能力是可以通过后天学习、锻炼的,当然确实有一些“第六感”很难说清楚,有人会说“天生”的。尽管我不太认同,但是确实特长往往有这种天赋异禀的神来之笔。
2. 分析
2.1 常规逻辑
先做一个常规逻辑/常用概念,老外比较喜欢说"common sense”,因为没有这个概念的人,沟通工程技术问题是很难的,因为没有"common sense"。
这个常规工程处理逻辑是这样的:
- 什么场景下,导致了不准? // 澄清并明确环境因素,操作步骤等周边信息;记录不准确现象的量化测试一手数据
- 电流数据是经过哪些途径被展现出来的? //传感采样入口–>芯片–>原始数据处理–>公式校准–>应用展示
- 结合#1/#2两点,基于知识、经验,分析出可能出现问题的因素和出现问题的途径
- 根据 2 n − 1 2^{n-1} 2n−1大致实验法则:1个因素 2 1 − 1 = 1 2^{1-1}=1 21−1=1次实验;2个因素 2 2 − 1 = 2 2^{2-1}=2 22−1=2次实验,依次类推进行对比实验
- 根据#4的实验结果,基于知识、经验得出结论;若尚无法接近rootcause则循环#3
- 若多次重复#5仍然无法获得理想效果,则需要循环#1
2.2 数据流
电源==路径1==》采样电路==路径2==》ADC==路径3==》MCU==路径4==》地面站/OSD
上述任何一个位置和路径都可能发生问题,导致电流不准。
- 电源问题,比如:测试电流源不准(设备异常)
- 路径1问题,比如:线缆压降损耗
- 采样电路问题,比如:采样芯片周边器件容抗、阻抗精度衰减
- 路径2问题,比如:信号干扰
- ADC/路径3/MCU问题,比如:代码异常
- 路径4问题,比如:协议格式不匹配
- 地面站/OSD问题:比如:代码异常
因此,各种情况都有可能发生,那么问题来了,您遇到的最有可能得是什么呢?依赖于#1提供的“环境因素,操作步骤,以及不准确现象的量化测试一手数据”。
如果,您的客户说:“我也不清楚。”
那么,恭喜您,第一步就是复现客户现象,并整理“环境因素,操作步骤,以及不准确现象的量化测试一手数据”。
2.3 采样电路
2.3.1 采样实现
【1】Current Sensing with Low-Voltage Precision Op-Amps
- Low-Side Current Sensing Implementation
- High-Side Current Sensing Implementation
A low-side, current-sensing resistor in a fast-charge
control circuit generates a small voltage drop between the
low side of the battery pack and ground. This drop is not
a problem in most cases; however, some applications,
particularly mobile communications circuits, are
intolerant of any potential difference between the low
side of the battery pack and ground. Using a few
additional components in the circuit, high-side current
sensing solves this problem and allows the charging
source, application circuit, and battery pack to share a
common ground.
2.3.2 采样原理
航模上面没有这么讲究,通常就是采用Low-Side Current Sensing Implementation,因此在低电流的时候就不太准。
主要误差来源于 R s h u n t R_{shunt} Rshunt精度,以及 R s h u n t R_{shunt} Rshunt上的 V s e n s e V_{sense} Vsense电压,对于INA138来说,需要尽量接近15mV。
To minimize error, make the shunt voltage as large as the design will allow. For the INA138 device, keep V s e n s e V_{sense} Vsense >> 15 mV.
The relative error due to input offset increases as shunt voltage decreases, so use a current sense amplifier with low offset voltage. A precision resistor for R s h u n t R_{shunt} Rshunt is necessary because R s h u n t R_{shunt} Rshunt is a major source of error.
2.3.3 Layout参考
【3】INA1x9 High-Side Measurement Current Shunt Monitor
2.3.4 INA169芯片
2.3.5 INA169 Near-Zero Vsense
【4】Using Current Sense Amplifiers at Near-Zero Vsense
1A以下电流,精度指数级降级,惨不忍睹。还好是航模,应该目前这种设计方案也无所谓。
注:如果要做无人机,这块内容需要进一步考虑。
3. 原理
- inav/betaflight/ardupilot在电流传感器方面的校准方法大致是相同的,采用的是线性拟合: y = a x + b y = ax + b y=ax+b
- betaflight内部公式: Y = ( m i l l i v o l t s ∗ 10000 / s c a l e + o f f s e t ) / 10 Y = (millivolts * 10000 / scale + offset) / 10 Y=(millivolts∗10000/scale+offset)/10
- betaflight电流计地面站界面
大部分情况下是,大家都是用的默认值,也不太操作校准,因为校准需要用硬件测试电流。
如果您确实对电流不准的问题非常在意,希望通过校准来确保显示的数据正确,那么需要准备万用表,串接到电源上,进行测试。
4. 示例
测试注意事项:
- 注意桨叶安全(不要割到手);如果要大电流校准,可以考虑桨叶反装方式(推油门,飞机紧急的贴着桌子),防止起飞,防止电机空转烧机;
- 建议测试5点数据:20%-40%-60%-80%-100%油门;
- 设置
scale=200
,offset=0
,测试5点电流数据:地面站电流数据(GSCurrent
),万用表电流数据(MeterCurrent
), Y = ( m i l l i v o l t s ∗ 10000 / s c a l e ) / 10 Y = (millivolts * 10000 / scale) / 10 Y=(millivolts∗10000/scale)/10; - 换算 Y = M e t e r C u r r e n t Y = MeterCurrent Y=MeterCurrent, X = m i l l i v o l t s = G S C u r r e n t ∗ s c a l e ( 200 ) / 1000 = G S C u r r e n t ∗ 5 X = millivolts = GSCurrent * scale(200) / 1000 = GSCurrent * 5 X=millivolts=GSCurrent∗scale(200)/1000=GSCurrent∗5
- 通过工具Linear regression calculator进行拟合;
- 计算出
scale
,offset
值,并填入betaflight地面站配置参数栏位
4.1 实测&转换数据
注:这里测试了5点,但是第一点值很小,后面我们再来说明原因。
4.2 线性拟合-小电流
4.3 线性拟合-大电流
4.4 大电流/小电流数据分析
因为之前在2.3.5章节提到了关于 INA169 Near-Zero Vsense的误差指数级递增的问题。因此在1A以下,Low-Side Current Sensing Implementation的采样原始数据不可靠,无法用于分析。
因此,大电流校准比较靠谱。
4.5 自动化计算表格
整理了一份自动化计算的表格,准确的说应该是半自动化吧。
5. 其他问题
当然,不排除硬件上的各种问题。但是前提是要进行校准,相信硬件厂商,既然卖出来就是经过检测的,应该都是没有问题的。
如果真的存在问题,大概率这些地方发生了问题:(这里只是简单做了整理,欢迎大家批注,评论,谢谢!)
- V O S V_{OS} VOS 采样电路的干扰,会导致原始数据异常;
- V O V_O VO信号在传输过程收到干扰,也会影响MCU的ADC数据采集
列举一些硬件异常的问题:
- 2019/5/9 AIKONF4 Wrong current readings when using DSHOT #8233
- 2020/1/3 Kakute F7 HDV, Tekko32 F3 Combo current sensor reading very inaccurate #9330
- 2021/11/1 GEPRC F722 35A AIO ADC current sensor value has too much jitter #11089
- 2021/1/5 Kakute F7 mini & Tekko32 F3 45A Mini - Strange current sensor reading #10449
6. 参考资料
【1】BetaFlight开源代码框架简介
【2】BetaFlight深入传感设计:传感模块设计框架
【3】BetaFlight模块设计之三:芯片温度&参考电压和电池监测模块分析
【4】BetaFlight开源代码之电压校准