基于STM32电压检测和电流检测_stm32电流检测-程序员宅基地

技术标签: stm32  INA226  STM32  霍尔传感器  ACS712  

基于STM32电压检测和电流检测

1.硬件平台

  • CPU:STM32F103C8
  • 屏幕:0.96寸OLED屏幕(SPI接口)
  • 电压测量模块: INA226(IIC接口)
  • 点流测量模块:ACS712(ADC采集)

2.功能实现

1.可测量直流电压0~36V,适用于低电压电子电路中。
2.可测量直流电0~5A范围内,目前采用的ACS712测量量程为5A,该模块有多个量程,可测量到20A
3.实时功率监测
4.电池电量监测(采用电压压降方式计算)

3.硬件介绍

3.1 INA226模块

  INA226是具有I2C或SMBUS兼容接口的电流分流器和功率监控器。该设备同时监视并联电压降和总线电源电压。可编程的校准值,转换时间和平均值与内部乘法器结合使用,可以直接读取以安培为单位的电流和以瓦特为单位的功率。INA226感应共模总线电压上的电流,该电压可在0 V至36 V之间变化,与电源电压无关。该器件采用2.7V至5.5V单电源供电,典型功耗为330 µA。该器件的额定工作温度范围为–40°C至125 \ xC2°C,并且在I 2 C兼容接口上具有多达16个可编程地址。

在这里插入图片描述
  根据实物和原理图可看出IN和OUT 之间进接了一个0.002R电阻。在官方提供说明文档介绍改模块是可以测量直流电压0~36V,可测量总线共模电流,测量电流范围为-20A ~ 20A之间。测量精度为±1%。但在实际使用过程中发现仅能测量测量到电压值。测量电压时接线方式为:
  INPUT接电源正极,GND接电源负极。
  按照模块使用说明提示在将模块串联接入电路(即OUPUT接入到负载),实际测量发现无法获取到正常电流值,因此采用ACS712模块通过ADC方式完成电流测量。

3.2 INA226模块相关寄存器和设备地址

   1.INA226一共有6个寄存器(0x0~0x5),关于各个寄存器详细介绍这里则不展开介绍,可自行下载相关资料。
在这里插入图片描述
   2.INA226模块采用IIC通讯,根据原理图可知地址A1 A0 ==00,再参考官方技术文档可知模块设备地址为:0x40
在这里插入图片描述
从时序可以看出,第8位为读写使能位,则地址和读写为组合则为:读0x81,写0x80
在这里插入图片描述

3.3 INA226模块时序图

   在时钟下降沿沿时发送数据,上升沿读取数据。
在这里插入图片描述   3.3 INA226模块驱动

#include "sys.h"
#include "myiic.h"
#define 	CFG_REG	 		0x00		//
#define 	SV_REG 			0x01		//分流电压
#define 	BV_REG 			0x02		//总线电压
#define 	PWR_REG 		0x03		//电源功率
#define 	CUR_REG 		0x04		//电流
#define 	CAL_REG 		0x05		//校准,设定满量程范围以及电流和功率测数的 
#define 	ONFF_REG 		0x06		//屏蔽 使能 警报配置和转换准备就绪
#define 	AL_REG 			0x07		//包含与所选警报功能相比较的限定值
#define 	INA226_GET_ADDR 0XFF		/
//初始化INA226
void INA226_Init(void)
{
    	

	IIC_Init();
	INA226_SendData(INA226_ADDR1,CFG_REG,0x8000);	//重新启动
	
	INA226_SendData(INA226_ADDR1,CFG_REG,0x484f);	//设置转换时间204us,求平均值次数128,采样时间为204*128,设置模式为分流和总线连续模式
	INA226_SendData(INA226_ADDR1,CAL_REG,CAL);	//设置分辨率
	//INA226_SendData(INA226_ADDR1,CAL_REG,0x0012);//设置分流电压转电流转换参数	
	INA226_Get_ID(INA226_ADDR1);					//获取ina226的id
}
//设置寄存器指针
void INA226_SetRegPointer(u8 addr,u8 reg)
{
    
	IIC_Start();

	IIC_Send_Byte(addr);
	IIC_Wait_Ack();

	IIC_Send_Byte(reg);
	IIC_Wait_Ack();

	IIC_Stop();
}

//发送,写入数据
void INA226_SendData(u8 addr,u8 reg,u16 data)
{
    
	u8 temp=0;
	IIC_Start();

	IIC_Send_Byte(addr);
	IIC_Wait_Ack();

	IIC_Send_Byte(reg);
	IIC_Wait_Ack();
	
	temp = (u8)(data>>8);
	IIC_Send_Byte(temp);
	IIC_Wait_Ack();

	temp = (u8)(data&0x00FF);
	IIC_Send_Byte(temp);
	IIC_Wait_Ack();
	
	IIC_Stop();
}

