基于STM32设计的18650锂电池电量(电压/电流)检测系统——采用电阻分压法、均值滤波及ADC测量—文末工程资料下载

news2024/9/20 5:13:28

基于STM32设计的锂电池电量(电压/电流)检测

前言:使用STM32F103C8T6的ADC,和电阻分压法及均值滤波来测量18650锂电池的电压,并在OLED显示屏上显示电池电压值,求出电池电压值即求出电池的电流值和电量值。本文将对其实现过程进行详细介绍。

演示视频:

基于STM32设计的18650锂电池电量(电压电流)检测系统

所需硬件:STM32F103C8T6核心板、18650锂电池、10K电阻、104电容、OLED显示屏、杜邦线

目录

1.硬件电路

2.电阻分压原理

2.ADC原理

3.电池电压和电池剩余电量关系

4.程序设计及资料下载链接


1.硬件电路

           实物图如下所示

        电路原理示意图如下所示 

        如上图所示为STM32设计的18650锂电池电量(电压/电流)检测系统的电路示意图,上图中的元件U1为STM32F103C8T6核心板,使用的电源是3.3V的正极电源,功能引脚包括OLED显示屏的SDA引脚(PB9)和SCL引脚(PB8)以及检测锂电池电量的ADC引脚BAT_ADC(PA0)引脚。元件OLED1为4针OLED显示屏,用来进行电池电压/电流/电量的显示。上图中右下角为锂电池电量检测电流,使用的是电阻分压原理(后面会详细介绍),使用两个10K电阻和一个104电容(100nF),18650锂电池的正极引脚接在BAT+处,负极引脚接电源地。

2.电阻分压原理

        那么为什么要进行电阻分压来进行电池电量检测呢?那是因为单片机的参考电压有关系,电池电压高于参考电压就没办法测量了,那么本系统所采用的单片机的参考电压是多少呢?

        如下图为单个ADC框图,可以看到有VREF参考电压的接入。

        如下表为ADC的引脚定义表,可以看到VREF+的电压范围在2.4V和VDDA之间, 

        可以知道,VDDA为 2.4V-3.6V,而锂电池电压在3.0V-4.2V之间变化,所以需要将锂电池的电压进行缩小来测量,那么咱们就来使用电阻分压原理来将锂电池的电压进行缩小来测量。

         先直接使用电阻分压进行计算测量的电压:本系统使用的是10K的电阻,若当前BAT电池电压为3.7V,有如下的计算得到单个电阻的电压值,当前BAT_ADC引脚所测量的电压1.85V,所测电压乘以2即为电池的BAT电压3.7V(1.85*2V)。则通过这个过程,测量的电压为实际的电压的一半,则满足单片机参考电压量程的需求。

        接下来讲解一下这个过程的原理: 这个原理基于串联电路的基本定律和欧姆定律。让我们一步步解释为什么无论电阻是多大,只要两个电阻相等,电压总是会均分。

    

        在串联电路中,如果两个电阻相等,那么它们会均分总电压。这是因为电路中的电流是相同的,而电压通过欧姆定律分布在电阻上。由于电阻值相等,电压降也是相等的。   

2.ADC原理

        测量电池的电压就需要使用到单片机的ADC功能了:

  • ADC(Analog-Digital Converter)模拟-数字转换器,简称模数转换器或AD转换器
  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。(1.STM32主要是数字电路,数字电路只有高低电平,没有几v电压的概念,所以想读取电压值,就需要借助adc模数转换器来实现,adc读取引脚上的模拟电压转换为一个数据存在寄存器里,我们再把这个数据读取到变量里来就可以进行显示、判断、记录等操作了;2.数字到模拟的桥梁是DAC数字模拟转换器,使用DAC就可以将数字变量转换为模拟电压,PWM也是数字到模拟的桥梁,PWM实现的就是DAC的功能,同时PWM只有完全导通和完全断开两种状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景使用pwm来等效模拟量是比DAC更好的选择并且pwm电路更加简单更加常用,所以pwm还是挤占了dac很多的应用空间,目前dac的应用主要是在波形生成领域比如信号发生器、音频解码芯片等这些领域pwm还是不好代替的)

  • 12位逐次逼近型ADC,1us转换时间。(逐次逼近型是ADC的工作模式;12位和1us涉及到adc的俩个关键参数,第一个是分辨率,一般用多少位来表示,12位ad值表示范围就是0~2^12-1就是量化结果的范围0~4095,位数越高量化结果就越精细,对应分辨率就越高;第二个是转换时间就是转换频率,ad转换是需要花一小段时间的,这里1us就是表示从ad转换开始到产生结果需要花1us的时间,对应ad转换的频率就是1MHz(1MHz的周期是1微秒,是stm32的adc最快转换频率),如果你需要转换一个频率非常高的信号那就需要考虑一下这个转换频率是不是够用,如果你的信号频率比较低那这个最大1MHz的转换频率也完全够用)

  • 输入电压范围:0~3.3V,转换结果范围:0~4095。(adc的输入电压一般要求是在芯片供电的负极和正极之间变化的,0v对应0,3.3v对应4095,中间都是一一对应的线性关系)
  • 18个输入通道,可测量16个外部和2个内部信号源。(外部信号源就是16个gpio口,在引脚上直接接模拟信号就行了,不需任何额外的电路,引脚就直接能测电压;2个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测量cpu的温度,比如你电脑可以显示一个cpu的温度就可以用adc读取这个温度传感器来测量,内部参考电压是一个1.2v左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,所以如果你芯片的供电不是标准的3.3v那测量外部引脚的电压可能就不对,这时就可以读取这个基准电压进行校准,这样就能得到正确的电压值了)

  • 规则组和注入组两个转换单元。(是stm32 adc的增强功能,普通的ad转换流程是启动一次转换读一次值然后再启动再读值这样的流程,stm32的adc可以列一个组,一次启动一个组连续转换多个值并且有两个组,一个是用于常规使用的规则组,一个是用于突发事件的注入组)
  • 模拟看门狗自动监测输入电压范围。(一般可以用于测量光线强度,温度这些值,并且经常会有个需求,就是如果光线高于某个阈值/低于某个阈值或者温度高于某个阈值/低于某个阈值执行一些操作,这个高于某个阈值/低于某个阈值的判断就可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当ad值高于设定的上阈值或低于下阈值时它就会申请中断,就可以在中断函数里执行相应的操作,这样就不用不断地手动读值再用if进行判断了)

  • STM32F103C8T6 的ADC资源:ADC1、ADC2,10个外部输入通道。(最多支持16个外部信号源,若想用更多的外部通道,可以选择引脚更多的型号,具体有多少个通道可以参考数据手册)

