ADE7758的驱动程序
0赞
发表于 12/11/2011 11:37:06 AM
阅读(6581)
#include "HAL_ade7758.h"
void delay(void)
{
uchar i;
for(i=0;i<0xff;i++);
}
uchar ADE7758_RD(void)
{
uchar rdata;
unsigned int i;
rdata=0x0;
for(i=0;i<8;i++)
{
rdata=rdata<<1;
SCK_L();
delay();
SCK_H();
delay();
if(MISO_IN())
{
rdata=rdata | 0x01;
}
else
{
rdata=rdata & 0xfe;
}
delay();
}
SCK_L();
return rdata;
}
void ADE7758_WD(uchar dat)
{
uchar i;
uchar Temp_Data;
Temp_Data=dat;
SCK_L();
i=0;
for(i=0;i<8;i++)
{
SCK_H();
delay();
if((Temp_Data & 0x80)==0x80)
{
MOSI_H();
}
else
{
MOSI_L();
}
SCK_L();
delay();
Temp_Data=Temp_Data<<1;
}
}
void ADE7758_WDN(uchar addr,uchar idata *pnt,uchar cnt)
{
uchar i;
ADE7758_WD(addr|0x80);
for(i=0;i<cnt;i++) SpiSentByte(*pnt++);
}
void ADE7758_init(void)
{
uchar i;
CS_H();//使能高
ADE7758_WD(OPMODE|0x80);
ADE7758_WD(0x40);
for(i=0;i<50;i++);
ADE7758_WD(OPMODE|0x80);
ADE7758_WD(0x00);
ADE7758_WD(MMODE|0x80);
ADE7758_WD(0x00);
ADE7758_WD(GAIN|0x80);
ADE7758_WD(0x00);
ADE7758_WD(WAVMODE|0x80);
ADE7758_WD(0x00);
ADE7758_WD(COMPMODE|0x80);
ADE7758_WD(0x9c);
ADE7758_WD(LCYCMODE|0x80);
ADE7758_WD(0x78);
ADE7758_WD(MASK|0x80);
ADE7758_WD(0x00);
ADE7758_WD(0x0e);
ADE7758_WD(0x00);
ADE7758_WD(WDIV|0x80);
ADE7758_WD(0x08);
ADE7758_WD(VARDIV|0x80);
ADE7758_WD(0x08);
ADE7758_WD(VADIV|0x80);
ADE7758_WD(0x00);
ADE7758_WD(APCFNUM|0x80);
ADE7758_WD(0x78);
ADE7758_WD(MASK|0x80);
ADE7758_WD(0x00);
ADE7758_WD(0x0e);
ADE7758_WD(0x00);
ADE7758_WD(WDIV|0x80);
ADE7758_WD(0x08);
ADE7758_WD(VARDIV|0x80);
ADE7758_WD(0x08);
ADE7758_WD(VADIV|0x80);
ADE7758_WD(0x00);
ADE7758_WD(APCFNUM|0x80);
ADE7758_WD(0x78);
ADE7758_WD(MASK|0x80);
ADE7758_WD(0x00);
ADE7758_WD(0x0e);
ADE7758_WD(0x00);
ADE7758_WD(WDIV|0x80);
ADE7758_WD(0x08);
ADE7758_WD(VARDIV|0x80);
ADE7758_WD(0x08);
ADE7758_WD(VADIV|0x80);
ADE7758_WD(0x00);
ADE7758_WD(APCFNUM|0x80);
ADE7758_WD(0x00);
ADE7758_WD(0x00);
ADE7758_WD(APCFDEN|0x80);
ADE7758_WD(0xff);
ADE7758_WD(0xff);
ADE7758_WD(VARCFNUM|0x80);
ADE7758_WD(0x00);
ADE7758_WD(0x00);
ADE7758_WD(VARCFDEN|0x80);
ADE7758_WD(0xff);
ADE7758_WD(0xff);
for(i=x10;i<0x1a;i++)
{
read_EP(0x00,buf,0x1a); //读取EP内部的参数,该参数之前就存储好了的
ADE7758_WDN(i,buf,0x1a); //连续写寄存器操作
}
}
void ADE7758_init(void)
{
/*写相应寄存器*/
/*写12位是先写入高4位,再写入低8位*/
CS_H();//使能高
ADE7758_WD(0x80);
/*使能输出脉冲*/
ADE7758_WD(OPMODE_W8);
ADE7758_WD(0x00);
ADE7758_WD(GAIN_W8);
ADE7758_WD(0x00);
/*设置VARCF为无功功率输出脉冲*/
ADE7758_WD(WAVMODE_W8);
ADE7758_WD(0x00);
/*设置有功增益*/
ADE7758_WD(AWG_W12);
ADE7758_WD(ref[133]);
ADE7758_WD(ref[132]);
ADE7758_WD(BWG_W12);
ADE7758_WD(ref[135]);
ADE7758_WD(ref[134]);
ADE7758_WD(CWG_W12);
ADE7758_WD(ref[137]);
ADE7758_WD(ref[136]);
/*设置无功增益为默认1*/
ADE7758_WD(AVARG_W12);
ADE7758_WD(ref[139]);
ADE7758_WD(ref[138]);
ADE7758_WD(BVARG_W12);
ADE7758_WD(ref[141]);
ADE7758_WD(ref[140]);
ADE7758_WD(CVARG_W12);
ADE7758_WD(ref[143]);
ADE7758_WD(ref[142]);
/*设置输出脉冲累计的是单相还是三相*/
ADE7758_WD(COMPMODE_W8);
ADE7758_WD(0xbC);
ADE7758_WD(LCYCMODE_W8);
ADE7758_WD(0x3f);
ADE7758_WD(LINECYC_W16);
ADE7758_WD(0x0f);
ADE7758_WD(0xff);
ADE7758_WD(WDIV_W8);
ADE7758_WD(0x32);
ADE7758_WD(VARDIV_W8);
ADE7758_WD(0x32);
ADE7758_WD(VADIV_W8);
ADE7758_WD(0x32);
/*设置有功输出脉冲分频系数*/
ADE7758_WD(APCFNUM_W16);
ADE7758_WD(0x00);
ADE7758_WD(0x00);
ADE7758_WD(APCFDEN_W12);
ADE7758_WD(ref[57]);
ADE7758_WD(ref[56]);
/*设置无功输出脉冲分频系数*/
ADE7758_WD(VARCFNUM_W16);
ADE7758_WD(0x00);
ADE7758_WD(0x00);
ADE7758_WD(VARCFDEN_W12);
ADE7758_WD(ref[59]);
ADE7758_WD(ref[58]);
/*相位补偿*/
ADE7758_WD(APHCAL_W7);
ADE7758_WD(ref[144]);
ADE7758_WD(BPHCAL_W7);
ADE7758_WD(ref[146]);
ADE7758_WD(CPHCAL_W7);
ADE7758_WD(ref[148]);
/*电流增益*/
ADE7758_WD(AIGAIN_W12);
ADE7758_WD(ref[19]);
ADE7758_WD(ref[18]);
ADE7758_WD(BIGAIN_W12);
ADE7758_WD(ref[21]);
ADE7758_WD(ref[20]);
ADE7758_WD(CIGAIN_W12);
ADE7758_WD(ref[23]);
ADE7758_WD(ref[22]);
}
ADE7758_WD(OPMODE_W8);
ADE7758_WD(0x00);
ADE7758_WD(GAIN_W8);
ADE7758_WD(0x00);
/*设置VARCF为无功功率输出脉冲*/
ADE7758_WD(WAVMODE_W8);
ADE7758_WD(0x00);
/*设置有功增益*/
ADE7758_WD(AWG_W12);
ADE7758_WD(ref[133]);
ADE7758_WD(ref[132]);
ADE7758_WD(BWG_W12);
ADE7758_WD(ref[135]);
ADE7758_WD(ref[134]);
ADE7758_WD(CWG_W12);
ADE7758_WD(ref[137]);
ADE7758_WD(ref[136]);
/*设置无功增益为默认1*/
ADE7758_WD(AVARG_W12);
ADE7758_WD(ref[139]);
ADE7758_WD(ref[138]);
ADE7758_WD(BVARG_W12);
ADE7758_WD(ref[141]);
ADE7758_WD(ref[140]);
ADE7758_WD(CVARG_W12);
ADE7758_WD(ref[143]);
ADE7758_WD(ref[142]);
/*设置输出脉冲累计的是单相还是三相*/
ADE7758_WD(COMPMODE_W8);
ADE7758_WD(0xbC);
ADE7758_WD(LCYCMODE_W8);
ADE7758_WD(0x3f);
ADE7758_WD(LINECYC_W16);
ADE7758_WD(0x0f);
ADE7758_WD(0xff);
ADE7758_WD(WDIV_W8);
ADE7758_WD(0x32);
ADE7758_WD(VARDIV_W8);
ADE7758_WD(0x32);
ADE7758_WD(VADIV_W8);
ADE7758_WD(0x32);
/*设置有功输出脉冲分频系数*/
ADE7758_WD(APCFNUM_W16);
ADE7758_WD(0x00);
ADE7758_WD(0x00);
ADE7758_WD(APCFDEN_W12);
ADE7758_WD(ref[57]);
ADE7758_WD(ref[56]);
/*设置无功输出脉冲分频系数*/
ADE7758_WD(VARCFNUM_W16);
ADE7758_WD(0x00);
ADE7758_WD(0x00);
ADE7758_WD(VARCFDEN_W12);
ADE7758_WD(ref[59]);
ADE7758_WD(ref[58]);
/*相位补偿*/
ADE7758_WD(APHCAL_W7);
ADE7758_WD(ref[144]);
ADE7758_WD(BPHCAL_W7);
ADE7758_WD(ref[146]);
ADE7758_WD(CPHCAL_W7);
ADE7758_WD(ref[148]);
/*电流增益*/
ADE7758_WD(AIGAIN_W12);
ADE7758_WD(ref[19]);
ADE7758_WD(ref[18]);
ADE7758_WD(BIGAIN_W12);
ADE7758_WD(ref[21]);
ADE7758_WD(ref[20]);
ADE7758_WD(CIGAIN_W12);
ADE7758_WD(ref[23]);
ADE7758_WD(ref[22]);
}
PS:写驱动时,可以到AD官网去参考下例程
