Basé sur la détection de tension STM32 et la détection de courant
1. Plate-forme matérielle
- Processeur : STM32F103C8
- Écran : écran OLED de 0,96 pouces (interface SPI)
- Module de mesure de tension : INA226 (interface IIC)
- Module de mesure de débit ponctuel : ACS712 (acquisition ADC)
2. Réalisation de la fonction
1. Il peut mesurer une tension continue de 0 à 36 V, adaptée aux circuits électroniques basse tension.
2. Il peut mesurer l'alimentation CC dans la plage de 0 à 5 A. La plage de mesure actuelle de l'ACS712 est de 5 A. Le module a plusieurs plages et peut mesurer jusqu'à 20 A.
3. Surveillance de l'alimentation en temps réel
4. Surveillance de l'alimentation de la batterie (calculée par chute de tension)
3. Présentation du matériel
3.1 Module INA226
L'INA226 est un shunt de courant et un moniteur de puissance avec une interface compatible I2C™ ou SMBUS. L'appareil surveille à la fois la chute de tension parallèle et la tension d'alimentation du bus. Les valeurs d'étalonnage programmables, les temps de conversion et les valeurs moyennes, combinés à un multiplicateur interne, permettent une lecture directe du courant en ampères et de la puissance en watts. L'INA226 détecte le courant sur une tension de bus en mode commun qui peut varier de 0 V à 36 V, indépendamment de la tension d'alimentation. L'appareil fonctionne à partir d'une seule alimentation de 2,7 V à 5,5 V et consomme généralement 330 µA. L'appareil est conçu pour fonctionner sur une plage de températures de –40°C à 125\xC2°C et possède jusqu'à 16 adresses programmables sur une interface compatible I 2 C.
Selon l'objet physique et le schéma de principe, on peut voir qu'une résistance de 0,002 R est connectée entre IN et OUT. Dans la documentation officielle, il est introduit que le module modifié peut mesurer la tension continue 0 ~ 36 V et peut mesurer le courant de mode commun du bus, et la plage de courant de mesure est comprise entre -20A ~ 20A. La précision de la mesure est de ±1 %. Cependant, dans le processus d'utilisation réel, on constate que seule la valeur de tension peut être mesurée. Lors de la mesure de la tension, la méthode de câblage est :
INPUT est connecté au pôle positif de l'alimentation et GND est connecté au pôle négatif de l'alimentation.
Selon les instructions du module, lorsque le module est connecté en série au circuit (c'est-à-dire que la sortie est connectée à la charge), la mesure réelle constate que la valeur de courant normale ne peut pas être obtenue, donc le module ACS712 est utilisé pour terminer la mesure du courant via ADC.
3.2 Registres liés au module INA226 et adresses d'appareil
1. INA226 a un total de 6 registres (0x0~0x5). L'introduction détaillée de chaque registre ne sera pas présentée ici. Vous pouvez télécharger les informations pertinentes par vous-même.
2. Le module INA226 adopte la communication IIC.Selon le schéma, l'adresse A1 A0 == 00, puis reportez-vous au document technique officiel pour savoir que l'adresse du module est : 0x40
D'après la synchronisation, on peut voir que le 8ème bit est le bit d'activation de lecture et d'écriture, puis l'adresse et la combinaison de lecture et d'écriture est : lecture 0x81, écriture 0x80
3.3 Chronogramme du module INA226
Les données sont envoyées sur le front descendant de l'horloge et lues sur le front montant.
3.3 Pilote du module 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 Module ACS712
L'ACS712 est conçu sur la base du principe de l'induction Hall. Il se compose d'un circuit de capteur Hall linéaire à faible décalage précis et d'une feuille de cuivre située près de la surface du circuit intégré (comme illustré dans la figure ci-dessous). Lorsque le courant traverse la feuille de cuivre, un champ magnétique est généré.L'élément induit un signal de tension linéaire en fonction du champ magnétique et émet un signal de tension via le circuit interne d'amplification, de filtrage, de hachage et de correction, qui est émis par la septième broche de la puce et réfléchit directement le courant traversant la feuille de cuivre. La gamme de l'ACS712 est divisée en trois spécifications selon le suffixe : ±5A, ±20A, ±30A. L'entrée et la sortie ont une bonne relation linéaire dans la plage, et le coefficient de sensibilité est de 185 mV/A, 100 mV/A et 66 mV/A, respectivement. Du fait du circuit hacheur, sa sortie sera chargée sur 0,5 Vcc. L'alimentation Vcc de l'ACS712 est généralement recommandée à 5V. La relation entre la sortie et l'entrée est Vout=0.5Vcc+Ip Sensibilité. Le signal de tension de sortie général est compris entre 0,5 V et 4,5 V.
Applications typiques : champ moteur, détection et gestion de charge, champ d'alimentation à découpage et protection contre les défauts de surintensité de divers produits électroniques.
Caractéristiques de l'appareil
- Bande passante 80KHZ
- 1,5 % d'erreur de sortie totale
- Dans un petit boîtier SMD SOIC8
- Résistance interne de 1,2 mΩ
- La tension d'isolation minimale de la broche de courant élevé gauche (PIN1-4) et de la broche basse tension droite (PIN5-8) est de 2100 V
- Fonctionnement à tension unique de 5 V
- Cet appareil ne peut pas être utilisé dans le domaine automobile
Le module ACS712 est un capteur Hall. La valeur de tension est collectée par l'ADC et la charge est convertie en fonction de la relation linéaire entre la tension et le courant. La courbe correspondante et la formule de calcul du courant d'entrée et de la tension de sortie
sont les suivantes : suit : lorsqu'il n'y a pas de courant d'entrée, la tension de sortie correspondante est de 2,5 V. La précision est de 185 mV/A, ce qui correspond à la pente de la pente sur la figure. Prendre VCC=5V, la formule de calcul est :
Vout = 2,5 + 0,185*Ip
3.5 Pilote 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;
}