ACS712如何计算电流,我的程序哪有问题请点一下
#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,还要加放大器吗
小编是测交流吗
怎么解决