//读取数据
u16 INA226_ReadData(u8 addr)
{
    
	u16 temp=0;
	IIC_Start();

	IIC_Send_Byte(addr+1);
	IIC_Wait_Ack();
	
	temp = IIC_Read_Byte(1);
	temp<<=8;	
	temp |= IIC_Read_Byte(0);
	
	IIC_Stop();
	return temp;
}
//1mA/bit
u16 INA226_GetShunt_Current(u8 addr)
{
    
	u16 temp=0;	
	INA226_SetRegPointer(addr,CUR_REG);
	temp = INA226_ReadData(addr);
	if(temp&0x8000)	temp = ~(temp - 1);	
	return temp;
}

//获取id
void INA226_Get_ID(u8 addr)
{
    
	u32 temp=0;
	INA226_SetRegPointer(addr,INA226_GET_ADDR);
	temp = INA226_ReadData(addr);
	ina226_data.ina226_id = temp;
}

//获取校准值
u16 INA226_GET_CAL_REG(u8 addr)
{
    	
	u32 temp=0;
	INA226_SetRegPointer(addr,CAL_REG);
	temp = INA226_ReadData(addr);
	return (u16)temp;
}

//1.25mV/bit
u16 INA226_GetVoltage(u8 addr)
{
    
	u32 temp = 0;
	INA226_SetRegPointer(addr,BV_REG);
	temp = INA226_ReadData(addr);
	return (u16)temp;	
}

//2.5uV/bit
u16 INA226_GetShuntVoltage(u8 addr)
{
    
	int16_t temp = 0;
	INA226_SetRegPointer(addr,SV_REG);
	temp = INA226_ReadData(addr);
	if(temp&0x8000)	temp = ~(temp - 1);	
	return (u16)temp;	
}

//获取电压
void GetVoltage(float *Voltage)//mV
{
    
	*Voltage = INA226_GetVoltage(INA226_ADDR1)*Voltage_LSB;
}

3.4 ACS712模块

  ACS712基于霍尔感应的原理设计,由一个精确的低偏移线性霍尔传感器电路与位于接近IC表面的铜箔组成(如下图所示),电流流过铜箔时,产生一个磁场, 霍尔元件根据磁场感应出一个线性的电压信号,经过内部的放大、滤波、斩波与修正电路,输出一个电压信号,该信号从芯片的第七脚输出,直接反应出流经铜箔电流的大小。ACS712根据尾缀的不一样,量程分为三个规格:±5A、±20A、±30A 。输入与输出在量程范围内为良好的线性关系,其系数Sensitivity分别为,185 mV/A、100 mV/A、66mV/A。因为斩波电路的原因,其输出将加载于0.5Vcc上。ACS712的Vcc电源 一般建议采用5V。输出与输入的关系为Vout=0.5Vcc+IpSensitivity。一般输出的电压信号介于0.5V~4.5V之间。
  典型的应用:电机领域,载荷检测和管理,开关电源领域,和各种电子产品过电流故障保护。
   器件特点

  • 80KHZ带宽
  • 总输出误差为1.5%
  • 采用小型贴片SOIC8封装
  • 1.2mΩ内部电阻
  • 左侧大电流引脚(PIN1-4)与右侧低电压引脚(PIN5-8)最小绝缘电压为2100V
  • 5V单电压工作
  • 该器件不可应用于汽车领域

在这里插入图片描述
  ACS712模块为霍尔传感器,通过ADC采集电压值,载根据电压与电流的线性关系时序电流转换,输入电流与输出电压对应曲线及计算公式:
  ACS712ELCTR-05B电流电压对应关系如下图,Ip=0A即没有输入电流的时候,对应输出电压为2.5V.精确度为185mV/A即为图中斜线的斜率。取VCC=5V,计算公式为:
Vout = 2.5 + 0.185*Ip
在这里插入图片描述

3.5 ACS712驱动

