电量曲线的拟合算法

实际应用中会遇到电池电量显示的问题,可以用单片机的adc模块采样电池的电压,然后输出,普通的做法是将采样的电压如下计算得到电量百分比输出

    static uint8_t cal_percentage(void)
    {
        uint8_t percentage;
        percentage = get_adc_value / rated_voltage;
        return percentage;
    }

将得到的数值加上百分号显示出来,就可以了。
但是在实际应用过程中,有些单片机的供电电压,不等过低,电压过低就不能正常工作,相当于在电池电压在降到工作能正常工作的电压的最低值是就要给用户报警信息,此时电量显示用改为0%较为合理。
这样的话在实际运用过程中需要实际设计电量曲线,根据不同产品的需求可以设定不同的电量曲线,下面简说下,用到的简单的电量曲线的设计。
设计电量曲线的时候可以根据不同需求设置不同的掉电电量的下降的速度,可以分块来设计,相当于用折线来拟合曲线,如下设计电量和对应的百分比值。

    static const float Set_Voltage[] =
    {
        Voltage_Table1,Voltage_Table2,
        Voltage_Table3, Voltage_Table4,
        ...
    };
    static const uint8_t Set_Percentage[] =
    {
        Percentage_Table1, Percentage_Table2,
        Percentage_Table3, Percentage_Table4,
        ...
    };

可以看到使用的分段计算的段越多,这样拟合出来的曲线越平滑,可以根据实际的产品设计要求来实现。
对电压和相应的电量百分比分段后就可以就算得到的get_adc_value在一个小的百分比段内的百分比,再加上偏移值就可以就算出实际需要的百分比。
假设现在的电压get_adc_value在Voltage_Table1和Voltage_Table2之间,那么实际需要的电量百分比则为:

[(get_adc_value - Voltage_Table2)/(Voltage_Table1 - Voltage_Table2)] *  (Percentage_Table1 - Percentage_Table2) + Percentage_Table2

程序代码如下:

    static uint8_t cal_percentage(uint16_t adc_value)
    {
        uint8_t length = (sizeof(Set_Voltage)/sizeof(Set_Voltage[0]))
        uint8_t i  = 0;
        for(i = 0; i< length ; ++i) {

            if(adc_value >= Set_Voltage[i]) {
                break;
            }
        }

    if( i>= length) {
        return 0;
    }

    if(i == 0) {
        return 100;
    }

    return (adc_value - Set_Voltage[i])/((Set_Voltage[i-1] - Set_Voltage[i])/(Set_Percentage[i-1] - Set_Percentage[i])) + Set_Percentage[i];

}
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

002237

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值