欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

百分比展示电池电量

程序员文章站 2022-07-14 09:33:26
...

百分比展示电池电量

锂电池用途越来越广,但是我们只能采集到的电压数据,如何转换为百分比的电量数据呢,本文提供了一个朴素算法。

平台

硬件:Jetson-nano
软件:Ubuntu18.04
传感器:基于电阻分压原理的电压传感器, 产品链接 (https://detail.tmall.com/item.htm?id=520840133787)[https://detail.tmall.com/item.htm?id=520840133787]

采样
  1. 只运行系统,每隔十秒采集一次电压,假设此过程为均匀放电
  2. 从充满电开始运行,到电量过低停机,电压采样区间为 [8.5, 12.5]
  3. 由于 9.5-8.5 此区间只相隔 10 分钟,因此选择 9.6V 为 1% 电量
百分比模型
  1. 总放电时间约为 10 个小时
  2. 设定第 1 小时开始时的电压(12.5V)对应 100% 电量
  3. 设定第 10 小时结尾的电压(9.6V)对应 1% 的电量
  4. 第 5 小时结尾的电压为 50% 电量
  5. 以此类推,以放电时间的进度,作为电量的百分比,以此对应采样的电压值
  6. 电压取值精度为小数点后 1 位,一共 30 个不同的采样值,可以统计出不同采样值对应的采样时间
  7. 本文选取了最大的采样时间(也就是第一次出现的采样时间)作为该电压值对应的电池电量百分比
模拟
  1. 使用 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)
  1. 采样图百分比展示电池电量

  2. 选取最大值后的映射图
    百分比展示电池电量

  3. 计算结果

[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
  1. 电压到电量转换
# 电池电压对应的电量百分比,对应: 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)
后续优化方案
  1. 提高采样精度和采样频率,可以使电量显示更准确更流畅
  2. 统计时排除异常值
  3. 电压到电量转换时加入低通滤波,排除一些干扰