单片机交流
直播中

caokyo

12年用户 522经验值
私信 关注
[问答]

怎么实现ACS712电流传感器模块电路设计?

怎么实现ACS712电流传感器模块电路设计?

回帖(1)

李峰

2021-11-9 10:35:50
硬件设计

(末尾附文件)
系统功能设计

51单片机锂电池电压电流容量检测仪表液晶显示66
本系统由STC89C52单片机、分压、A/D芯片PCF8591、ACS712电流检测、LCD1602液晶显示及电源组成。
1、通过51单片机驱动pcf8591采集分压值进行计算获取实际电压值,通过ACS712获取当前电流转化的电压值,进行运算获取电流值。
2、单片机驱动LCD1602液晶显示锂电池的电压、放电电流和当前容量。
3、为了方便采集到电流,负载可以接一个功率电阻作为负载。
原理图:





STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
本系统选择PCF8591作为A/D采样芯片。PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
一、芯片特性
(1)单独供电
(2)PCF8591的操作电压范围2.5V-6V
(3)低待机电流
(4)通过I2C总线串行输入/输出
(5)PCF8591通过3个硬件地址引脚寻址
(6)PCF8591的采样率由I2C总线速率决定
(7)个模拟输入可编程为单端型或差分输入
(8)自动增量频道选择
(9)PCF8591的模拟电压范围从VSS到VDD
(10)PCF8591内置跟踪保持电路
(11)8-bit逐次逼近A/D转换器
ACS712电流传感器模块电路设计
该传感器使用芯片为ACS712-05A,能够检测5A范围内的直流电流。ACS712芯片专们用于电流检测芯片, 高度集成的制作工艺和专业的电流检测技术可为各种交直流电流检测提供经济实惠且精确的解决方案。该器件封装便于客户轻松实施。ACS712芯片的经典应用于开关式电源设备和过电流故障保护、载荷检测和管理系统、电动机控制系统等。
ACS712芯片,使用了精准的,低偏置的线性霍尔传感器电路,且其电流路径强敌了电流路径的阻抗,宁切路径靠近晶片的表面更增加了测量的准确度。
通过该通知的电流路径施加上电流,是芯片内部产生磁场,磁场被集成在内部的霍尔器件获取,并转化为一定比例的电压值。通过该电压值经过AD转化被微处理器获取,精处理后可以显示,该期间在出厂时已经进行了精确度的校准。
当芯片内部中的电流路径(从引脚 1 和 2,到 引脚3 和 4)的电流持续上升的时候,器件的输出属于正斜率 (>VIOUT(Q))。这是的 ACS712 电流传感器 IC 可以使用在那些要求电气绝缘但没有使用光电绝缘器以及其它昂贵绝缘技术的应用。
一、传感器模块功能特点
(1)低噪音模拟信号路径。
(2)通过专用的滤波引脚,设置器件的滤波带宽。
(3)5 µs 输出上升时间,对应步进输入电流。
(4)80 千赫带宽。
(5)总输出误差为 1.5%(当 TA = 25°C时)。
(6)采用小体积低厚度 的SOIC8 封装 。
(7)1.2 mΩ 内部传导电阻。
(8)每个管脚之间 有2.1k VRMS及以上的绝缘电压。
(9)5.0 伏特,单电源操作。
(10)输出灵敏度达到66 至 185 mV/A 。
(11)输出电压值与配测量的交直流电流成正比例关系。
(12)出厂时精确度校准。
(13)极稳定的输出偏置电压。
(14)近零的磁滞。
二、使用说明
(1)模块可以测量±5A电流。
(2)电源电压的成比例输出,对应模拟量输出: 185mV/A。
(3)没有检测电流通过时输出电压为VCC/2。
(4)ACS712是基于霍尔检测原理,使用时要注意避开磁场。对此影响。
三、模块接口说明
(1)VCC 接5V
(2)GND 接GND
(3)OUT 模拟信号输出。
(4)J2端子2孔 接输入电流检测线
程序设计

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include "1602.h"
#include "delay.h"
#include "i2c.h"


char dis0[16];                           //打印数组初始化


unsigned long time_20ms=0xaaaaaaaa;                   //定时器计数


unsigned char count =0;          //采集次数计数


float Volt=0.0;                          //检测电压
xdata float sumVolt,midV; //用于滤波 中间变量


float Acurrent=0.0;                                  //检测电流
xdata float sumAcur,midA;                //用于滤波 中间变量


float BatCap=80;                          //容量初始化
void Init_Timer0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);


void main (void)
{     
        Init_Timer0();        //定时器0初始化
        UART_Init();
                     
        LCD_Init();           //初始化液晶
        DelayMs(20);          //延时有助于稳定
        LCD_Clear();


        uartSendStr("reday ok!!",10);
        while (1)         //主循环
        {
                midV=(float)ReadADC(1)*5.13/255*2;                //计算出电压 *2表示分压值
                DelayMs(2);          //延时有助于稳定
                Acurrent=(float)ReadADC(0)*5.13/255;                //计算出电流


                if(Acurrent>2.6)                         //如果电流转换后的电压值超过2.6
                {midA=(Acurrent-2.6)/0.185;}         //电流模块 电压转换计算               
                else
                {midA=0;}       


                if(midA < 0.1) midA = 0; //防止参考电压变化造成影响
       
                sumAcur = sumAcur + midA;        //多次测量求平均
                sumVolt = sumVolt + midV;        //多次测量求平均
       
                count++;//采集次数
                if(count >= 5)
                {          
                        count = 0;
                        Acurrent =         sumAcur/5;  //Q求平均
                        if(Acurrent < 0.1) Acurrent= 0;//滤波微小波动
                        sumAcur = 0;
       
                        Volt = sumVolt/5;        //求平均
                        if(Volt<1)Volt=0;        //滤除小波动
                        sumVolt =0;


                        if(Volt>4.15)        //电压值对比
                        {BatCap = 0.99;}//容量                       
                        else if(Volt<3.4)
                        {BatCap =0;}
                        else
                        {BatCap = (Volt-3.4)/(4.15-3.4);}//正常情况下计算比例


                        sprintf(dis0,"The BatCap: %2.0f%%",BatCap*100);//打印电池容量值
                        LCD_Write_String(0,0,dis0);//显示第一行
                        sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
                        LCD_Write_String(0,1,dis0);//显示第二行                                       
                }       
                DelayMs(40);          //延时有助于稳定
        }
}




void Init_Timer0(void)
{
//**All notes can be deleted and modified**//
  TMOD |= 0x10;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
        TH0=(65536-20000)/256;                  //重新赋值 20ms
        TL0=(65536-20000)%256;
        EA=1;            //总中断打开
        ET0=1;           //定时器中断打开
        TR0=1;           //定时器开关打开
}


void Timer0_isr(void) interrupt 1
{
        TH0=(65536-20000)/256;                  //重新赋值 20ms
        TL0=(65536-20000)%256;
       
        time_20ms++;
}




void UART_Init(void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
        TL1 = TH1;  
    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分