400Vhuganqi/project/400V/user/Src/RN8209D.c
2024-12-27 18:16:23 +08:00

247 lines
5.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "RN8209D.h"
unsigned int Sum = 0;
MeterData Pre_MeterData;
static unsigned short EC = 2400;
static unsigned int HFConst = 8840;
static float Kp = 3.7028E-05;
float Kv = 1;
float Ki = 0.000109495519149863;
static unsigned int GPQA = 0;//0xf528;
static unsigned char PhsA = 0;//0xcf;
float IA = 0.0;
float IB = 0.0;
float Vol = 0.0;
float PA = 0.0;
float PB = 0.0;
float EA = 0.0;
float Fr = 0.0;
void rn8209d_Init(void)
{
EMU_init_xlq(); //
// delay_us(100);
}
void EMU_init_xlq(void)
{
uint16_t data = 0;
uint32_t tmp32 = 0;
uint8_t tmp8 = 0;
tmp32 = READ_SPI(ADDeviceID2,3);//芯片ID
sprintf(Tx3_Buff,"ID2:0x%x\r\n",tmp32);
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,strlen(Tx3_Buff));
if(tmp32 != 0x00820904) //读ID
{
// printf("dev id = 0x%x erro\n",tmp32);
return;
}
// 锐能微第三代单相计量芯片RN8209C、D应用笔记v1.3.pdf4.1 上电配置步骤
Write_SPI(WriteEn,0xE5,1); // 使能写操作
Write_SPI(WriteEn,0xFA,1); // 复位
delay_us(300);
Write_SPI(WriteEn,0xE5,1); // 使能写操作
Sum= READ_SPI(0x43,1); // 校表寄存器效验和
//printf("Sum=0x%x\n", Sum);
// v1.5第17页系统控制寄存器 SYSCON(0x00)
data = 0<<6 | // ADC2ON =1表示 ADC 电流通道 B 开启;
0<<4 | // 电流通道 B 模拟增益选择: PGA=4 0 1 2 -对应1 2 4 -
0<<2 | // 电压通道模拟增益选择: PGA=1 0 1 2 3对应1 2 4 4
1<<1 |
1; // 电流通道 A 模拟增益选择: PGA=160 1 2 3对应1 2 8 16
Write_SPI(ADSYSCON,data,2);
data = READ_SPI(ADSYSCON,2);
// printf("SYSCON=0x%x\n", data);
Write_SPI(ADHFConst,HFConst,2);
data = READ_SPI(ADHFConst,2);
// printf("HFConst = 0x%x",data);
// v1.5第18页计量控制寄存器 EMUCON(0x01)
data = 0<<15 | // =029/2B 电能寄存器为累加型;
0<<14 | // HPFIBOFF=0使能 IB 通道数字高通滤波器
1<<12 | // 自定义能量累加方式选择:只累加正向功率 2BH
1<<10 | // 有功能量累加方式选择:只累加正向功率 29H
0<<6 | // HPFIAOFF=0使能 IA 通道数字高通滤波器
0<<5 | // HPFUOFF=0使能 U 通道数字高通滤波器
0<<1 | // DRUN=0关闭 QF 脉冲输出和自定义电能寄存器累加。
1<<0 ; // PRUN=1使能 PF 脉冲输出和有功电能寄存器累加
Write_SPI(ADEMUCON,data,2);
data = READ_SPI(ADEMUCON,2);
// printf("EMUCON=0x%x\n", data); // 0x1401
// v1.5第23页计量控制寄存器 EMUCON2(0x17)
data = 0<<12 | // =00:频率测量的时间为 32 个周波;
0<<7 | // =0功率及有效值寄存器更新速度为 3.495Hz
3<<4 | // =11:自定义电能输入选择为通道 B 有功功率
0<<3 ; // =0电能寄存器 2 不启用定时冻结功能,默认为读后清零寄存器。
Write_SPI(ADEMUCON2,data,2);
data = READ_SPI(ADEMUCON2,2);
// printf("EMUCON2=0x%x\n", data);
// 1.0L A通道功率增益
Write_SPI(ADGPQA,GPQA,2);
data = READ_SPI(ADGPQA,2);
// printf("ADGPQA=0x%x\n", data);
// 0.5L A通道相位
Write_SPI(ADPhsA,PhsA,1);
data = READ_SPI(ADPhsA,1);
// printf("ADPhsA=0x%x\n", data);
data = 1;
Write_SPI(ADCLKCON,data,2); //波形缓存模块时钟使能
// data = 1<<7;
// Write_SPI(ADIE,data,1); //使能波形数据更新中断
data = 1<<2|1<<1;
Write_SPI(WAVE_IE,data,1); //波形半满中断和数据覆盖错误中断
tmp8 = READ_SPI(WAVE_IF,1); //清除中断
Start_Wave(); //开启波性缓存
HAL_Delay(1);
sprintf(Tx3_Buff,"WAVE_IF:0x%x\r\n",tmp8);
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,strlen(Tx3_Buff));
HAL_Delay(1);
Write_SPI(WriteEn,0xDC,1); //关闭写操作
Sum = READ_SPI(ADEMUStatus,3); // 校表寄存器效验和
Sum &= 0x00FFFF;
// printf("Sum=0x%x\n", Sum); //
}
uint32_t READ_SPI(unsigned char Address, unsigned char Data_len)
{
uint8_t i,for_len;
uint8_t data[4];
uint32_t dwData;
Address |= 0x00;
SPI_CS_LOW(); // 开启SPI传输
HAL_SPI_Transmit(&hspi1,&Address,1,SPI_TIMEOUT);
HAL_SPI_Receive(&hspi1,data,Data_len,SPI_TIMEOUT);
SPI_CS_HIGH(); //关闭SPI传输
dwData = 0x00000000; // Read 24bit
for(i=0;i<Data_len;i++)
{
dwData =(dwData<<8)|data[i];
}
return dwData;
}
/**************************Wr_Dat_8209******************************/
void Write_SPI(unsigned char Address,uint32_t dwData, unsigned char Date_len)
{
uint8_t i,data[4];
for(i =0;i<Date_len;i++)
{
data[i] = dwData>>(Date_len-1-i)*8;
}
SPI_CS_LOW(); //开启SPI传输
Address |= 0x80;//write
HAL_SPI_Transmit(&hspi1,&Address,1,SPI_TIMEOUT);
HAL_SPI_Transmit(&hspi1,data,Date_len,SPI_TIMEOUT);
SPI_CS_HIGH(); //结束传输
delay_us(2);
}
void rn8209_ReadAll(void)
{
int tmp = 0;
unsigned int tmp32 = 0;
tmp32 = READ_SPI(ADDeviceID,3);//芯片ID
if(tmp32 != 0x00820900) //读ID
{
// printf("dev id = 0x%x erro\n",tmp32);
EMU_init_xlq();
return;
}
tmp32 = READ_SPI(ADEMUStatus,3);//校表寄存器效验和,每5秒读一次即可
if(Sum != (tmp32&0x00FFFF))
{
rn8209d_Init();
// printf("erro: sum =0x%x \r\n",tmp32);
return;
}
tmp = READ_SPI(ADURMS,3); // 电压有效值
if(tmp & 0x800000)
{
tmp = 0;
}
Vol = tmp;
tmp = READ_SPI(ADIARMS,3); // A通道的电流有效值
if (tmp & 0x800000)
{
tmp = 0;
}
IA = tmp;
// tmp32 = READ_SPI(ADUFreq,2); //pinlv
sprintf(Tx3_Buff,"URMS=%0.0f, IARMS=%0.0f\r\n",Vol,IA*Ki);
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,strlen(Tx3_Buff));
tmp = READ_SPI(ADIBRMS,3); // B通道的电流有效值
if (tmp & 0x800000)
{
tmp = 0;
}
IB = tmp*Ki;
// printf("IBreg=%d, IB=%0.2f A\n",tmp,IB);
tmp = READ_SPI(ADPowerPA,4); // A通道的功率有效值
if (tmp < 0)
{
tmp = 0xffffffff - tmp;
}
PA = tmp*Kp;
// printf("PA reg = %d,PA=%0.2f W\n",tmp,PA);
tmp = READ_SPI(ADPowerPB,4);
if (tmp & 0x80000000)
{
tmp = 0;
}
PB = tmp*Kp;
// printf("PB=%0.2f W\n",PB);
tmp = READ_SPI(ADEnergyP,3);
EA = tmp*1.0*(1/EC); // A通道的电量单位kWh
// printf("EA=%f kWh\n",EA);
tmp = READ_SPI(ADUFreq,2);
Fr=(3579545.0/8)/tmp;
// printf("Freq=%0.2f Hz\n",Fr);
}
void Start_Wave()
{
uint8_t i,data[4] = {0};
SPI_CS_LOW(); //开启SPI传输
data[0] = 0xEA;
data[1] = 0x87;
data[2] = 0<<6|1;
data[3] = ~(data[0]+data[1] +data[2]);
HAL_SPI_Transmit(&hspi1,data,4,SPI_TIMEOUT);
SPI_CS_HIGH(); //结束传输
delay_us(2);
}