任务1的内容比较明确,所以大家的测评都很类似。而这里我想利用任务一的内容实现小小的功能:测量干电池电压,显示到屏幕上;推测电量, 并显示到屏幕左上角的电池图标 。增加任务趣味,实用性。

一、硬件设计
-
电路连接 :
干电池正极
分压电路
干电池负极
- 设计原因 :干电池电压(1.6V满电),在RA4L1的ADC量程(0-3.3V)内
二、软件实现(基于keil和FSP库)
#include "hal_data.h"
#define BATTERY_FULL_V 1.5f
#define BATTERY_EMPTY_V 0.9f
#define ADC_REF_V 3.3f
#define ADC_RESOLUTION 4095.0f
void adc_init(void) {
R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
R_ADC_ScanStart(&g_adc0_ctrl);
}
float read_battery_voltage(void) {
adc_channel_t channel = ADC_CHANNEL_0;
uint16_t adc_value;
R_ADC_Read(&g_adc0_ctrl, channel, &adc_value);
return (adc_value / ADC_RESOLUTION) * ADC_REF_V;
}
uint8_t estimate_soc(float voltage) {
if (voltage >= BATTERY_FULL_V) return 100;
if (voltage <= BATTERY_EMPTY_V) return 0;
float soc = 100.0f * (voltage - BATTERY_EMPTY_V)
/ (BATTERY_FULL_V - BATTERY_EMPTY_V);
return (uint8_t)soc;
}
int main(void) {
adc_init();
while (1) {
float v_bat = read_battery_voltage();
uint8_t soc = estimate_soc(v_bat);
printf("Voltage: %.2fV, SOC: %d%%\\\\\\\\n", v_bat * 2, soc);
R_BSP_SoftwareDelay(5000, BSP_DELAY_UNITS_MILLISECONDS);
}
}
三、关键优化措施
- ADC精度提升 :
- 在
adc0_cfg中配置:
.clock_source = ADC_CLOCK_SOURCE_ADCLK,
.resolution = ADC_RESOLUTION_12_BIT,
.alignment = ADC_ALIGNMENT_RIGHT,
.trigger = ADC_TRIGGER_SOFTWARE
- 启用均值滤波(在扫描配置中设置
add_average_count = 16)
- 非线性校准 (针对碱性电池放电曲线):
uint8_t improved_estimate_soc(float voltage) {
const float points[] = {
1.80f, 0.0f,
2.00f, 10.0f,
2.20f, 25.0f,
2.40f, 50.0f,
2.60f, 75.0f,
2.90f, 95.0f,
3.00f, 100.0f
};
for (int i = 0; i < 6; i++) {
if (voltage < points[(i+1)*2]) {
float v_low = points[i*2];
float v_high = points[(i+1)*2];
float soc_low = points[i*2+1];
float soc_high = points[(i+1)*2+1];
return soc_low + (soc_high - soc_low)
* (voltage - v_low) / (v_high - v_low);
}
}
return 100;
}
四、系统工作流程
Battery: 静置15分钟后测量
Battery->>ADC: 电压信号
ADC->>MCU: 数字采样值
MCU->>MCU: 转换为实际电压
MCU->>MCU: 计算SOC(分段插值)
MCU->>Output: 发送电压/SOC数据
五、注意事项
- 测量条件 :
- 断开负载静置15分钟再测量(消除极化效应)
- 环境温度补偿(温度每变化10℃,电压读数修正±0.02V)
- 误差来源 :
- ADC参考电压波动(可启用内部参考电压)
- 电池个体差异(建议对每批电池抽样测试)
- 功耗控制 :
- 采样间隔≥1秒(降低ADC功耗)
- 分压电阻≥100kΩ(减小电流至15μA)
- 两次采样间关闭ADC电源
实测数据示例 (使用惠寻碳性5号电池):
| 真实电压 |
测量电压 |
估算SOC |
|---|
| 1.55V |
1.54V |
100% |
| 1.30V |
1.29V |
58% |
| 1.10V |
1.09V |
15% |
| 0.95V |
0.94V |
0% |
建议根据实际电池型号,温度,通过放电实验校准电压-SOC对应表,可提升精度至±5%以内。
|