文章目錄
- 前言
- 一、算法系統框架設計介紹
- 1.1:核心設計方式
- 1.2:系統架構圖
- 1.3:核心參數配置
- 二、核心算法詳解
- 2.1:硬件數據采集與濾波
- 2.2:三重算法機制
- 2.2.1:庫侖計法(電流積分)
- 2.2.2:電壓查表法(絕對校準)
- 2.3:理論計算法(異常檢測)
- 2.3.1:電池等效電路模型:
- 2.3.2:異常檢測機制:
- 2.3.3:累積偏差補償
- 三、數學模型(閉環反饋系統)
- 3.1:穩態平衡條件
- 3.2:收斂性數學證明
- 3.2.1 迭代方程
- 3.2.2:收斂條件
- 3.3:收斂場景舉例
- 3.4:數學平衡的物理意義
- 3.4.1:能量守恒
- 3.4.2:電荷守恒
- 閉環模型總結:
- 四、睡眠檢測機制
- 睡眠檢測流程:
- 4.1:睡眠狀態管理
- 進入睡眠
- 睡眠喚醒處理
- 長時間休眠喚醒檢測機制
- 五、算法特點與優勢分析
- 5.1:三重驗證機制的優勢
- 1. 高精度保證
- 2. 魯棒性設計
- 3. 工程實用性
- 5.2:算法精度分析
- 六、實際應用場景舉例
- 6.1:正常放電場景
- 6.2:充電場景
- 6.3:電流偏差場景
- 總結:
前言
在嵌入式設備中,準確的電池電量管理是用戶體驗的關鍵因素之一。傳統的單一電量估算方法往往存在精度不足、累積誤差等問題。本文將深入分析一種基于三重驗證機制的智能電池管理算法,該算法通過結合庫侖計法、電壓查表法和理論計算法,實現了高精度、高可靠性的電量管理。
電池管理算法的核心思想:不管電池實際電流電壓如何跳動,均需要呈現一個合理穩定且接近實際電量給用戶看!!!
一、算法系統框架設計介紹
1.1:核心設計方式
該電池管理算法采用混合式電量估算方法,通過以下三個維度進行電量驗證
- 庫侖計法:基于電流積分的實時電量計算
- 電壓查表法:基于電壓-電量映射的絕對校準
- 理論計算法:基于歐姆定律的異常檢測與補償
1.2:系統架構圖
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐│ 硬件數據采集 │ │ 數據濾波處理 │ │ 電量計算核心 ││ │ │ │ │ ││ ? 電壓ADC采樣 │───?│ ? 10點移動平均 │───?│ ? 三重驗證機制 ││ ? 電流ADC采樣 │ │ ? 異常值檢測 │ │ ? 偏差補償算法 ││ ? 溫度傳感器 │ │ ? 數據平滑 │ │ ? 狀態自適應 │└─────────────────┘ └─────────────────┘ └─────────────────┘│ │ │▼ ▼ ▼┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐│ NV存儲管理 │ │ 校準機制 │ │ 異常處理 ││ │ │ │ │ ││ ? 電量百分比 │ │ ? 定期校準 │ │ ? 電流偏差檢測 ││ ? 累積偏差 │ │ ? 長時間休眠 │ │ ? 備用方案 ││ ? 時間戳 │ │ ? 換電池檢測 │ │ ? 故障恢復 │└─────────────────┘ └─────────────────┘ └─────────────────┘
1.3:核心參數配置
#define MY_BAT_CAPACITY 460 // 電池容量 460mAh
#define BAT_CAPACITY_EQUAL_DIVISION 1.1 // 電池容量等分系數
#define BAT_IR 0.5 // 系統等效內阻 0.5Ω
#define BAT_IR_WT 1.5 // 電池內阻加權系數
#define BAT_MIN_CURRENT 1.25 // 休眠時電流 1.25mA
#define SAMPLE_SIZE 10 // 采樣緩沖區大小
說明:
- 電池各項參數由供應商提供
- 確定各項參數需要均衡選擇
- 休眠電流一般配置比實際大,以免實際電量耗盡死機 比 計算電量0%關機要提前。
二、核心算法詳解
2.1:硬件數據采集與濾波
數據采集:
// 定時器回調函數 (1秒周期)
static void cpus_pmu_timer_callback(void *priv)
{// 硬件ADC采樣pmu_manager_attr.vol_sampling = HAL_pmu_bat_volt_get(); // 電壓采樣pmu_manager_attr.cur_sampling = cpus_pmu_cur_get(); // 電流采樣// 數據濾波處理pmu_voltage_smooth(&pmu_manager_attr); // 電壓濾波pmu_current_smooth(&pmu_manager_attr); // 電流濾波// 電量計算pmu_percent_deal(&pmu_manager_attr); // 核心算法
}
移動平均濾波
// 10點移動平均濾波,有效抑制噪聲
uint16_t pmu_voltage_smooth(pmu_manager_attr_t *pmup)
{// 異常值檢測if((pmup->vol_sampling <= VOL_LOW_LIMIT) || (VOL_HIGH_LIMIT <= pmup->vol_sampling))return pmup->vol_buff_average;// 循環緩沖區更新pmup->vol_buff[pmup->vol_buff_i] = pmup->vol_sampling;pmup->vol_buff_i = (pmup->vol_buff_i + 1) % SAMPLE_SIZE;// 計算平均值uint32_t sum = 0;for(int i = 0; i < SAMPLE_SIZE; i++) {sum += pmup->vol_buff[i];}pmup->vol_buff_average = sum / SAMPLE_SIZE;return pmup->vol_buff_average;
}
2.2:三重算法機制
2.2.1:庫侖計法(電流積分)
if (cur_cal < cur - 5 || cur_cal > cur + 5) {Debug_printf(DISP_KEY_PMU, "電流偏差過大,cur_cal = %d, cur = %d, 播放音樂 = %d\r\n", cur_cal, cur, HAL_gpio_value_get(PIN_B16));cur = cur_cal;}diff_per =(float)diff_time * -cur / 36000 / MY_BAT_CAPACITY * BAT_CAPACITY_EQUAL_DIVISION;if (diff_per < 0) {diff_per = 0;}
}
// 公式分解:
// diff_time: 時間差(秒)
// -cur: 放電電流為負值
// 36000: 3600秒/小時 × 10(單位轉換)
// MY_BAT_CAPACITY: 電池容量460mAh
// BAT_CAPACITY_EQUAL_DIVISION: 容量等分系數1.1
說明:
- 實時性好,響應速度快
- 能準確反映瞬時電量變化
- 適合動態負載場景
- 存在累積誤差問題
2.2.2:電壓查表法(絕對校準)
// 電壓-電量映射表
#define BAT_LEVEL_10PERCENT_VOLT 3725 // 0-9%
#define BAT_LEVEL_20PERCENT_VOLT 3758 // 10-19%
#define BAT_LEVEL_30PERCENT_VOLT 3781 // 20-29%
// ... 更多閾值點// 電壓到電量百分比轉換
uint8_t pmu_v2p(uint16_t vol)
{if (vol >= BAT_LEVEL_100PERCENT_VOLT) return 100;if (vol >= BAT_LEVEL_90PERCENT_VOLT) return 90;// ... 查表邏輯
}
分段線性插值算法:
uint8_t pmu_v2p(uint16_t volt)
{// 1. 查找電壓所在的區間for (i = 0; i < CV_TABLE_LEN; i++) {if (volt <= coulomp_voltage_table[i])break;}// 2. 線性插值計算percent = (float)(BAT_QUANTITY_STEP_PERCENT * i) + (float)(volt - base) / step;return (uint8_t)percent;
}
算法特點:
- 絕對精度高,無累積誤差
- 適合靜態或準靜態場景
- 可作為其他方法的校準基準
- 受溫度影響較大
2.3:理論計算法(異常檢測)
2.3.1:電池等效電路模型:
┌─────────┐ ┌─────────┐│ OCV │────│ R_int │──── 負載│(開路電壓)│ │ (內阻) │└─────────┘ └─────────┘
// 基于歐姆定律的理論電流計算
int32_t vout_to_iout(uint16_t vout, uint16_t v_base)
{int32_t x = vout - v_base; // 電壓差if (pmu_manager_attr.vbus_status && pmu_manager_attr.charge_status) {// 充電狀態:使用加權內阻i = (int32_t)((x) / (BAT_IR * BAT_IR_WT));} else {// 放電狀態:使用標準內阻i = (int32_t)((x) / (BAT_IR));}return i;
}
說明:
- 物理原理:電池等效為理想電壓源串聯內阻
- 根據歐姆定律:
I = (V_ocv - V_load) / R_internal
- 通過理論電流與實際電流對比,檢測異常
2.3.2:異常檢測機制:
// 電流偏差檢測
cur_cal = vout_to_iout(pmup->vol_buff_average, pmu_p2v(pmup->percent));
if (cur_cal < cur - 5 || cur_cal > cur + 5) {Debug_printf(DISP_KEY_PMU, "電流偏差過大,cur_cal = %d, cur = %d\r\n", cur_cal, cur);cur = cur_cal; // 使用理論電流替代測量電流
}
2.3.3:累積偏差補償
// 累積偏差雙向補償機制
if (pmup->de_accumulation < -0.1) {pmup->percent += 1; // 電量增加1%pmup->de_accumulation += 0.1;
} else if (pmup->de_accumulation > 0.1) {pmup->percent -= 1; // 電量減少1%pmup->de_accumulation -= 0.1;
}
補償機制優勢:
- 智能消耗:優先消耗相反方向的累積偏差
- 精度提升:避免測量誤差的長期累積
- 雙向平衡:充電和放電分別累積,相互補償
三、數學模型(閉環反饋系統)
3.1:穩態平衡條件
當系統達到穩態時,必須滿足以下平衡條件:
條件1:電流平衡
實際測量電流 ≈ 理論計算電流
即:|I_measured - I_calculated| ≤ 5mA
條件2:電壓平衡
實際測量電壓 ≈ 理論計算電壓
即:V_measured ≈ V_theoretical = pmu_p2v(percent)
條件3:累積偏差平衡
充電累積偏差 ≈ 放電累積偏差
即:in_accumulation ≈ de_accumulation
3.2:收斂性數學證明
3.2.1 迭代方程
設第n次迭代:
- 實際電流:I_n
- 理論電流:I_cal_n
- 電量百分比:P_n
- 實際電壓:V_n
- 理論電壓:V_cal_n
迭代關系:
P_{n+1} = P_n + ΔP_n (基于I_cal_n計算)
V_cal_{n+1} = pmu_p2v(P_{n+1})
I_cal_{n+1} = vout_to_iout(V_n, V_cal_{n+1})
3.2.2:收斂條件
收斂條件:當 |I_cal_{n+1} - I_n| ≈ 0mA (足夠小)時,系統達到穩態
收斂速度:取決于以下因素:
內阻精度:BAT_IR的準確性
電壓表精度:coulomp_voltage_table的準確性
采樣精度:ADC測量精度
負載穩定性:外部負載變化
3.3:收斂場景舉例
場景:
- 電流傳感器突然出現偏差或更換電池
- 與上一塊電池斷電時記錄的電壓相差較大
初始狀態:
- 實際電流:100mA
- 理論電流:100mA
- 電量:50%
- 實際電壓:3800mV
- 理論電壓:3859mV第1次迭代(電流傳感器偏差+20mA):
- 實際電流:120mA (傳感器偏差)
- 理論電流:100mA
- 偏差:|120-100| = 20mA > 5mA
- 系統使用理論電流:100mA
- 電量更新:基于100mA計算第2次迭代:
- 實際電流:120mA (傳感器仍有偏差)
- 理論電流:基于新電量重新計算
- 如果新理論電流接近120mA,則偏差減小第N次迭代:
- 實際電流:120mA
- 理論電流:≈120mA
- 偏差:|120-120| = 0mA < 5mA
- 系統達到穩態
3.4:數學平衡的物理意義
3.4.1:能量守恒
累積偏差平衡:
充電累積 = 放電累積
∫I_charge dt ≈ ∫I_discharge dt
3.4.2:電荷守恒
累積偏差平衡:
充電累積 = 放電累積
∫I_charge dt ≈ ∫I_discharge dt
閉環模型總結:
這個電池管理系統是一個閉環反饋系統:
收斂機制:即使初始電流偏差很大,通過多次迭代反饋,系統會逐漸調整電量百分比,使得理論電流接近實際電流,最終達到穩態平衡。
四、睡眠檢測機制
睡眠檢測流程:
系統進入睡眠↓
硬件睡眠檢測 (RTC狀態)↓
軟件睡眠檢測 (timer_status)↓
執行 drv_pmu_suspend()├── 關閉ADC└── 記錄睡眠時間↓
系統喚醒↓
執行 drv_pmu_resume()├── 啟用ADC├── 計算睡眠時間├── 計算理論電量消耗└── 判斷是否需要喚醒↓
執行 timer_long_time_not_active()├── 判斷休眠時間│ ├── <24小時:理論計算模式│ └── >24小時:重新校準模式├── 更新電量百分比└── 發送電量變化事件
4.1:睡眠狀態管理
進入睡眠
static int drv_pmu_suspend(struct cdev *dev)
{HAL_pmu_adc_enable(false); // 關閉ADC以節省功耗return 0;
}
睡眠喚醒處理
static int drv_pmu_resume(struct cdev *dev)
{uint32_t diff_time = (uint32_t)(HAL_get_timestamp()/1000 - pmu_manager_attr.update_time);float diff_per = 0;HAL_pmu_adc_enable(true); // 重新啟用ADC// 計算睡眠期間的電量消耗diff_per = (float)diff_time * BAT_MIN_CURRENT / 36000 / MY_BAT_CAPACITY * BAT_CAPACITY_EQUAL_DIVISION;// 判斷是否掉電累計1%。若是:喚醒系統進行電量更新if (diff_per + pmu_manager_attr.de_accumulation - pmu_manager_attr.in_accumulation > 1) {cpus_OAL_timer_activate(&pmu_manager_attr.pmu_suspend_timer, cpus_OAL_TIMER_AUTO_ACTIVATE);}return 0;
}
長時間休眠喚醒檢測機制
void timer_long_time_not_active(void)
{uint32_t diff_time = (uint32_t)(HAL_get_timestamp()/1000 - pmu_manager_attr.update_time);float diff_per = 0;uint8_t old_percent = pmu_manager_attr.percent;static uint32_t last_mode = 0;pmu_manager_attr.update_time += diff_time;Debug_printf(DISP_KEY_PMU, "pmu_timer_activate = %d\r\n", diff_time);if (diff_time < 1000*60*60*24) { // 小于24小時// 使用理論計算進行電量更新theoretical_calculation_mode();} else { // 大于24小時// 重新采樣校準recalibration_mode();}
}
五、算法特點與優勢分析
5.1:三重驗證機制的優勢
1. 高精度保證
- 庫侖計法:提供實時動態響應
- 電壓查表法:提供絕對精度校準
- 理論計算法:提供異常檢測和補償
2. 魯棒性設計
- 多重異常檢測:電流偏差、電壓范圍、累積誤差
- 狀態感知處理:充電/放電狀態自適應
- 故障恢復機制:長時間休眠自動校準
3. 工程實用性
- 系統等效內阻:包含電池+PMU+PCB+連接器總內阻
- 實際測量點:基于硬件ADC測量位置設計
- 狀態相關參數:充電/放電使用不同內阻值
5.2:算法精度分析
數據類型 | 獲取方式 | 精度 | 響應時間 | 用途 |
---|---|---|---|---|
實際電壓 | ADC采樣 | 硬件精度 | 實時 | 主要測量數據 |
實際電流 | ADC采樣 | 硬件精度 | 實時 | 主要測量數據 |
理論電壓 | 查表計算 | 1% | 計算時間 | 參考基準 |
理論電流 | 歐姆定律 | 依賴內阻模型 | 計算時間 | 偏差檢測 |
計算電壓 | 反向計算 | 依賴電流精度 | 計算時間 | 校準驗證 |
六、實際應用場景舉例
6.1:正常放電場景
當前電量: 50%
理論開路電壓: 3859mV (pmu_p2v(50))
實際端電壓: 3800mV (ADC測量)
系統等效內阻: 0.5Ω
理論電流 = (3800 - 3859) / 0.5 = -118mA (放電)
電量變化量 = 1秒 × (-118mA) / 36000 / 460mAh × 1.1 = -0.008%
6.2:充電場景
當前電量: 50%
理論開路電壓: 3859mV
實際端電壓: 3900mV (充電器提供)
系統等效內阻: 0.75Ω (充電時加權)
理論電流 = (3900 - 3859) / 0.75 = 55mA (充電)
電量變化量 = 1秒 × 55mA / 36000 / 460mAh × 1.1 = 0.004%
6.3:電流偏差場景
實際測量電流: 120mA
理論計算電流: 118mA
偏差: |120 - 118| = 2mA < 5mA (正常范圍)
實際測量電流: 150mA
理論計算電流: 118mA
偏差: |150 - 118| = 32mA > 5mA (異常)
處理: 使用理論電流118mA進行電量計算
特別說明:
- 即計算電流差過大,但最后會恢復到差距較小的穩態(變閉環)
總結:
本文深入分析了一種基于三重驗證機制的智能電池(BMS)管理算法,這種算法設計在嵌入式系統中是一個相對完善的電池電量管理方案,平衡了精度、實時性和計算復雜度,為類似應用提供了有價值的參考,其核心在于:
- 過濾電壓、電流跳動等情況
- 為用戶提供穩定可觀的電量變化情況
- 閉環算法使得計算電量靠近實際電量
- 將電壓分為110份,避免電池低電而計算電量未到0就關機的情況
- 睡眠時自動進行校準