#include "adc.h"
/***************ADC规则通道初始化*************
**硬件接口:PB0 -- ADC1_CH8(模拟)
**
*注:ADC的工作频频率不能超过14MHZ
********************************************/
void ADC1_RegularChannel_Init(void)
{
    
	//1.开时钟
	RCC->APB2ENR|=1<<9;//ADC1时钟
	RCC->APB2ENR|=1<<3;//PB0时钟
	RCC->APB2RSTR|=1<<9;//ADC复位时钟
	RCC->APB2RSTR&=~(1<<9);//关复位
	/*2.GPIO配置*/
	GPIOB->CRL&=0xFFFFFFF0;//模式输入方式
	/*3.ADC时钟频率配置*/
	RCC->CFGR&=~(0x3<<14);//清除原来配置
	RCC->CFGR|=0x2<<14;//ADC工作频率72MHZ/6=12MZH
	/*4.配置ADC核心寄存器*/
//	ADC1->CR1&=~(0xF<<16);//独立模式
	ADC1->CR2|=1<<23;//启动温度传感器(测量CPU温度)
	ADC1->CR2|=1<<20;//规则通道外部触发转换模式
	ADC1->CR2|=0x7<<17;//外部事件通过开关事件触发
//	ADC1->CR2&=~(1<<11);//右对齐(地位对齐,高位补0)
	ADC1->SMPR1|=0x7<<18;//温度传感器采样时间通道16
	ADC1->SMPR2|=0x7<<24;//通道8采用时间
	ADC1->SQR1&=~(0xF<<20);//规则通道转换的通道数目为1个转换
//	ADC1->CR2&=~(1<<1);//单次转换模式
	ADC1->CR2|=1<<0;//开启ADC
	ADC1->CR2|=1<<3;//初始化校准
	while(ADC1->CR2&1<<3);//等待初始化校准完成
	ADC1->CR2|=1<<2;//开始校准
	while(ADC1->CR2&1<<2){
    }//等待校准完成
}
/****************ADC1规则通道获取数值***************/
u16 ADC1_GetRegularCHx(u8 chx)
{
    
	ADC1->SQR3&=~(0x1F<<0);//清除原来寄存器中的值
	ADC1->SQR3|=chx;//要转的通道号
	ADC1->CR2|=1<<22;//开启转换规则通过
	while(!(ADC1->SR&1<<1)){
    }//等待转换完成
	return ADC1->DR;
}

4.实物测量效果

在这里插入图片描述
示例地址:https://download.csdn.net/download/weixin_44453694/85520132

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44453694/article/details/124991776

智能推荐

基于深度学习的番茄叶片病害检测系统(含UI界面、yolov8、Python代码、数据集)_深度学习叶片病害检测-程序员宅基地

文章浏览阅读1.9k次,点赞31次,收藏44次。本文将详细介绍如何以官方yolov8为主干,实现对鱼类的检测识别,且利用PyQt5设计了简约的系统UI界面。在界面中,您可以选择自己的视频文件、图片文件进行检测。此外,您还可以更换自己训练的主干模型,进行自己数据的检测。该系统界面优美,检测精度高,功能强大。它具备多目标实时检测,同时可以自由选择感兴趣的检测目标。本博文提供了完整的Python程序代码和使用教程,适合新入门的朋友参考。您可以在文末的下载链接中获取完整的代码资源文件。数据集总共包含以下类别,且已经分好文件夹,也提供转好的yolo。_深度学习叶片病害检测

Java面试复习2 java的多态,异常处理及常用API(String,StringBuffer,StringBuilder类,Math类)_java stringbuffer 异常处理-程序员宅基地

文章浏览阅读365次。Java面试复习2 java的多态,异常处理及常用API声明:本面试复习都基于一本未署名的Java面试宝典所述,根据自己的理解写出了这一专栏的复习博客Java中实现多态的机制是什么?简单来说就是定义一个父类的,或者接口类型的引用变量指向子类或者接口实现类的实例对象现在A是B的父类 Public A a = new B();这就是一种多态性的体现通过这种方式,父类定义的变量可以调用子类中的..._java stringbuffer 异常处理

java/php/node.js/python基于微信小程序的教学效果测评系统【2024年毕设】-程序员宅基地

文章浏览阅读769次,点赞18次,收藏18次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。

Python 如何写好注释与文档字符串o(* ̄▽ ̄*)ブ_pycharm缺少文档字符串-程序员宅基地

文章浏览阅读2.1k次,点赞6次,收藏8次。注释是每个计算机语言的重要组成部分,用于在源代码中解释代码的功用,可以增强程序的可读性,可维护性,或者用于在源代码中处理不需运行的代码段,来调试程序的功能执行。**想必很多人都了解 Python 的注释,Python 的注释分单行注释和多行注释,对于多行注释而言会用到一个Python独一无二很厉害的文档字符串,这也是下面内容要提到的,在当前部分将会稍微讲讲单行注释。****文档字符串(DocString)注重于解释怎么使用模组、类、方法与函数,对于每个模组、类、方法与函数都应该编写 DocString 文_pycharm缺少文档字符串

基于微信小程序的校园二手交易平台-程序员宅基地