对于单片机的普通GPIO来说,只能读取引脚的高低电平,要么是高电平,要么是低电平,只有两个值,而使用了ADC之后,我们就可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量就可以知道这个引脚的具体电压到底是多少了,所以ADC其实就是一个电压表,把引脚的电压测出来放在一个变量里,这就是ADC的作用。

关于ADC的相关知识点还有很多,可以参见我的AD博文进行更为详细的学习:19.ADC模数转换器知识点+AD单通道&AD多通道应用程序示例_ad模数转换器-CSDN博客icon-default.png?t=O83Ahttps://archie.blog.csdn.net/article/details/136723340

3.电池电压和电池剩余电量关系

        当前系统可以实现对电压的检测,根据电压与电池剩余电量的关系即可得到电量值,根据欧姆定律即可求出电流值,即本系统可以完整实现对18650锂电池的电量、电压和电量的检测。

锂电池电压与电池剩余电量关系如下表所示(可能不同产品不一样,可参见电池厂商资料):

截止电压2.5-2.75v左右   稳定电压3.7v左右   满电4.2v左右

4.程序设计及资料下载链接

程序源码中使用了均值滤波来消除噪声干扰。

程序源码、原理图等资料下载见下方链接,或与我联系。

资料下载链接:基于STM32设计的18650锂电池电量(电压电流)检测系统-采用电阻分压法、均值滤波及ADC测量-皆可毕设/课设/作业/竞赛中资源-CSDN文库icon-default.png?t=O83Ahttps://download.csdn.net/download/m0_61712829/89734164?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库系统概论笔记(持续更新)

一、概念 1、数据 数据库中存储的基本对象。 2、数据库 定义:长期存储在计算机内、有组织、可共享的大量数据的集合。 3、数据库管理系统 定义:是位于用户与操作系统之间的一层数据管理软件。 主要功能: 1) 数据定义功能 …

