⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cali_5460_0716.c

📁 实用的PIC单片机的单相双向电能芯片5460校准程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
//cs5460校准
#include <htc.h> 
#include "x5045.c"
#include "cali.h"
#include "rs485.h"
//#include "rs485.c"

void CLRFINT(void);
void INITPERIPH(void);
void CONFIGINT(void);
void sspwrite(unsigned char);
void sspread(unsigned char);
void write_byte(unsigned char);
void calibration(void);
void calipart(void);
void phasecom(void);
void record(void);
void delay_10ms(void);
void delay_100ms(void);
void delay_1s(void);

unsigned char content;
unsigned char txdata[3];
unsigned char rxdata[3];
unsigned char VIdcoff[12];

unsigned char VIacoff[12];

unsigned char VIacgain[12];
unsigned char enerage[3];
unsigned char phcompensation;
unsigned char dcoffcount=0;
unsigned char acoffcount=0;
unsigned char acgaincount=0;
unsigned char x5045[96];

//rs485
  unsigned  char err_cnt;
  unsigned  char vlmtab[20];                   //数据表                   
  unsigned  char vlm[8];                       //接收缓冲
  unsigned  char send[16];                      //发送数组
  unsigned  char data_count=0;
  unsigned  char receive_count = 0;
  unsigned  char send_count = 0;
  unsigned  char my_addr = 1;                   //模块地址
  unsigned  char crc_h ;
  unsigned  char crc_l ;



//常量定义
const unsigned char ee_f0[8]={0x01,0x01,0x00,0x00,0x06,0x06,0x83,0x83};
const unsigned char ee_140[4]={0x7d,0x05,0x01,0x02};


void interrupt low_priority hc4051_vee(void)
{
 TMR2IF=0;
 TMR2=0;
 PWM=!PWM;

} 


//中断接收/发送入口 
void  interrupt RS485_ISR(void)
 {
     
      TMR1ON = 1;         
      if(RCIF==1)
      	 	{
      	 		vlm[receive_count] = RCREG;
      	 		send[receive_count] = RCREG;
      	 		receive_count++;
      	 		if(receive_count>7)
      	 		  {
      	 		  	TMR1H = T1H_RELOAD;                           //清定时器
	                TMR1L = T1L_RELOAD;
	                CREN = 0;                                    //禁止接收
      	            TMR1ON = 0;                                  //关定时器
      	 		  	receive_count = 0;
      	 		  	rscomplete=1;                                //置接收完成标志
      	 		  	rserror=0;    
      	 		  	}	
      	 		}

      	 		else if(TXIF==1)
      	 			{
                        TMR1ON = 0;
      	 				if(data_count>=send_count)                   //*************i全局
      	 					{
                                
                                data_count=0;
      	 						TXEN = 0;
                                                                    //清TXIF
      	 						rs485_control=1;                              //禁止发送,485转换到接收状态
                                CREN=1;
      	 						return;
      	 						}
      	 	
                        else
      	 				{
                            data_count++;
      	 					TXREG = send[data_count];
      	 					
      	 				 }
                     }
                     else if(TMR1IF==1)
                        {
                           TMR1ON = 0;
                           TMR1H = T1H_RELOAD;
	                       TMR1L = T1L_RELOAD;
	
	                        TMR1IF = 0;
	                        err_cnt++;
	
	                         if(err_cnt>=4)
                              {
      	                        rserror = 1;                   //出现硬件故障,置故障标志位
      	                        err_cnt = 0;
                               	LED_ON ;
      	                   }

          	 	}
}

/******************************************************************/
void main()
{
   CLRFINT();
   INITPERIPH();
   CONFIGINT();   

   INH1=1;
   INH2=0;
   
   A0=1;
   A1=1;
   A2=1;
   
   LED=0;

   RES60=1;
   CS60A=0;
//   CS60B=1;
//   CS60C=1;
   calibration();                                //执行电压偏移量校准
   
//   CS60A=1;
//   CS60B=0;
//   CS60C=1;
//   calibration();

//   CS60A=1;
//   CS60B=1;
//   CS60C=0;
//   calibration();

//   while(1)
//    {
     LED=!LED;
     delay_100ms();
//    }
     LED=0;
    
   CS60A=0;
//   CS60B=1;
//   CS60C=1;
//   calipart();                                //执行电压偏移量校准
   
//   CS60A=1;
//   CS60B=0;
//   CS60C=1;
//   calipart();

//   CS60A=1;
//   CS60B=1;
//   CS60C=0;
//   calipart();
                           
//   record(); 
/******相位补偿*****************/
     phasecom(); 


   vlmtab[0]=enerage[0];
   vlmtab[1]=enerage[1];

   while(1)
     { 
      if(rscomplete==1)
         {
          rscomplete=0;
          Rs485Func();
           }
         else if(updata_phase==1)
                 {
                   updata_phase=0;
                   phasecom();
                   vlmtab[0]=enerage[0];
                   vlmtab[1]=enerage[1];
                   }
       
      delay_100ms();
      LED=!LED;
     }
}

