天天

ADE7758的驱动程序

0
阅读(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]);  
     
 }  
  
 
 
 
PS:写驱动时,可以到AD官网去参考下例程