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

📄 cali_5460_0716.c

📁 实用的PIC单片机的单相双向电能芯片5460校准程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
    calitemp[1]=rxdata[1];
    calitemp[2]=rxdata[2];

     sspread(0x16);                             //读Irms
//     sspread(0x06);                           //读取电压通道校准值
    
     VIdcoff[dcoffcount++]=rxdata[0];
     VIdcoff[dcoffcount++]=rxdata[1];
     sspread(0x02);                           //读取电流通道DC偏移量校准值
//     sspread(0x04);                         //读取电流通道增益校准值
     VIdcoff[dcoffcount++]=rxdata[0];
     VIdcoff[dcoffcount++]=rxdata[1];
     VIdcoff[dcoffcount++]=rxdata[2];

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

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

//     txdata[0]=0x40;
//     txdata[1]=0;
//     txdata[2]=0;
//     sspwrite(0x44);
     INH1=0;
     INH2=1;
     A0=0;
     A1=0;
     A2=0;
     delay_1s();
/////////////////////////////////////
//   write_byte(0xdd);                        //电压电流通道交流偏移校准
    write_byte(0xCE);                         //电流增益校准
//    write_byte(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(0x22);                       //暂不读取校准值 
     sspread(0x16);                         //读Irms

     VIacgain[0]=rxdata[0];
     VIacgain[1]=rxdata[1];
     VIacgain[2]=rxdata[2];

     sspread(0x04);                           //读取电流通道增益校准值
//     sspread(0x20);                         //读电流通道Iacoff
     VIacgain[4]=rxdata[0];
     VIacgain[5]=rxdata[1];
     VIacgain[6]=rxdata[2];

     txdata[0]=calitemp[0];
     txdata[1]=calitemp[0];
     txdata[2]=calitemp[0];
     sspwrite(0x5e);
///////////////////////////////////////////////////
     
   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]=VIacgain[4];
   txdata[1]=VIacgain[5];
   txdata[2]=VIacgain[6];
   sspwrite(0x44);

   txdata[0]=VIdcoff[2];
   txdata[1]=VIdcoff[3];
   txdata[2]=VIdcoff[4];
   sspwrite(0x42);

   write_byte(0xe8);

     while(1)
    {delay_1s();
    LED=!LED;
    sspread(0x1e);
    if((rxdata[0]&0x80)!=0)break;
      }
    sspread(0x16);
    VIacoff[3]=rxdata[0];
    VIacoff[4]=rxdata[1];
    VIacoff[5]=rxdata[2];


}

//清中断
void CLRFINT()
{
     INTCON  = 0x00;
     INTCON2 = 0x00;
     INTCON3 = 0x00;
        PIE1 = 0x00;   
        PIE2 = 0x00;
        PIR1 = 0x00;
        PIR2 = 0x00;
        IPR1 = 0x00;
        IPR2 = 0x00;
        RCON = 0x00;
}

//端口初始化
void INITPERIPH()
{
     STATUS = 0x00;
      PORTA = 0x00;
       LATA = 0x00;
      PORTB = 0x00;
       LATB = 0x00;
      PORTC = 0x00;
       LATC = 0x00;
      PORTD = 0x00;
       LATD = 0x00;
      PORTE = 0x00;
       LATE = 0x00;

     ADCON1 = 0x07;
      TRISA = 0x00;
      TRISB = 0x21;
      TRISD = 0x00;
      TRISC = 0x90;
      TRISE = 0x00;
           
//--------------------------------------------------------------------------
//             SSP通信
//--------------------------------------------------------------------------
      TRISC &= 0xD7;
      TRISC |= 0x90;
    SSPCON1 = 0x00;                    //禁用串口,配置为IO口
    SSPSTAT = 0xC0;
//--------------------------------------------------------------------------
//             TMR1初始化
//--------------------------------------------------------------------------
    T1CON=0x80;
//--------------------------------------------------------------------------
//             TMR2初始化
//--------------------------------------------------------------------------
    T2CON=0X01;
    PR2=0xFF;
    TMR2=0;
    TMR2ON=1;
//--------------------------------------------------------------------------
//             SCI初始化
//--------------------------------------------------------------------------
    TXSTA=0X04;
    RCSTA=0X80;
    SPBRG=0X19;
    rs485_control=1;
    CREN=1;
}
void CONFIGINT(void)
{
  
  TMR2IE=1;
  
  RCIE=1;          //
  TXIE=1;
  RCIP=1;
  TXIP=1;
  TMR1IP=1;
  IPEN=1;          //使能中断高低优先级
  PEIE=1;
  GIE=1;
}


