从零开始学习安时积分法(STM32实现程序)

news/2025/2/6 7:36:32/

在STM32微控制器上实现安时积分法(Coulomb Counting)来估算电池的SOC(State of Charge),需要完成以下几个步骤:

  1. 硬件配置:

    • 使用STM32的ADC模块测量电池的电流。
    • 使用定时器模块进行时间积分。
    • 配置GPIO和串口用于调试和输出结果。
  2. 软件实现:

    • 初始化ADC和定时器。
    • 实时读取电流值并进行积分计算。
    • 根据积分结果更新SOC值。

以下是基于STM32的安时积分法实现代码示例(以STM32F4系列为例,使用HAL库):


代码实现

#include "stm32f4xx_hal.h"// 定义变量 
#define BATTERY_CAPACITY 5000  // 电池标称容量,单位:mAh 
#define ADC_RESOLUTION   4095  // ADC分辨率(12位)
#define ADC_REF_VOLTAGE  3.3   // ADC参考电压,单位:V 
#define SHUNT_RESISTOR   0.1   // 电流采样电阻,单位:Ω float soc = 100.0;  // 初始SOC值,单位:%
float current = 0.0;  // 当前电流值,单位:mA 
uint32_t adc_value = 0;  // ADC读取的原始值 // ADC初始化 
void ADC_Init(void) {ADC_HandleTypeDef hadc;hadc.Instance = ADC1;hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;hadc.Init.Resolution = ADC_RESOLUTION_12B;hadc.Init.ScanConvMode = DISABLE;hadc.Init.ContinuousConvMode = ENABLE;hadc.Init.DiscontinuousConvMode = DISABLE;hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc.Init.NbrOfConversion = 1;hadc.Init.DMAContinuousRequests = DISABLE;hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;HAL_ADC_Init(&hadc);
}// 读取ADC值 
uint32_t ADC_Read(void) {HAL_ADC_Start(&hadc);HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);return HAL_ADC_GetValue(&hadc);
}// 计算电流值 
float Calculate_Current(uint32_t adc_value) {float voltage = (adc_value * ADC_REF_VOLTAGE) / ADC_RESOLUTION;  // 计算电压 return (voltage / SHUNT_RESISTOR) * 1000;  // 计算电流,单位:mA 
}// SOC估算函数 
void Update_SOC(float current, uint32_t time_interval_ms) {float delta_soc = (current * time_interval_ms) / (BATTERY_CAPACITY * 3600);  // SOC变化量 soc -= delta_soc;  // 更新SOC if (soc < 0) soc = 0;  // SOC下限保护 if (soc > 100) soc = 100;  // SOC上限保护 
}int main(void) {HAL_Init();  // 初始化HAL库 SystemClock_Config();  // 配置系统时钟 ADC_Init();  // 初始化ADC uint32_t last_time = HAL_GetTick();  // 获取初始时间 while (1) {uint32_t current_time = HAL_GetTick();  // 获取当前时间 uint32_t time_interval_ms = current_time - last_time;  // 计算时间间隔 adc_value = ADC_Read();  // 读取ADC值 current = Calculate_Current(adc_value);  // 计算电流值 Update_SOC(current, time_interval_ms);  // 更新SOC last_time = current_time;  // 更新时间戳 // 输出SOC值(通过串口或调试接口)printf("Current SOC: %.2f%%\n", soc);HAL_Delay(100);  // 延时100ms }
}

代码说明

  1. ADC初始化:
    • 配置ADC模块以读取电流采样电阻上的电压。
    • STM32的ADC分辨率为12位,

http://www.ppmy.cn/news/1569743.html

相关文章

【Leetcode 热题 100】1143. 最长公共子序列

问题背景 给定两个字符串 t e x t 1 text_1 text1​ 和 t e x t 2 text_2 text2​&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 0 0。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变…

[ Spring ] Spring Boot Mybatis++ 2025

文章目录 StructureMyBatis Controller AbilitiesConfigure Plugins and RepositoriesApply Plugins and Add DependenciesMyBatis Spring PropertiesMyBatis ApplicationMyBatis BeansMyBatis MapperMyBatis Query Builder Structure this blog introduce 3 ways using mybat…

HarmonyOS NEXT:保存应用数据

用户首选项使用 用户首选项的特点 数据体积小、访问频率高、有加载速度要求的数据如用户偏好设置、用户字体大小、应用的配置参数。 用户搜选项&#xff08;Preferences&#xff09;提供了轻量级配置数据的持久化能力&#xff0c;支持订阅数据变化的通知能力。不支持分布式同…

实验十四 EL和JSTL

实验十四 EL和JSTL 一、实验目的 1、掌握EL表达式的使用 2、掌握JSTL的使用 二、实验过程 1、在数据库Book中建立表Tbook&#xff0c;包含图书ID&#xff0c;图书名称&#xff0c;图书价格。实现在bookQuery.jsp页面中模糊查询图书&#xff0c;如果图书的价格在50元以上&#…

vscode+vue3+高得地图开发过过程中本地视频及地图json文件的发布问题

很久没发blog了&#xff0c;最近vscodevue3高得地图开发中&#xff0c;因为有开发的视频教程&#xff0c;还有地图的边界的.json文件&#xff0c;这些静态文件发布时&#xff0c;如果处理不当&#xff0c;build命令会将这些静态文件进行打包。打包后文件名变化了&#xff0c;这…

DeepSeek的出现对全球GPT产业产生的冲击

引言 近年来&#xff0c;人工智能技术的迅猛发展推动了自然语言处理&#xff08;NLP&#xff09;领域的革命性进步。特别是以GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型为代表的大规模预训练语言模型&#xff0c;已经在全球范围内引发了广泛关注…

python编程-文件和目录操作,字符串操作

python的文件和目录操作主要用到os包。最常用的接口如下&#xff1a; 1. 获取当前工作目录 import os current_dir os.getcwd() print("当前目录:", current_dir) # 输出: /Users/your/path 2. 切换工作目录 os.chdir("/tmp") # 切换到 /tmp 目录 p…

利用TensorFlow.js实现浏览器端机器学习:一个全面指南

引言 随着深度学习技术的不断发展&#xff0c;机器学习已从传统的服务器端运算逐渐转向了前端技术。TensorFlow.js 是 Google 推出的一个用于在浏览器中进行机器学习的开源库&#xff0c;它允许开发者在浏览器中直接运行机器学习模型&#xff0c;而无需依赖后端服务器。Tensor…