cs5460a程序.docx
- 文档编号:24659952
- 上传时间:2023-05-30
- 格式:DOCX
- 页数:16
- 大小:18.27KB
cs5460a程序.docx
《cs5460a程序.docx》由会员分享,可在线阅读,更多相关《cs5460a程序.docx(16页珍藏版)》请在冰豆网上搜索。
cs5460a程序
#include
#include"I2C.h"
#include
//#include
#include
#include
#include"struct.h"
#definezhilu0
ucharcode TAB0[]="Voltage:
";
ucharcode TAB1[]="Current:
";
ucharcode TAB2[]="Power:
";
/*sbitSDI0_5460=P0^2; //040输出,5460A输入
sbitSCK0_5460=P0^1; //支路号0
sbitSDO0_5460=P0^0; //040输入,5460A输出*/
sbitSDI0_5460=P0^3;
sbitSDO0_5460=P0^1;
sbitSCK0_5460=P0^5;
sbitCS_5460=P0^4;
/***************************************全局变量定义**************************************/
unsignedchar rec_data[3]={0};
unsignedchar send_data[3]={0};
unsignedcharVOLT_AC_OFF_CONFIG[4];
unsignedcharVOLT_RMS[4],I_RMS[4],I_RMS_OFFSET[4];
unsignedcharU_RMS_GAIN[4],I_RMS_OFFSET_1[4];
unsignedintflag1,time; //标志位flag,定时时间到标志time
unsignedintcount1;
unsignedcharIIC_DATA; //24C16存储数据
unsignedcharadd_II_count,add_UU_count,add_PW_count;
unsignedintPW_INT[3];
unsignedcharUU_COUNT;
unsignedcharUU_REC_COUNT;
unsignedintUU_RMS_SAVE;
unsignedcharUU_MAX;
unsignedcharUU_MIN;
unsignedinti;
unsignedintUU_RMS;
unsignedintII_RMS;
unsignedcharPEAK; //峰值系数
unsignedcharstatus_data[3]={0};
unsignedintstatus_high8;
//unsignedcharU_real[3],I_real[3],PW_real[3];
//unsignedcharzhilu;//支路号
floatPW_float;//功率值真实数据(浮点数)
floatII_float;//电流值真实数据
floatUU_float;//电压值真实数据
floatPEAK_float;//峰值系数真实数据
unsignedcharbuf;
unsignedchartt;
bittime2;
voidmain()
{
flag1=0; //定时变量
time=0; //定时变量 IIC_DATA=0; //存储器变量
add_II_count=0; //存储电量的地址
add_UU_count=0;
add_PW_count=0; count1=0; //发送报文计数
UU_COUNT=0;
UU_REC_COUNT=0;
status_high8=0;
//***************初始化接收和发送数组*********************//
for(i=0;i<3;i++) {
rec_data =0;
send_data =0; } CS_5460=0;
cs5460a_init(); //0支路初始化
//*****************************定时器1***********************************//
TMOD=0x21; //工作方式1,8位定时器自动重装载 工作方式0,16位定时器
TH1=0xFA; //波特率9600bit/s
TL1=0xFA;
TH0 =0x3c;
TL0 =0xb0;
SM0=0; //串口在工作方式1
SM1=1; PCON=0x80; //SMOD=1
TR0=1;
TR1=1; //定时器0允许
REN=1; //接收允许
ET0=1; //允许定时器0中断 EA=1;
ES=1; //串口中断允许
RI=0;
// delay_ms(10);
/***初始化完毕后,电流、电压有效值需要空读一次**
Wait_DRDY_High(zhilu); cs5460_READ(zhilu,0x16);
Clear_DRDY(zhilu);
Wait_DRDY_High(zhilu); cs5460_READ(zhilu,0x18);
Clear_DRDY(zhilu); */
//jiaozhun(); //CS5460A校准函数
while
(1)
{ if(time2==1)
{
time2=0;
// Wait_DRDY_High(); //等待电压转换完成
// cs5460_READ(0x18); //上一周期电压有效值 //00011000 地址12
// inode[zhilu].UU[0]=rec_data[0];
// _delay_us(10);
ES=0;
SBUF=P0;
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].UU[0];
//SBUF=0x10;
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].UU[1];
//SBUF=0x10;
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].UU[2];
//SBUF=0x10;
while(!
TI);
TI=0; _delay_us(10);
_delay_us(100);
SBUF=inode[zhilu].II[0];
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].II[1];
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].II[2];
while(!
TI);
TI=0; _delay_us(10);
_delay_us(100);
SBUF=inode[zhilu].PW[0];
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].PW[1];
while(!
TI);
TI=0; _delay_us(10);
SBUF=inode[zhilu].PW[2];
while(!
TI);
TI=0; _delay_us(10);
ES=1; //打开串口中断
_delay_us(10);
} }
}
/**********************************************************************
*CS5460A初始化函数
**********************************************************************/
voidcs5460a_init()
{
write_command(0xff); //sys1
write_command(0xff); //sys1
write_command(0xff); //sys1
write_command(0xfe); //sys0
/*************后续的*****************/
cs5460_write(0x40); //配置寄存器
send_data[0]=0x00;//增益为Gi=10
// send_data[0]=0x01;//增益为Gi=50
send_data[1]=0x00;
// send_data[2]=0x61;//打开电流、电压滤波器,
send_data[2]=0xe1;//打开电流、电压滤波器
//采样数据稳定关键:
// send_data[2]=0x01; //关闭电流、电压滤波器
/* send_data[0]=0xff; //写数据3,16~23位,高字节 send_data[1]=0xff; //写数据2,8~f位,中低字节 send_data[2]=0xff; //写数据1,低0~7位,低字节*/ cs5460_write(0x5e); //清除状态寄存器
send_data[0]=0x00; send_data[1]=0x00; send_data[2]=0x00; cs5460_write(0x74); //写中断屏蔽寄存器 send_data[0]=0x00; send_data[1]=0x00; send_data[2]=0x00; cs5460_write(0x78); //写控制寄存器 send_data[0]=0x00; send_data[1]=0x34; send_data[2]=0x9c; cs5460_write(0x4c); //写EOUT脉冲输出寄存器
send_data[0]=0x00; send_data[1]=0x0f; //计算周期为1s,得到N=4000 send_data[2]=0xa0;
// send_data[1]=0x01; //每秒钟计算10次,即每秒钟采样10次,计算得到N=400
// send_data[2]=0x90;
//此时读电能寄存器的值就是有功功率 cs5460_write(0x4A); //写CYCLECOUNT寄存器 _delay_us(10);
// Wait_DRDY_High(n);
cs5460_READ(0x1e); //读状态寄存器 send_data[0]=rec_data[0]; send_data[1]=rec_data[1]; send_data[2]=rec_data[2]; cs5460_write(0x5e); //写状态寄存器
_delay_us(10); write_command(0xe8); //启动CS5460A
}
/**********************************************************************
*CS5460A清状态寄存器最高位DRDY位
*********************************************************************
voidClear_DRDY(unsignedcharn)
{ send_data[0]=0xff; //写数据3,16~23位,高字节 send_data[1]=0xff; //写数据2,8~f位,中低字节 send_data[2]=0xff; //写数据1,低0~7位,低字节 cs5460_write(n,0x5e);//写指令,状态寄存器
}*/
/**********************************************************************
*CS5460A等待状态寄存器最高位DRDY位置1,表明转换完毕
**********************************************************************/
voidWait_DRDY_High()
{ while
(1) { cs5460_READ(0x1e); //读状态寄存器
if((rec_data[0]&0x80)!
=0)break; //判断DRDY位,转换结束就置位。
}
}
/*voidjiaozhun(unsignedcharn)
{
Clear_DRDY();
write_command(n,0xa0); //发送POWER_HALT命令 _delay_ms
(1);
====================================================
第二阶段:
校准交流增益寄存器。
方法:
将电压和电流输入加
至满幅,读取增益寄存器的值。
-----------------------------------------------------
Clear_DRDY();
write_command(0xce); //写电流校准命令寄存器 _delay_ms
(1); Wait_DRDY_High(); //等待校准完成
cs5460_READ(0x04); //******读电流增益寄存器*******
_delay_ms
(1);
Clear_DRDY();
write_command(0xd6); //写电压校准命令寄存器 _delay_ms
(1); Wait_DRDY_High(); //等待校准完成
cs5460_READ(0x08); //******读电压增益寄存器********
_delay_ms
(1);
_delay_ms
(1); Clear_DRDY();
write_command(n,0xcd); //写电流校准命令寄存器 _delay_ms(10); Wait_DRDY_High(); //等待校准完成
cs5460_READ(n,0x20); //读电流偏置寄存器
_delay_ms(10); Clear_DRDY();
write_command(n,0xd5); //写电压校准命令寄存器 _delay_ms(10); Wait_DRDY_High(); //等待校准完成
cs5460_READ(n,0x22); //读电压偏置寄存器
_delay_ms(10); _delay_ms
(1);
} */
/**********************************************************************
*CS5460A写命令函数
**********************************************************************/
voidwrite_command(unsignedcharcs5460_command)
{
unsignedchardatai;
for(i=0;i<8;i++)
{ SDI0_5460=(bit)(cs5460_command&0x80);
// SDI_5460=(bit)(cs5460_command&0x80);
_delay_us
(1);
SCK0_5460=0;
// SCK_5460=1; _delay_us
(1);
SCK0_5460=1;
// SCK_5460=0;
_delay_us
(1); cs5460_command=cs5460_command<<1;
}
}
/**********************************************************************
*CS5460A读函数
**********************************************************************/
voidcs5460_READ(unsignedcharcs5460_command)
{
unsignedchardatai,j;
unsignedchartemp;
bitc_temp;
write_command(cs5460_command);
for(i=0;i<3;i++)
{
temp=0xfe;
for(j=0;j<8;j++)
{
SCK0_5460=0;
// SCK_5460=1; //时钟拉低
_delay_us
(1);
/************下面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- cs5460a 程序