文章浏览阅读1.9k次,点赞32次,收藏20次。本基于微信小程序的校园二手平台采用java语言和mysql数据库进行设计,采用微信端+客户端的模式进行设计。用户也可以发布自己的闲置商品;同时本系统中加入了管理员,管理员可以审核商品,审核注册用户,实现销售与管理的一体化。为了更加方便用户的交易,用户可以在发布商品时填写自己的联系信息,同时本系统中设计了在线搜索的模块功能,可以使系统更加的灵活。本系统的实现可以帮助用户实现闲置物品的交易,非常符合大学生的生活需求。商品信息;评价信息;商品配送。_基于微信小程序的校园二手交易平台

解决matlab中文乱码问题_java调用matlab乱码-程序员宅基地

文章浏览阅读1.3w次。说实话,这两篇文章也没能解决我现在的问题,现在的问题是本机的editor输入中文可以,而且打开也不是乱码;但是文件拷贝到别的机器上就中文成了乱码了,纠结,我总不能把别人的设置改了吧。原文链接如下:linux下matlab中文乱码解决matlab中文乱码当然我还在震动论坛看到一种方法就是说把preference里面的字体改成monospaced,实际上我这几个editor的设置都_java调用matlab乱码

随便推点

C++ STL 如何调堆【两种方法】 看了就懂_stl 堆-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏6次。C++ STL 堆的调取记住掉STL里的东西要在前面加上use namespace std;。1.优先队列这个堆我想应该是最常用的,因为写起来方便,但是时间效率上不高,往往比手写的多一个系数。所以本人不是很喜欢用。 需要用到algorithm这个库。定义: priority_queue&lt;存储类型&gt; 变量名称,例如priority_queue&lt; int..._stl 堆

决策单调性优化dp学习笔记_【算法笔记】决策单调性优化dp-程序员宅基地

文章浏览阅读333次。文章目录从例题开始SolutionCode注意事项(特别重要!)模板题练习题最后几天多写几篇博客,总结一下拼搏的这一年,曾经并不是那么熟练的内容,顺便熟悉一下我的神奇键盘从例题开始HDU3507Solution首先,状态设计十分显然: dpidp_idpi​表示前iii个数的答案。状态转移也十分显然: 枚举最后一段的左端点lll,则dpi=dpl−1+(∑j=liaj)2+Mdp_i=dp_{l-1}+(\sum_{j=l}^i a_j)^2+Mdpi​=dpl−1​+(∑j=li​aj​)2+_【算法笔记】决策单调性优化dp

java读取txt文本,字符串截取-程序员宅基地

文章浏览阅读2k次。package com.test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;..._java读取text 文本 中文字符长度截取问题

如何在linux上下载各种常用安卓应用_麟卓卓懿下载-程序员宅基地

文章浏览阅读6.1k次。随着互联网的发展,在很多场合中或者工作中都会用到linux系统,但常用linux的小伙伴们都知道,linux对各个常用的安卓应用兼容性很差,基本上好多应用只有简易的网页版,例如微信、QQ、钉钉等,网页版的很多功能都没办法使用,这给我们的工作带来了很多不便。这里呢我就给大家推荐一个完美兼容linux系统环境的平台–麟卓卓懿应用商城。麟卓卓懿应用商城支持海量安卓应用无缝透明运行在Linux平台上,实现移动应用生态和桌面应用生态的完美结合。麟卓卓懿应用商城的应用中心中可以下载海量的安卓应用,并且应用种类多、平_麟卓卓懿下载

微信小程序node+vue+uniapp课程在线答疑学习答题考试系统_uni-app 考试系统-程序员宅基地

文章浏览阅读818次。系统主要分为管理员和学生、教师三部分,管理员服务端:首页、个人中心、学生管理、教师管理、课程资源管理、课程类型管理、学习记录管理、系统管理,教师服务端:首页、个人中心、课程资源管理、学习记录管理、试题管理、试卷管理、考试管理,学生客户端;首页、首页、课程资源、我的等功能,基本上实现了整个答题系统小程序信息管理的过程。本系统在一般答题系统小程序的基础上增加了最新信息的功能方便用户快速浏览,是一个高效的、动态的、相互友好的答题系统小程序。(2)减少维护人员的工作量以及实现用户对信息的控制和管理。_uni-app 考试系统

让wordpress博客首页、分类页 显示文章标题列表或摘要-程序员宅基地

文章浏览阅读445次。 最近买了个godaddy的150G的空间,准备用dede和wordpress做些小站,wordpress架起来以后,发布的文章都是全部展示在首页的,如果文章比较长的话,这样会使网站首页内容很长,所以一般情况我们都希望在首页上只显示文章标题和文章摘要。那么我们如何来实现这功能呢,查阅了一下后发现,其实这个很简单,具体做法如下: 首先找到wp-content/themes下你使用的模板目录,查...

推荐文章

热门文章

相关标签