📄 cali_5460_0716.c
字号:
//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 + -