尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

电池电压温度采集

电池电压温度采集 调试目标解决电池电压读数漂移问题校准电压读数验证 NTC 温度采集功能硬件环境主控芯片STM32L431RCT6ADC 参考电压REF3025E2.5V 外部参考电池电压分压电路两个 10kΩ 电阻串联分压比 2:1NTC 温度传感器10kΩ NTCB3950 10kΩ 上拉电阻电源控制PC7 高电平开启电池采样通路一、问题现象1.1 原始代码现象运行原始 ADC 代码多通道扫描模式串口输出text[000012] Battery: 3.58 V | Temperature: 25.0 °C [000013] Battery: 3.59 V | Temperature: 25.0 °C [000014] Battery: 3.60 V | Temperature: 25.0 °C [000015] Battery: 3.61 V | Temperature: 25.0 °C ...问题电池电压在几分钟内从 3.58V 持续上涨到 3.61V0.03V万用表测量实际电池电压为 3.50V恒定的温度始终显示 25.0°C用手触摸 NTC 无变化1.2 偏差定量分析时间点代码输出万用表实测偏差趋势起始3.58V3.50V0.08V—1分钟后3.59V3.50V0.09V↑2分钟后3.60V3.50V0.10V↑3分钟后3.61V3.50V0.11V↑结论存在固定偏差 持续漂移二、原因分析2.1 原始代码 vs 新代码对比配置项原始代码有问题新代码稳定影响ADC 时钟ASYNC_DIV1SYNC_PCLK_DIV4异步时钟不稳定扫描模式ENABLE2通道DISABLE1通道通道间串扰通道配置Rank1PA0(温度), Rank2PA1(电池)只有 Rank1PA1(电池)消除相互影响PC7 控制每次采集时开关未控制可能常开采集稳定2.2 根本原因多通道扫描模式ADC 在两个通道间切换产生通道间串扰导致读数不稳定异步时钟ASYNC_DIV1时钟源不稳定导致 ADC 转换结果漂移温度通道干扰NTC 通道PA0未正确连接其悬空状态影响了电池通道PA1的读数三、解决方案3.1 CubeMX 配置修改将 ADC1 配置从多通道扫描模式改为单通道模式配置项修改前修改后Clock PrescalerASYNC_DIV1SYNC_PCLK_DIV4Scan ConversionENABLEDISABLENumber of Conversion21通道配置Rank1IN5, Rank2IN6只有 Rank1IN63.2 软件校准在ADC_Get_Battery_Voltage函数中添加固定偏移校准cfloat ADC_Get_Battery_Voltage(ADC_HandleTypeDef *hadc) { uint16_t adc_value ADC_Read_Single(hadc); float adc_voltage (adc_value / 4095.0f) * 2.5f; float battery adc_voltage * 2.0f; // 软件校准减去 0.08V 固定偏差 battery - 0.08f; return battery; }四、验证结果4.1 电压读数稳定修改后串口输出text[000012] Battery: 3.50 V | Temperature: 25.0 °C [000013] Battery: 3.50 V | Temperature: 25.0 °C [000014] Battery: 3.50 V | Temperature: 25.0 °C [000015] Battery: 3.50 V | Temperature: 25.0 °C ... [000086] Battery: 3.51 V | Temperature: 25.0 °C [000087] Battery: 3.50 V | Temperature: 25.0 °C指标修改前修改后平均值3.58-3.61V3.50-3.51V稳定性持续漂移±0.01V 稳定与万用表偏差0.08~0.11V0V校准后✅ 电压读数已稳定与万用表一致4.2 温度验证用手触摸 NTC 热敏电阻操作温度变化结论室温25.0°C基准手捏 NTC上升至 28-30°C✅ 正常响应松开回落至 25°C✅ 正常恢复✅ 温度采集功能正常五、关键代码变更5.1adc.h中的宏定义c#define ADC_MAX_VALUE 4095.0f #define ADC_VREF 2.5f // REF3025E 输出 2.5V #define ADC_VOLTAGE_DIVIDER_RATIO 2.0f // 分压比 (R1R210k) #define ADC_VOLTAGE_OFFSET -0.08f // 软件校准偏移5.2adc.c中的核心函数cfloat ADC_Get_Battery_Voltage(ADC_HandleTypeDef *hadc) { uint16_t adc_value ADC_Read_Single(hadc); float adc_voltage (adc_value / ADC_MAX_VALUE) * ADC_VREF; float battery adc_voltage * ADC_VOLTAGE_DIVIDER_RATIO; battery ADC_VOLTAGE_OFFSET; // 软件校准 return battery; }cvoid ADC_Get_All(ADC_HandleTypeDef *hadc, float *p_battery, float *p_temperature) { // 打开电池分压电路 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET); HAL_Delay(10); *p_battery ADC_Get_Battery_Voltage(hadc); *p_temperature ADC_Get_Temperature(hadc, *p_battery); // 关闭电池分压电路省电 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET); }六、经验总结问题原因解决方案电压漂移多通道扫描 异步时钟改用单通道 同步时钟读数偏高分压电阻精度或 ADC 偏移软件固定偏移校准温度无变化多通道间干扰分离电压和温度采集通道后续建议温度采集单独使用一个 ADC 通道不与电池电压共用扫描模式如需同时采集多个信号使用 DMA 软件滤波提高稳定性正式产品建议在分压电阻上并联 100nF 电容提高 ADC 采样稳定性
返回列表