微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ACS712如何计算电流,我的程序哪有问题请点一下

ACS712如何计算电流,我的程序哪有问题请点一下

时间:10-02 整理:3721RD 点击:
测量电流不变,不知道为什么?

#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include"lcd1602ac.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define ADC_POWER   0x80            //AD电源控制
#define ADC_FLAG    0x10            //AD转换完成
#define ADC_START   0x08            //AD转换控制
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks
#define ADC0    0x00 //P1.0
sfr ADC_CONTR   =   0xBC;   //AD 转换控制寄存器        
sfr ADC_RES     =   0xBD;   //AD 转换结果寄存器高         
sfr ADC_RESL    =   0xBE;   //AD 转换结果寄存器低        
sfr P1ASF       =   0x9D;

#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include"lcd1602ac.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define ADC_POWER   0x80            //AD电源控制
#define ADC_FLAG    0x10            //AD转换完成
#define ADC_START   0x08            //AD转换控制
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks
#define ADC0    0x00 //P1.0
sfr ADC_CONTR   =   0xBC;   //AD 转换控制寄存器        
sfr ADC_RES     =   0xBD;   //AD 转换结果寄存器高         
sfr ADC_RESL    =   0xBE;   //AD 转换结果寄存器低        
sfr P1ASF       =   0x9D;        //P1口模数转换功能控制寄存器
uint AD_Result;
uchar xdata AD_SBUF[6];   
uint data AD_RecSBUF[10];            //接收数据
uchar data AD_Point;
uchar data Rec,num,state;    //变量  
unsigned long S=0;
float JiZhun_AD=2.5;
float AD_Data=0.0;
ulong AD_ad=0;
//***********************************************//
//                               显示子程序
//***********************************************//
void delay5(uint i)
{
        uint j,k;
        for(j=0;j<i;j++)
        for(k=0;k<60;k++);
}
//***********************************************//
//                               显示子程序
//***********************************************//
void Delay_ADC(uint n)
{
    uint x;
    while (n--)
    {
        x = 5000;
        while (x--);
    }
}
//***********************************************//
//                               AD初始化子程序
//***********************************************//
void InitADC()
{
    P1ASF = 0x01;                                      //选择P1.0作为A/D输入通道
    ADC_RES = 0x00;                                           //转换结果清0
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;      //0x10|0x00=0x10:开电源和设置A/D转换速度
    Delay_ADC(2);            
}
///***********************************************//
//                              AD数据转换子程序
//***********************************************//
GetADCResult()           
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC0 | ADC_START;        //打开电源,420CLK周期转换,选择P1.0作输入,AD转换控制
    _nop_();                                                //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器            
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR&ADC_FLAG));       //等待转换结束=0x10 ADC_FLAG 位=1
    ADC_CONTR &= ~ADC_FLAG;              //清零转换结束标志位(ADC_FLAG 位=0)
           AD_RecSBUF[AD_Point]=(ADC_RES*4+ADC_RESL+0X03);         //返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
    AD_Point++;
        if(AD_Point>9)  AD_Point=0;              
}
void Display()
{
uchar i;
uint t;
        AD_Result=0;
        for(i=0;i<10;i++)
        AD_Result= AD_Result+ AD_RecSBUF[i];
           AD_Data = AD_Result*JiZhun_AD*2/1024;       
        AD_ad =(AD_Data-2.5)/0.1;                           //Vout(采样电压) = 2.5(0A基准) + 0.1(精确度为100mV/A)*Ip(电流)
        S=AD_ad;
    i=S/1000;                                                                                         
    t=S%1000;
    display_buf[ACCEL_XOUT+0]=i+0x30;    //取个位数
    display_buf[ACCEL_XOUT+1]='.';
    i=t/100;
    t=t%100;
    display_buf[ACCEL_XOUT+2]=i+0x30;     //取百位数
    i=t/10;
    t=t%10;
    display_buf[ACCEL_XOUT+3]=i+0x30;    //取十位数
    i=t%10;
    display_buf[ACCEL_XOUT+4]=i+0x30;    //取个位数
    display_buf[ACCEL_XOUT+5]='A';
   }
//*************************************//
//                         主程序
//*************************************//
void main()
{
           delay(500);
           initial_lcd();              //LCD屏初始化
    clr_screen();                         //LCD清屏
        InitADC();
        delay(150);
        while(1)
        { delay(500);
          disp_char();
          GetADCResult();
          Display();                          
        }  
  }

终于,解决了,检测的电流不错准。

ACS712应用电路有吗,小编

小编你好,请问你测的是直流还是交流啊

请问怎么接AD,还要加放大器吗

小编是测交流吗

怎么解决

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top