C++ | Leetcode C++题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestSubstring(string s, int k) {int ret 0;int n s.length();for (int t 1; t < 26; t) {int l 0, r 0;vector<int> cnt(26, 0);int tot 0;int less 0;while (r < n) {cnt[s[r] - a];…

QStackedWidget类的使用

本文介绍QStackedWidget类的使用。 StackedWidget控件在Qt应用程序开发过程中用的还是比较多的&#xff0c;配合按钮可以实现多个页面之间相互切换&#xff0c;方便了应用程序的开发&#xff0c;本文简要介绍QStackedWidget类实际使用过程中的常用方法&#xff0c;并给出一个简…

Matlab -- meshgrid和peaks的用法

最近在看到关于三维路径规划方面中&#xff0c;提到使用了样条插值的方法&#xff0c;其中提到了meshgrid和peaks。也查阅了相关资料&#xff0c;现将查阅的资料整理如下。 1 meshgrid函数 该函数是网格采样点的函数。 主要使用的函数为[X,Y]meshgrid(xgv,ygv); meshgrid函数…

华为OD机试真题 - 矩阵匹配 - 深度优先搜索DFS(Python/JS/C/C++ 2024 D卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

华为OD机试 - 跳房子I(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

高效驱动之选 ——KP85211ASGA 半桥栅极驱动器 内置互锁死区

KP85211A是一款 225V 耐压&#xff0c;具有 1A 拉电流和 1.5A 灌电流能力的半桥栅极驱动器&#xff0c;专用于驱动功率MOSFET或IGBT。采用高压器件工艺技术&#xff0c;具有良好的电流输出及出色的抗瞬态干扰能力。可保证开关节点 VS 瞬态 -7V 情况下系统正常工作。可支持开关节…

SpringBoot自定义启动器(自定义Starter)

一、如何理解 SpringBoot 的 starter 机制 Spring Boot 的 Starter 机制是其简化开发流程的关键特性之一。通过提供 预配置的依赖项 和 自动配置 支持&#xff0c;这一机制极大地简化了项目的依赖管理和配置工作&#xff0c;使得开发者可以更快地搭建应用程序框架&#xff0c;…

【系统分析师】计算机组成与体系架构

计算机硬件组成&#xff0c;运算器&#xff0c;控制器 计算机基本硬件系统五大组成部分&#xff1a;运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;I/O设备 运算器的四个重要寄存器&#xff1a; 算术逻辑单元&#xff08;实时对数据的算术和逻辑运算&#xff0c;…

C语言 ——— 学习并使用 #if defined #ifdef #ifndef 条件编译指令

目录 学习 #if defined #ifdef #ifndef 条件编译指令 使用 #if defined 和 #ifdef 条件编译指令 使用 #ifndef 条件编译指令 学习 #if defined #ifdef #ifndef 条件编译指令 #if #ifndef 条件编译指令是用来判断某个符号是否被定义过&#xff0c;被定义过的话就为真&#x…

代码随想录冲冲冲 Day41 动态规划Part9

188. 买卖股票的最佳时机 IV 昨天题目是买卖两次&#xff0c;这里是设定好k次 2次的时候一共包含了5中情况 那么k次就包含了2 k 1种情况 初始化只有1 &#xff0c; 3 &#xff0c;5 也就是买入的状况是有值的&#xff0c;所以初始化时候只需要看这些情况知道2 k 之后只要把…

C++11(2)

目录 6。左值引用和右值引用 下面演示左值和左值引用&#xff1a; 下面演示右值和右值引用&#xff1a; 7。移动构造和移动赋值 VS2022的神级优化 List下的移动构造拷贝和深拷贝(实战) 证明&#xff1a;左值是由编译器决定的 附加&#xff1a;自己实现的List.h 6。左值引…

欺诈文本分类检测(十四):GPTQ量化模型

1. 引言 量化的本质&#xff1a;通过将模型参数从高精度&#xff08;例如32位&#xff09;降低到低精度&#xff08;例如8位&#xff09;&#xff0c;来缩小模型体积。 本文将采用一种训练后量化方法GPTQ&#xff0c;对前文已经训练并合并过的模型文件进行量化&#xff0c;通…

fuxa搭建与使用(web组态)

1. 安装Node.js -> npm安装 参考网址&#xff1a;https://blog.csdn.net/WHF__/article/details/129362462 一、安装运行 C:\WINDOWS\system32>node -v v20.17.0 C:\WINDOWS\system32>npm -v 10.8.2 二、环境配置 在安装路径&#xff08;D:\Program_Files\nodejs&a…

打开VSCod安装“PHP Intelephense”或“PHP Server”PHP扩展

安装PHP扩展&#xff1a; 打开VSCode&#xff0c;进入扩展视图&#xff08;或使用快捷键CtrlShiftX&#xff09;。搜索并安装“PHP Intelephense”或“PHP Server”等PHP相关扩展&#xff0c;这些扩展提供了PHP代码的智能感知、代码导航、调试等功能。 配置PHP路径&#xff1a;…

第2章 方法

本书作者起初以为仅靠研究命令行工具和指标就能提高性能。他认为这样不对。他从头到尾读了一遍手册&#xff0c;看懂了缺页故障、上下文切换和其他各种系统指标的定义&#xff0c;但不知道如何处理它们&#xff1a;如何从发现信号到找到解决方案。 他注意到&#xff0c;每当出…

第 8 章图像内容分类

本章介绍图像分类和图像内容分类算法。首先&#xff0c;我们介绍一些简单而有效的方法和目前一些性能最好的分类器&#xff0c;并运用它们解决两类和多类分类问题&#xff0c;最后展示两个用于手势识别和目标识别的应用实例。 8.1 K邻近分类法&#xff08;KNN&#xff09; 在…

2024最新精选文章!分享5款论文ai生成软件

在2024年&#xff0c;AI论文生成软件的出现极大地提升了学术写作的效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是五款值得推荐的AI论文生成软件&#xff0c;其中特别推荐千笔-AIPassPaper。 ### 千笔-AIPa…

shader 案例学习笔记之step函数

step函数 step(edge,x)&#xff1a;当x>edge时返回1&#xff0c;否则返回0 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution;void main(){vec2 st gl_FragCoord.xy/u_resolution.xy;float f step(0.5, st.x);gl_FragColor vec4(f, 0, 0, 1.0); …

JQuery中的$

}); 当jquery.color.js动画插件加载完毕后&#xff0c;单击id为“go”按钮时&#xff0c;class为block的元素就有了颜色动画变化。 $.getJSON() $.getJSON()方法用于加载JSON文件&#xff0c;与$.getScript()方法的用法相同。 我们来看demo2. demo2.html 已有评论&#xff1…