void sspwrite(unsigned char address)
{
  unsigned char i;
  write_byte(address);
  for(i=0;i<3;i++)
   {write_byte(txdata[i]);}
 
}
//读5460程序,address为读取的寄存器
void sspread(unsigned char address)
{
  unsigned char i,j;
  unsigned char temp;
  
  write_byte(address);

  for(i=0;i<3;i++)
   {
     temp=0xFE;
     for(j=0;j<8;j++)
        {
         SCLK=0;
         if(temp&0x80)SDO=1;
             else SDO=0;
            temp=temp<<1;
               
             rxdata[i]=rxdata[i]<<1;
           if(SDI)
               rxdata[i]=rxdata[i]|0x01;
           SCLK=1;
           }
        }
    }



void write_byte(unsigned char csdata)
{
  unsigned char i;

  for(i=0;i<8;i++)
   {
      if(csdata & 0x80) SDO=1;
      else SDO=0;
      SCLK=0;
      csdata=csdata<<1;
      SCLK=1;
    }
//  i=8;
//  while(i--)
//    {
//     if((csdata&(0x1<<i))==0)
//           SDO=0;
//     else
//          SDO=1;
//     SCLK=0;
 //    SCLK=1;
 //   }
 
}

//************************************************************************
//             RS485功能码识别,数据校验,生成返回数组
//************************************************************************
void Rs485Func()
{
     unsigned char t;
     
   if(my_addr!=vlm[addr])
      {
       CREN = 1;                    
       rs485_control= 1;
       return;                              //暂无延时设置
       }
   else
     {
     t=6;
     Updatacrc(vlm,t);
      
     if((crc_h==vlm[h_crc])&&(crc_l==vlm[l_crc]))
       {
        if(send[funcnum]==func03)
         {function03();             //生成03功能返回数组
          TXREG = send[data_count];
          rs485_control=0;
          TXEN=1;
          }
          else if(send[funcnum]==func06) 
                {function06();      //生成06功能返回数组
                 TXREG = send[data_count];
                 rs485_control=0;
          	     TXEN=1;            //启动发送
                 }
        } 
        else                        //校验不通过继续接收
           {
            CREN = 1;                    
            rs485_control= 1;
            return;                 //暂无延时设置
            }

      }
}

void function03(void)
{
    unsigned char t,i;
    unsigned int k;

    send[datanum]=vlm[l_regnum]*2;
    t=send[datanum];
    k=vlm[h_add];
    k=k<<8;
    k=(k|vlm[l_add]);
    k=k<<1;
    for(i=0;i<t;i++)
     {
      send[datafs+i]=vlmtab[k+i];

       }
       t=send[datanum]+3;
       Updatacrc(send,t);
       send[t]=crc_l;
       send[t+1]=crc_h;
       send_count=send[datanum]+5;
}

void function06(void)
{
   phcompensation=vlm[l_regnum];
   updata_phase=1;
 
   send_count=8;
}


	
void Updatacrc(unsigned char *pointer,unsigned char datalen)
{
	
	unsigned char i,j,tmp1;
    bit tmp2;
    crc_h = 0xff;
	crc_l = 0xff;
	
	for(i=0;i<datalen;i++)
     {
		crc_l^=*pointer++;
		for(j=0;j<8;j++)
		{
           if(crc_h&0x01==1)
            {tmp1=0x80;}
			 else 
			  {tmp1=0x00;}
		   crc_h=crc_h>>1;
		  if(crc_l&0x01==1)
            {tmp2=1;}
			 else 
			  {tmp2=0;}
			  crc_l=crc_l>>1;
			  crc_l=crc_l|tmp1;
//            CARRY=0;
//			#asm
//		    RRCF   _crc_h,F
//            RRCF   _crc_l,F
// 			#endasm
//			if(CARRY==1)
            if(tmp2==1)
			{
				crc_h^=0xA0;
				crc_l^=0x01;
			  }
						 
			}
		
		}
}



void delay_10ms()
{
 unsigned int i;
 i=1000;
 while(--i){;}
 }

void delay_100ms()
{
 unsigned int i;
 i=10000;
 while(--i){;}
 }

void delay_1s()
{
 unsigned int i;
 i=11;
 while(--i)
    {delay_100ms();}

 }

⌨️ 快捷键说明

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