问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

高精度ADC,OLED实时显示:STM32打造专业级锂电池电压监测

创作时间:
作者:
@小白创作中心

高精度ADC,OLED实时显示:STM32打造专业级锂电池电压监测

引用
CSDN
1.
https://blog.csdn.net/qq_40431685/article/details/140033351

锂电池作为一种高效的可充电能源,广泛应用于各种便携式电子设备和电动交通工具中。准确监测锂电池电压对于确保电池安全运行、延长电池寿命至关重要。本文将介绍一种基于STM32微控制器的锂电池电压监测系统设计方案,并提供详细的电路图、代码示例和调试步骤,帮助读者快速掌握锂电池电压监测技术。

系统概述

本系统以STM32F103C8T6微控制器为核心,采用分压电路将锂电池电压调整至ADC可测量范围,通过STM32内置的ADC模块采集电压信号,并进行数字滤波处理,最后将测量结果显示在OLED屏幕上。

系统功能:

  • 实时监测锂电池电压
  • 电池电压过压、欠压报警
  • 电池电量百分比显示
  • OLED屏幕显示

系统框图:

硬件设计

2.1 电路原理图

以下是系统电路原理图:

2.2 元器件选择

元器件
描述
STM32F103C8T6
微控制器
锂电池
3.7V 锂离子电池
OLED显示屏
0.96寸 I2C OLED显示屏
电阻R1, R2
分压电阻,阻值根据电池电压和ADC量程选择
LED
报警指示灯

2.3 电路工作原理

  • 分压电路: 由电阻R1和R2组成,将锂电池电压分压后送至STM32的ADC输入引脚PA0。
  • ADC采集: STM32内置的ADC模块将模拟电压信号转换为数字信号。
  • 电压转换: 通过ADC采集到的数字信号,根据分压比例计算出实际电池电压。
  • OLED显示: 将测量得到的电池电压、电量百分比等信息显示在OLED屏幕上。
  • 报警功能: 当电池电压过高或过低时,点亮LED指示灯进行报警。

软件设计

3.1 ADC初始化

void ADC_Init(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  // 使能ADC1和GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

  // 配置PA0为模拟输入模式
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 配置ADC参数
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  // 校准ADC
  ADC_Cmd(ADC1, ENABLE);
  ADC_ResetCalibration(ADC1);
  while(ADC_GetResetCalibrationStatus(ADC1));
  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));

  // 使能ADC1
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

3.2 电压采集与转换

float Get_Battery_Voltage(void)
{
  uint16_t ADC_Value;
  // 读取ADC转换结果
  ADC_Value = ADC_GetConversionValue(ADC1);

  // 将ADC值转换为电压值
  // 注意:这里需要根据实际分压比例进行计算
  float Voltage = ADC_Value * (3.3 / 4096) * (R1 + R2) / R2;

  return Voltage;
}

3.3 OLED显示

void OLED_Display(float voltage)
{
  char str[20];

  // 清屏
  OLED_Clear();

  // 显示电压值
  sprintf(str, "Voltage: %.2fV", voltage);
  OLED_ShowString(0, 0, str, 1);

  // 显示电量百分比
  // 注意:这里需要根据电池电压和放电曲线计算电量百分比
  uint8_t percent = (voltage - 3.0) / (4.2 - 3.0) * 100;
  if (percent > 100) percent = 100;
  sprintf(str, "SOC: %d%%", percent);
  OLED_ShowString(0, 16, str, 1);

  // 刷新屏幕
  OLED_Refresh_Gram();
}

3.4 报警功能

void Alarm_Check(float voltage)
{
  if (voltage > 4.2)
  {
    // 电压过高,点亮LED报警
    GPIO_SetBits(GPIOB, GPIO_Pin_1);
  }
  else if (voltage < 3.0)
  {
    // 电压过低,点亮LED报警
    GPIO_SetBits(GPIOB, GPIO_Pin_1);
  }
  else
  {
    // 电压正常,熄灭LED
    GPIO_ResetBits(GPIOB, GPIO_Pin_1);
  }
}

3.5 主函数

int main(void)
{
  // 初始化时钟、GPIO、ADC、OLED等外设
  System_Init();

  while (1)
  {
    // 获取电池电压
    float batteryVoltage = Get_Battery_Voltage();

    // OLED显示电压值和电量百分比
    OLED_Display(batteryVoltage);

    // 电压报警检测
    Alarm_Check(batteryVoltage);

    // 延时一段时间
    Delay_ms(100);
  }
}

调试步骤

  1. 按照电路图连接好硬件电路。
  2. 将代码编译后下载到STM32开发板中。
  3. 连接锂电池,观察OLED屏幕是否显示电池电压和电量百分比。
  4. 模拟电池电压过压和欠压情况,观察LED报警功能是否正常。

总结

本文介绍了一种基于STM32的锂电池电压监测系统设计方案,该方案电路简单、成本低、易于实现。通过对锂电池电压进行实时监测,可以有效防止电池过充过放,延长电池使用寿命,提高电池安全性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号