百分比展示电池电量
锂电池用途越来越广,但是我们只能采集到的电压数据,如何转换为百分比的电量数据呢,本文提供了一个朴素算法。
平台
硬件:Jetson-nano
软件:Ubuntu18.04
传感器:基于电阻分压原理的电压传感器, 产品链接 (https://detail.tmall.com/item.htm?id=520840133787)[https://detail.tmall.com/item.htm?id=520840133787]
采样
- 只运行系统,每隔十秒采集一次电压,假设此过程为均匀放电
- 从充满电开始运行,到电量过低停机,电压采样区间为 [8.5, 12.5]
- 由于 9.5-8.5 此区间只相隔 10 分钟,因此选择 9.6V 为 1% 电量
百分比模型
- 总放电时间约为 10 个小时
- 设定第 1 小时开始时的电压(12.5V)对应 100% 电量
- 设定第 10 小时结尾的电压(9.6V)对应 1% 的电量
- 第 5 小时结尾的电压为 50% 电量
- 以此类推,以放电时间的进度,作为电量的百分比,以此对应采样的电压值
- 电压取值精度为小数点后 1 位,一共 30 个不同的采样值,可以统计出不同采样值对应的采样时间
- 本文选取了最大的采样时间(也就是第一次出现的采样时间)作为该电压值对应的电池电量百分比
模拟
- 使用 Matlab 查看电压与放电进度的关系
close all;clear;clc
% 载入数据
x = load('data/battery.txt');
x = x(1:3850)';
% 建立比例关系
y = [1:-1/3850:1/3850];
% 统计
data = [10 * (x - 9.5); y]';
data_sum = zeros(30, 1);
data_count = zeros(30, 1);
data_min = zeros(30, 1);
for i = 1:size(x,2)
idx = round(data(i,1));
data_sum(idx) = data_sum(idx) + data(i,2);
data_max(idx) = max([data_min(idx) data(i,2)])
data_count(idx) = data_count(idx) + 1;
end
data_avg = data_sum ./ data_count;
% 按平均值计算
pct = round(100*data_avg)
% 按最大值计算
pct_max = round(100*data_max)
% 拟合效果
figure(1)
plot(x, y)
figure(2)
m = [9.6:0.1:12.5];
plot(m, pct_max)
-
采样图
-
选取最大值后的映射图
-
计算结果
[9.6-10.5]: 1, 1, 2, 4, 8, 11, 16, 19, 27, 34,
[10.6-11.5]: 45, 52, 55, 58, 62, 64, 68, 71, 76, 78,
[11.6-12.5]: 81, 84, 87, 92, 93, 98, 99, 100, 100, 100
- 电压到电量转换
# 电池电压对应的电量百分比,对应: 9.6V-12.5V
battery_pct = (1, 1, 2, 4, 8, 11, 16, 19, 27, 34, 45, 52, 55, 58, 62, 64, 68, 71,
76, 78, 81, 84, 87, 92, 93, 98, 99, 100, 100, 100)
last_bat = 125
while alive:
# 电压转换为百分比
bat = round(get_battery())
if bat == 0:
continue
if bat < 96:
bat = 96
elif bat > 125:
bat = 125
if last_bat + 5> bat > last_bat:
bat = last_bat
else:
last_bat = bat
pct = battery_pct[bat - 96]
batstr = '%d%%' % pct
time.sleep(10)
后续优化方案
- 提高采样精度和采样频率,可以使电量显示更准确更流畅
- 统计时排除异常值
- 电压到电量转换时加入低通滤波,排除一些干扰