void phasecom(void)                        //相位补偿校准
{
   unsigned char calitemp[3];

   txdata[0]=0xff;
   txdata[1]=0xff;
   txdata[2]=0xfe;
   sspwrite(0xff);
 
   txdata[0]=0x00;
   txdata[1]=0x00;
   txdata[2]=0x80;
   sspwrite(0x40);                         //复位CS5460

   txdata[0]=0xff;
   txdata[1]=0xff;
   txdata[2]=0xff;
   sspwrite(0x5e);                         //初始化状态寄存器,清状态标志位

   txdata[0]=0x00;
   txdata[1]=0x0f;
   txdata[2]=0xa0;
   sspwrite(0x4A);                          //初始化周期寄存器,设定N=4000           

   txdata[0]=phcompensation;
   txdata[1]=0xE0;
   txdata[2]=0x11;                          //设定K=1,关滤波器
   sspwrite(0x40);                          //初始化配置寄存器

 //  txdata[0]=VIdcoff[0];                  //Vdcoff                
 //  txdata[1]=VIdcoff[1];
//   txdata[2]=VIdcoff[2];
//   sspwrite(0x46);

   txdata[0]=VIdcoff[0];
   txdata[1]=VIdcoff[1];
   txdata[2]=VIdcoff[2];
   sspwrite(0x42);                         //Idcoff

//   txdata[0]=VIacoff[0];
//   txdata[1]=VIacoff[1];
//   txdata[2]=VIacoff[2];
//   sspwrite(0x60);                         //Vacoff

   txdata[0]=VIacoff[0];
   txdata[1]=VIacoff[1];
   txdata[2]=VIacoff[2];
   sspwrite(0x60);                         //Iacoff

 //  txdata[0]=VIacgain[0];
 //  txdata[1]=VIacgain[1];
 //  txdata[2]=VIacgain[2];
 //  sspwrite(0x48);                         //Vacgain

 //  txdata[0]=VIacgain[0];
//   txdata[1]=VIacgain[1];
//   txdata[2]=VIacgain[2];
//   sspwrite(0x44);                         //Vacgain

   sspwrite(0xe8);
 
   while(1)
   {delay_1s();
    LED=!LED;
    sspread(0x1e);
    
    if((rxdata[0]&0x80)!=0)break;
       }
        calitemp[0]=rxdata[0];
        calitemp[1]=rxdata[1];
        calitemp[2]=rxdata[2];
     
        sspread(0x14);                             //读能量寄存器
        enerage[0]=rxdata[0];
        enerage[1]=rxdata[1];
        enerage[2]=rxdata[2];

        txdata[0]=calitemp[0];
        txdata[1]=calitemp[0];
        txdata[2]=calitemp[0];
        sspwrite(0x5e);

    

}



//校准参数写入X5045
void record(void)
{
  unsigned int x_addr;
  unsigned int i=0;
  RESWDI();              //复位看门狗(喂狗)
  XWREN();               //写使能锁存
//  WRDI();                //写使能复位(禁止写)
  WRSR();                //写状态寄存器
//  x5045[0]=RSDR();     //读状态寄存器 
  
  for(i=0xf0;i<0xf8;i++)
    {
      w5045(i,ee_f0[i-0xf0]);
      WIPCHK();
     }

  for(i=0x100;i<0x10c;i++)
    {
      w5045(i,VIdcoff[i-0x100]);
      WIPCHK();
     }
  for(i=0x110;i<0x11c;i++)
    {
      w5045(i,VIacoff[i-0x110]);
      WIPCHK();
     }
   for(i=0x120;i<0x12c;i++)
    {
      w5045(i,VIacgain[i-0x120]);
      WIPCHK();
     }
     
   for(i=0x140;i<0x144;i++)
    {
      w5045(i,ee_140[i-0x140]);
      WIPCHK();
     }


     i=0;

   for(x_addr=0xf0;x_addr<0x144;x_addr++) 
    {
     x5045[i]=r5045(x_addr);
     i++;
     }

  }
void calibration(void)
{

   unsigned char calitemp[3];
   
   txdata[0]=0xff;
   txdata[1]=0xff;
   txdata[2]=0xfe;
   sspwrite(0xff);
 
   txdata[0]=0x00;
   txdata[1]=0x00;
   txdata[2]=0x80;
   sspwrite(0x40);                         //复位CS5460

   txdata[0]=0xff;
   txdata[1]=0xff;
   txdata[2]=0xff;
   sspwrite(0x5e);                         //初始化状态寄存器,清状态标志位

   txdata[0]=0x00;
   txdata[1]=0x0f;
   txdata[2]=0xa0;
   sspwrite(0x4A);                          //初始化周期寄存器,设定N=4000           

   txdata[0]=0x00;
   txdata[1]=0xE0;
   txdata[2]=0x11;                          //设定K=1,关滤波器
   sspwrite(0x40);                          //初始化配置寄存器

   
   txdata[0]=0x00;
   txdata[1]=0x00;
   txdata[2]=0x00;
   sspwrite(0x74);                          //屏蔽所有中断
    
/*************************************************************/
//   sspread(0x04);
//   VIacoff[acoffcount++]=rxdata[0];
//   VIacoff[acoffcount++]=rxdata[1];
//   VIacoff[acoffcount++]=rxdata[2];
/*************************************************************/

   write_byte(0xa0);                        //终止计算命令

   write_byte(0xC9);                          //电流通道直流偏移校准

//   write_byte(0xce);                         //电流AC增益校准
   while(1)
   {delay_1s();
    LED=!LED;
    sspread(0x1e);
    
    if((rxdata[0]&0x80)!=0)break;
       }

    calitemp[0]=rxdata[0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -