1. 源由
既然复杂的BetaFlight开源代码之电流校准都过了一遍,电压相对来说是比较简单的,一起过一下
2. 分析数据流
电源==路径1==》采样电路==路径2==》ADC==路径3==》MCU==路径4==》地面站/OSD
上述任何一个位置和路径都可能发生问题,导致电压不准。
- 电源问题,比如:测试电压源不准(设备异常)
- 路径1问题
- 采样电路问题,比如:采样芯片周边器件阻抗精度衰减
- 路径2问题,比如:信号干扰
- ADC/路径3/MCU问题,比如:代码异常
- 路径4问题,比如:协议格式不匹配
- 地面站/OSD问题:比如:代码异常
3. 采样电路
VBAT_ADC直接接MCU引脚进行ADC转换形成12bit ADC数据,供后续算法处理。
3. 原理
- inav/betaflight/ardupilot在电压传感器方面的校准方法大致是相同的,采用的是线性拟合: y = a x + b y = ax + b y=ax+b
- betaflight内部公式:
Y
=
(
(
s
r
c
∗
s
c
a
l
e
∗
g
e
t
V
r
e
f
M
v
(
)
/
10
+
(
0
x
F
F
F
∗
5
)
)
/
(
0
x
F
F
F
∗
d
i
v
i
d
e
r
)
)
/
m
u
l
t
i
p
l
i
e
r
Y = ((src *scale * getVrefMv() / 10 + (0xFFF * 5)) / (0xFFF * divider)) / multiplier
Y=((src∗scale∗getVrefMv()/10+(0xFFF∗5))/(0xFFF∗divider))/multiplier
注:STM32在计算时,运用了一些整形变换,使得上述运算不用到浮点指令,减少MCU的工作量。 - betaflight电压计地面站界面
基于上面的电路,大家确实不需要调整太多,只要硬件厂商采用上述10:1的分压电路进行设计。如果您希望自己校准,也未尝不可,校准需要用硬件测试电压。
4. 示例
测试注意事项:
- 建议测试2点以上数据:3S(12.6)、4S(16.8)等等
- 设置
scale=110
,divider=10
,multiplier=1
测试多点电压数据:地面站电压数据(GSVlotage
),万用表电压数据(MeterVoltage
); - 当
multiplier=1
时,计算就比较简单。
A = s c a l e / ( 10 ∗ m u l t i p l i e r ∗ ( 4095 + d i v i d e r ) ) A=scale/(10*multiplier*(4095+divider)) A=scale/(10∗multiplier∗(4095+divider))
B = ( 4095 ∗ 5 ) / ( m u l t i p l i e r ∗ ( 4095 + d i v i d e r ) ) B=(4095*5)/(multiplier*(4095+divider)) B=(4095∗5)/(multiplier∗(4095+divider)) - 通过工具Linear regression calculator进行拟合;
- 计算出
scale
,divider
值,并填入betaflight地面站配置参数栏位
5. 实测&转换数据
这里就懒惰了点,数据量比较少,所以感觉不出拟合的效果,感兴趣的朋友可以多做几个数据点。
6. 参考资料
【1】BetaFlight开源代码框架简介
【2】BetaFlight深入传感设计:传感模块设计框架
【3】BetaFlight开源代码之电流校准
【4】BetaFlight模块设计之三:芯片温度&参考电压和电池监测模块分析