|
#ifndef _CS5463_H
#define _CS5463_H
#include "stm32f10x.h"
#include <stdio.h>
//獲取cs5463參數(shù)結(jié)構(gòu)體
typedef struct{
uint32_t DianYa; //電壓
uint32_t DianLiu; //電流
uint32_t YouGGL; //有功功率
uint32_t WenDu; //溫度
uint32_t YinShu; //功率因數(shù)
uint8_t GetON_flag; //獲取結(jié)束標(biāo)志
}CS5463Zhi;
extern CS5463Zhi CS5463zhi; //定義cs5463一個(gè)變量
extern uint8_t sta; //芯片狀態(tài)
#define CS5463_VScale 516 //計(jì)算電壓比例,220V*250mv/110mv=500V
#define CS5463_IScale (250/10) //計(jì)算電流比例
#define READ_MASK 0xBF //讀寄存器時(shí)的屏蔽碼,與(寫)地址相與
#define CMD_SYNC0 0XFE //結(jié)束串口重新初始化
#define CMD_SYNC1 0XFF //開始串口重新初始化
#define REG_CONFR 0x40 //配置
#define REG_CYCCONT 0x4A //一個(gè)計(jì)算周期的A/D轉(zhuǎn)換數(shù)
#define REG_STATUSR 0x5E //狀態(tài)
#define REG_MODER 0x64 //操作模式
#define REG_MASKR 0x74 //中斷屏蔽
#define REG_CTRLR 0x78 //控制
#define CMD_STARTC 0XE8 //執(zhí)行連續(xù)計(jì)算周期
#define REG_VRMSR 0X18 //VRMS
#define REG_IRMSR 0X16 //IRMS
#define REG_Pactive 0X14 //Pactive
/*命令定義-結(jié)尾*******************************/
//SPI接口
#define CS5463_SPIx SPI1 //SPI 號(hào)
#define CS5463_SPI_APBxClock_FUN RCC_APB2PeriphClockCmd //SPI 時(shí)鐘總線
#define CS5463_SPI_CLK RCC_APB2Periph_SPI1 //SPI 時(shí)鐘
//CS5463(1) CS(NSS)--PA2
#define CS5463_SPI_CS_APBxClock_FUN RCC_APB2PeriphClockCmd //GPIO 時(shí)鐘總線
#define CS5463_1_SPI_CS_CLK RCC_APB2Periph_GPIOA
#define CS5463_1_SPI_CS_PORT GPIOA
#define CS5463_1_SPI_CS_PIN GPIO_Pin_2
//CS5463(1)INT ---PA1
#define CS5463_1_INT_CLK RCC_APB2Periph_GPIOA
#define CS5463_1_INT_PORT GPIOA
#define CS5463_1_INT_PIN GPIO_Pin_1
//CS5463(1)RESET ---PA0
#define CS5463_1_RESET_CLK RCC_APB2Periph_GPIOA
#define CS5463_1_RESET_PORT GPIOA
#define CS5463_1_RESET_PIN GPIO_Pin_0
//CS5463(2) CS(NSS)--PA11
#define CS5463_2_SPI_CS_CLK RCC_APB2Periph_GPIOA
#define CS5463_2_SPI_CS_PORT GPIOA
#define CS5463_2_SPI_CS_PIN GPIO_Pin_11
//CS5463(2)INT ---PA12
#define CS5463_2_INT_CLK RCC_APB2Periph_GPIOA
#define CS5463_2_INT_PORT GPIOA
#define CS5463_2_INT_PIN GPIO_Pin_12
//CS5463(2)RESET ---PA13
#define CS5463_2_RESET_CLK RCC_APB2Periph_GPIOA
#define CS5463_2_RESET_PORT GPIOA
#define CS5463_2_RESET_PIN GPIO_Pin_13
//SPI1_SCK---PA5
#define CS5463_SPI_SCK_APBxClock_FUN RCC_APB2PeriphClockCmd
#define CS5463_SPI_SCK_CLK RCC_APB2Periph_GPIOA
#define CS5463_SPI_SCK_PORT GPIOA
#define CS5463_SPI_SCK_PIN GPIO_Pin_5
//SPI1_MISO--PA6
#define CS5463_SPI_MISO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define CS5463_SPI_MISO_CLK RCC_APB2Periph_GPIOA
#define CS5463_SPI_MISO_PORT GPIOA
#define CS5463_SPI_MISO_PIN GPIO_Pin_6
//SPI1_MOSI---PA7
#define CS5463_SPI_MOSI_APBxClock_FUN RCC_APB2PeriphClockCmd
#define CS5463_SPI_MOSI_CLK RCC_APB2Periph_GPIOA
#define CS5463_SPI_MOSI_PORT GPIOA
#define CS5463_SPI_MOSI_PIN GPIO_Pin_7
//片選引腳操作
#define SPI_CS5463_CS_1_LOW() GPIO_ResetBits( CS5463_1_SPI_CS_PORT, CS5463_1_SPI_CS_PIN )
#define SPI_CS5463_CS_2_LOW() GPIO_ResetBits( CS5463_2_SPI_CS_PORT,CS5463_2_SPI_CS_PIN)
#define SPI_CS5463_CS_1_HIGH() GPIO_SetBits( CS5463_1_SPI_CS_PORT, CS5463_1_SPI_CS_PIN )
#define SPI_CS5463_CS_2_HIGH() GPIO_SetBits( CS5463_2_SPI_CS_PORT, CS5463_2_SPI_CS_PIN )
#define cs5463_1_INT_0 GPIO_ResetBits( CS5463_1_INT_PORT, CS5463_1_INT_PIN )
#define cs5463_1_INT_1 GPIO_SetBits( CS5463_1_INT_PORT, CS5463_1_INT_PIN )
#define cs5463_1_RESET_0 GPIO_ResetBits( CS5463_1_RESET_PORT, CS5463_1_RESET_PIN )
#define cs5463_1_RESET_1 GPIO_SetBits( CS5463_1_RESET_PORT, CS5463_1_RESET_PIN )
#define cs5463_2_INT_0 GPIO_ResetBits( CS5463_2_INT_PORT, CS5463_2_INT_PIN )
#define cs5463_2_INT_1 GPIO_SetBits( CS5463_2_INT_PORT, CS5463_2_INT_PIN )
#define cs5463_2_RESET_0 GPIO_ResetBits( CS5463_2_RESET_PORT, CS5463_2_RESET_PIN )
#define cs5463_2_RESET_1 GPIO_SetBits( CS5463_2_RESET_PORT, CS5463_2_RESET_PIN )
void SPI_CS5463_Init(void);
u8 SPI_CS5463_SendByte(u8 byte);
void CS5463Cmd(int cs_index,uint8_t cmd);
void CS5463WriteReg(int cs_index,uint8_t addr,uint8_t *p);
void CS5463ReadReg(int cs_index,uint8_t addr,uint8_t *p);
void CS5463_ResetStatusReg(int cs_index);
void CS5463_GetVoltRMS(int cs_index); //讀取電壓有效值
void CS5463_GetCurrentRMS(int cs_index); //讀取電流有效值
void CS5463_GetPactiveRMS(int cs_index); //讀取有功功率值
void CS5463_GetPowerFactor(int cs_index); //讀取功率因數(shù)值
void CS5463_GetTemperature(int cs_index); //讀取溫度值
_Bool CS5463_Init(int cs_index);
uint8_t CS5463_GetStatusReg(int cs_index);
void Get_Zhi(int cs_index); //獲取全部值
/*通訊等待時(shí)間處理*/
#define SPIT_FLAG_TIMEOUT ((uint32_t)0x1000) //快速通訊
#define SPIT_LONG_TIMEOUT ((uint32_t)(10 * SPIT_FLAG_TIMEOUT)) //慢速通訊
#define CS5463_ERROR(fmt,arg...) printf("<<-FLASH-ERROR->> "fmt"\n",##arg)//SPI通訊錯(cuò)誤提醒
#endif
#include "cs5463.h"
#include "bsp_usart.h"
#include "delay.h"
static __IO uint32_t SPITimeout = SPIT_LONG_TIMEOUT;
static uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);
static uint8_t RX_Buff[4]; //CS5463讀寫緩沖區(qū)
uint8_t sta; //芯片狀態(tài)
CS5463Zhi CS5463zhi;
/**
* CS5463 初始化
*/
void SPI_CS5463_Init(void)
{
SPI_InitTypeDef SPI_InitStructure; //SPI 結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_InitStructure; //GPIO 結(jié)構(gòu)體
/* 打開SPI時(shí)鐘 */
CS5463_SPI_APBxClock_FUN ( CS5463_SPI_CLK, ENABLE );
/* 打開SPI的GPIO時(shí)鐘 */
CS5463_SPI_CS_APBxClock_FUN ( CS5463_1_SPI_CS_CLK, ENABLE );
//cs5463(1) ---PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MZ 推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = CS5463_1_SPI_CS_PIN;
GPIO_Init(CS5463_1_SPI_CS_PORT, &GPIO_InitStructure);
//CS5463(1)INT ---PA1
GPIO_InitStructure.GPIO_Pin = CS5463_1_INT_PIN;
GPIO_Init(CS5463_1_INT_PORT, &GPIO_InitStructure);
//CS5463(1)RESET ---PA0
GPIO_InitStructure.GPIO_Pin =CS5463_1_RESET_PIN;
GPIO_Init(CS5463_1_RESET_PORT, &GPIO_InitStructure);
//cs5463(2) ---PA11
GPIO_InitStructure.GPIO_Pin = CS5463_2_SPI_CS_PIN;
GPIO_Init(CS5463_2_SPI_CS_PORT, &GPIO_InitStructure);
//CS5463(2)INT ---PA12
GPIO_InitStructure.GPIO_Pin = CS5463_2_INT_PIN;
GPIO_Init(CS5463_2_INT_PORT, &GPIO_InitStructure);
//CS5463(2)RESET ---PA13
GPIO_InitStructure.GPIO_Pin = CS5463_2_RESET_PIN;
GPIO_Init(CS5463_2_RESET_PORT, &GPIO_InitStructure);
//SPI_CLK
GPIO_InitStructure.GPIO_Pin = CS5463_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽復(fù)用
GPIO_Init(CS5463_SPI_SCK_PORT, &GPIO_InitStructure);
//SPI_MISO
GPIO_InitStructure.GPIO_Pin = CS5463_SPI_MISO_PIN;
GPIO_Init(CS5463_SPI_MISO_PORT, &GPIO_InitStructure);
//SPI_MOSI
GPIO_InitStructure.GPIO_Pin = CS5463_SPI_MOSI_PIN;
GPIO_Init(CS5463_SPI_MOSI_PORT, &GPIO_InitStructure);
//初始化前,拉高所有芯片(不通訊)
SPI_CS5463_CS_1_HIGH();
SPI_CS5463_CS_2_HIGH();
/* SPI 設(shè)置 */
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //雙線模式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設(shè)置為主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //16位格式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL = 1
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA = 1
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //CS 軟件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //通訊速度
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7; //7位效驗(yàn)
SPI_Init(CS5463_SPIx , &SPI_InitStructure); //初始化SPI
SPI_Cmd(CS5463_SPIx , ENABLE); //使能SPI
}
#if 0
//發(fā)送個(gè)字節(jié)
short SPI_CS5463_SendHalfWord(u16 HalfWord)
{
SPITimeout = SPIT_FLAG_TIMEOUT;
/* 等待上次發(fā)送完成 */
while (SPI_I2S_GetFlagStatus(SPI1 , SPI_I2S_FLAG_TXE) == RESET)
{
if((SPITimeout--) == 0)
{
printf("SPI上次發(fā)送失敗-------\n");
return SPI_TIMEOUT_UserCallback(2);
}
}
/* 發(fā)送一個(gè)字節(jié)數(shù)據(jù) */
SPI_I2S_SendData(SPI1 , HalfWord);
SPITimeout = SPIT_FLAG_TIMEOUT;
/* 等待本次發(fā)送數(shù)據(jù)完成 */
while (SPI_I2S_GetFlagStatus(SPI1 , SPI_I2S_FLAG_RXNE) == RESET)
{
if((SPITimeout--) == 0)
{
printf("SPI發(fā)送數(shù)據(jù)失敗-------\n");
return SPI_TIMEOUT_UserCallback(3);
}
}
/* 接受從設(shè)備返回?cái)?shù)據(jù)*/
return SPI_I2S_ReceiveData(SPI1);
}
/*
* @brief 讀取cs5463數(shù)據(jù)
* @param :
* cs_index :從設(shè)備號(hào)
* int16_t *buff:保存讀取的數(shù)據(jù)
* @retval 無(wú)
*/
void Cs5463Read(int cs_index ,int16_t *buff )
{
//通訊開始
if( cs_index == 1){
SPI_CS5463_CS_1_LOW();
}
if( cs_index == 2){
SPI_CS5463_CS_2_LOW();
}
SPI_CS5463_SendHalfWord(0x0000);
//通訊結(jié)束
if( cs_index == 1){
SPI_CS5463_CS_1_HIGH();
}
if( cs_index == 2){
SPI_CS5463_CS_2_HIGH();
}
}
#endif
/**
* @brief 使用SPI發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
* @param byte:要發(fā)送的數(shù)據(jù)
* @retval 返回接收到的數(shù)據(jù)
*/
u8 SPI_CS5463_SendByte(u8 byte)
{
SPITimeout = SPIT_FLAG_TIMEOUT;
/* 等待發(fā)送緩沖區(qū)為空,TXE事件 */
while (SPI_I2S_GetFlagStatus(CS5463_SPIx , SPI_I2S_FLAG_TXE) == RESET)
{
if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
}
/* 寫入數(shù)據(jù)寄存器,把要寫入的數(shù)據(jù)寫入發(fā)送緩沖區(qū) */
SPI_I2S_SendData(CS5463_SPIx , byte);
SPITimeout = SPIT_FLAG_TIMEOUT;
/* 等待接收緩沖區(qū)非空,RXNE事件 */
while (SPI_I2S_GetFlagStatus(CS5463_SPIx , SPI_I2S_FLAG_RXNE) == RESET)
{
if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
}
/* 讀取數(shù)據(jù)寄存器,獲取接收緩沖區(qū)數(shù)據(jù) */
return SPI_I2S_ReceiveData(CS5463_SPIx );
}
/**
* @brief 向CS5463發(fā)送 寫使能 命令
* @param none
* @retval none
*/
void CS5463Cmd(int cs_index,uint8_t cmd)
{
//通訊開始
if( cs_index == 1){
SPI_CS5463_CS_1_LOW();
}
if( cs_index == 2){
SPI_CS5463_CS_2_LOW();
}
/* 發(fā)送寫使能命令*/
SPI_CS5463_SendByte(cmd);
//通訊結(jié)束
if( cs_index == 1){
SPI_CS5463_CS_1_HIGH();
}
if( cs_index == 2){
SPI_CS5463_CS_2_HIGH();
}
}
/*
函數(shù)名稱:CS5463WriteReg
函數(shù)功能:CS5463寫寄存器函數(shù)
函數(shù)參數(shù):無(wú)
*/
void CS5463WriteReg(int cs_index,uint8_t addr,uint8_t *p)
{
char i;
//通訊開始
if( cs_index == 1){
SPI_CS5463_CS_1_LOW();
}
if( cs_index == 2){
SPI_CS5463_CS_2_LOW();
}
SPI_CS5463_SendByte(addr);
for(i = 0; i < 3; i++)
SPI_CS5463_SendByte((*(p + i)));
//通訊結(jié)束
if( cs_index == 1){
SPI_CS5463_CS_1_HIGH();
}
if( cs_index == 2){
SPI_CS5463_CS_2_HIGH();
}
}
/*************************************************************
** 函數(shù)名稱:CS5463ReadReg
** 函數(shù)功能:CS5463讀寄存器函數(shù)
** 函數(shù)參數(shù):無(wú)
** 創(chuàng)建時(shí)間:2009-9-14
** 第一次修改時(shí)間:無(wú)
**************************************************************/
void CS5463ReadReg(int cs_index,uint8_t addr,uint8_t *p)
{
char i;
unsigned char data;
//通訊開始
if( cs_index == 1){
SPI_CS5463_CS_1_LOW();
}
if( cs_index == 2){
SPI_CS5463_CS_2_LOW();
}
SPI_CS5463_SendByte(addr);
for(i = 0; i < 3; i++)
{
data=SPI_CS5463_SendByte(0xff);
(*(p + i)) = data;
}
//通訊結(jié)束
if( cs_index == 1){
SPI_CS5463_CS_1_HIGH();
}
if( cs_index == 2){
SPI_CS5463_CS_2_HIGH();
}
return ;
}
/*
函數(shù)名稱:CS5463Init
函數(shù)功能:CS5463復(fù)位和初始化函數(shù)
函數(shù)參數(shù):無(wú)
*/
_Bool CS5463_Init(int cs_index)
{
//通訊開始
if( cs_index == 1){
SPI_CS5463_CS_1_LOW();
}
if( cs_index == 2){
SPI_CS5463_CS_2_LOW();
}
Delay_ms(200);
//通訊結(jié)束
if( cs_index == 1){
SPI_CS5463_CS_1_HIGH();
}
if( cs_index == 2){
SPI_CS5463_CS_2_HIGH();
}
Delay_ms(100);
//發(fā)送同步序列
RX_Buff[0] = CMD_SYNC1;
RX_Buff[1] = CMD_SYNC1;
RX_Buff[2] = CMD_SYNC0;
CS5463WriteReg(cs_index,CMD_SYNC1,RX_Buff); //#define CMD_SYNC1 0XFF //開始串口重新初始化
//----------------------
//初始化--配置寄存器
//相位補(bǔ)償為PC[6:0]=[0000000];
//電流通道增益為Igain=10;
//EWA=0;
//INT中斷為低電平有效IMODE:IINV=[00]
//iCPU=0
//K[3:0]=[0001]
RX_Buff[0] = 0x00;
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x01;
CS5463WriteReg(cs_index,REG_CONFR,RX_Buff); // #define REG_CONFR 0x40 //配置
//----------------------
//初始化--操作寄存器
RX_Buff[0] = 0x00; //B0000_0000; //這是什么鬼 可以這樣嗎?
RX_Buff[1] = 0x00;//B0000_0000;
RX_Buff[2] = 0x60;//B0110_0000;
CS5463WriteReg(cs_index,REG_MODER,RX_Buff); //#define REG_MODER 0x64 //操作模式
//----------------------
//初始化--電流 交流偏置 校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_IACBIAS,0xA1);
// CS5463WriteReg(REG_IACOFF,RX_Buff);
//----------------------
//初始化--電流 增益校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_IACGAIN,0xA1);
// CS5463WriteReg(REG_IGN,RX_Buff);
//----------------------
//初始化--電壓 交流偏置 校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_VACBIAS,0xA1);
// CS5463WriteReg(REG_VACOFF,RX_Buff);
//----------------------
//初始化--電壓 增益校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_VACGAIN,0xA1);
// CS5463WriteReg(REG_VGN,RX_Buff);
//----------------------
RX_Buff[0] = 0x00;
RX_Buff[1] = 0x0F;
RX_Buff[2] = 0xA0; //#define REG_CYCCONT 0x4A //一個(gè)計(jì)算周期的A/D轉(zhuǎn)換數(shù)
CS5463WriteReg(cs_index,REG_CYCCONT,RX_Buff); //初始化--CYCLE COUNT 寄存器,4000
//----------------------
//初始化--脈沖速率寄存器
// RX_Buff[0] = 0x00;
// RX_Buff[1] = 0x34;
// RX_Buff[2] = 0x9C;
// CS5463WriteReg(REG_PULRATE,RX_Buff);
//----------------------
RX_Buff[0] = 0xFF;
RX_Buff[1] = 0xFF;
RX_Buff[2] = 0xFF;
CS5463WriteReg(cs_index,REG_STATUSR,RX_Buff); //初始化--狀態(tài)寄存器 #define REG_STATUSR 0x5E //狀態(tài)
//----------------------
RX_Buff[0] = 0x80; //開電流、電壓、功率測(cè)量完畢中斷
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x80; //開溫度測(cè)量完畢中斷
CS5463WriteReg(cs_index,REG_MASKR,RX_Buff); //初始化--中斷屏蔽寄存器 #define REG_MASKR 0x74 //中斷屏蔽
//----------------------
RX_Buff[0] = 0x00;
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x00;
CS5463WriteReg(cs_index,REG_CTRLR,RX_Buff); //初始化--控制寄存器 #define REG_CTRLR 0x78 //控制
//----------------------
CS5463Cmd(cs_index,CMD_STARTC); //啟動(dòng)連續(xù)轉(zhuǎn)換 #define CMD_STARTC 0XE8 //執(zhí)行連續(xù)計(jì)算周期
Delay_ms(500);
return 1;
}
/*************************************************************
** 函數(shù)名稱:CS5463_ResetStatusReg
** 函數(shù)功能:復(fù)位狀態(tài)寄存器函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_ResetStatusReg(int cs_index)
{
RX_Buff[0] = 0xFF;
RX_Buff[1] = 0xFF;
RX_Buff[2] = 0xFF;
CS5463WriteReg(cs_index,0x5E,RX_Buff); //復(fù)位狀態(tài)寄存器 #define REG_STATUSR 0x5E //狀態(tài)
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetVoltRMS
** 函數(shù)功能:讀取電壓有效值函數(shù)
**************************************************************/
void CS5463_GetVoltRMS(int cs_index) //這個(gè)函數(shù)啥意思? PT2017-2-12 電壓顯示OK
{
float G = 0.5,result; //typedef float fp32; 就是浮點(diǎn)類型
uint8_t temp,i,j; // byte
CS5463ReadReg(cs_index,REG_VRMSR,RX_Buff); //讀取電壓有效值 這里就讀到了嗎? 是
//SndCom1Data(RX_Buff,3); //#define REG_VRMSR 0x58 //電壓有效值 電壓有效值0x58嗎?是寫
i = 0;
result = 0;
while(i<3)
{
temp = RX_Buff[i];
j = 0;
while(j<8)
{
if(temp&0x80)
{
result += G;
}
temp <<= 1;
j++;
G = G/2;
}
i++;
} //電壓在220時(shí)取樣電壓為78mv
result = result*CS5463_VScale;//V_Coff; //計(jì)算電壓值220V*250mv/(110mv/1.414)=704.8V 可以暫時(shí)不用
// if(result<=100)return; //如果測(cè)量讀出電壓小于100V,確認(rèn)讀數(shù)錯(cuò)誤
result *= 1000; //單位為mV(毫伏) 12345mv 5位你怎么顯示
CS5463zhi.DianYa = (uint32_t)result;
if(CS5463zhi.DianYa<10000)
{
CS5463zhi.DianYa=0;
}
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetCurrentRMS
** 函數(shù)功能:讀取電流有效值函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_GetCurrentRMS(int cs_index)
{
float G = 0.5,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,REG_IRMSR,RX_Buff); //讀取電流有效值
//SndCom1Data(RX_Buff,3);
i = 0;
result = 0;
while(i<3)
{
temp = RX_Buff[i];
j = 0;
while(j<8)
{
if(temp&0x80)
{
result += G;
}
temp <<= 1;
j++;
G = G/2;
}
i++;
}
result = result*CS5463_IScale;//I_Coff; //計(jì)算電流值 暫時(shí)不用
result *= 1000; //單位mA(毫安) 12345ma
CS5463zhi.DianLiu =(uint32_t) result;
if(CS5463zhi.DianLiu <5)
{
CS5463zhi.DianLiu =0;
}
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetPactiveRMS
** 函數(shù)功能:讀取有功功率函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_GetPactiveRMS(int cs_index)
{
float G = 1.0,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,0x14,RX_Buff); //讀取有功功率REG_Pactive
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
if(temp&0x80) //如果為負(fù)數(shù),計(jì)算原碼
{
RX_Buff[0] = ~RX_Buff[0]; //本來(lái)為取反+1,這里因?yàn)榫鹊脑,?1
RX_Buff[1] = ~RX_Buff[1];
RX_Buff[2] = ~RX_Buff[2];
}
i = 0;
result = 0;
while(i<3)
{
temp = RX_Buff[i];
j = 0;
while(j<8)
{
if(temp&0x80)
{
result += G;
}
temp <<= 1;
j++;
G = G/2;
}
i++;
}
// result = result*P_Coff; //計(jì)算功率,單位W(瓦特)
// result = Vrms*Irms; ////////直接計(jì)算功率
result = result*13125;
CS5463zhi.YouGGL = (uint32_t)result;
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetPowerFactor
** 函數(shù)功能:讀取功率因數(shù)函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_GetPowerFactor(int cs_index)
{
float G = 1.0,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,0x32,RX_Buff); //讀取功率因數(shù)
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
if(temp&0x80) //如果為負(fù)數(shù),計(jì)算原碼
{
RX_Buff[0] = ~RX_Buff[0]; //本來(lái)為取反+1,這里因?yàn)榫鹊脑,?1
RX_Buff[1] = ~RX_Buff[1];
RX_Buff[2] = ~RX_Buff[2];
}
i = 0;
result = 0;
while(i<3)
{
temp = RX_Buff[i];
j = 0;
while(j<8)
{
if(temp&0x80)
{
result += G;
}
temp <<= 1;
j++;
G = G/2;
}
i++;
}
result *= 100;
CS5463zhi.YinShu = (uint32_t)result;
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetTemperature
** 函數(shù)功能:讀取溫度函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_GetTemperature(int cs_index) //溫度能顯示了 PT2017-2-12
{
float G = 128,result;
uint8_t temp,i,j;//pn=0;
CS5463ReadReg(cs_index,0x26,RX_Buff); //讀取溫度 是的在這里就讀到了溫度
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
// if(temp&0x80) //如果為負(fù)數(shù),計(jì)算原碼
// {
// pn = 1; //負(fù)數(shù)標(biāo)志
// RX_Buff[0] = ~RX_Buff[0]; //本來(lái)為取反+1,這里因?yàn)榫鹊脑,?1
// RX_Buff[1] = ~RX_Buff[1];
// RX_Buff[2] = ~RX_Buff[2];
// }
i = 0;
result = 0; //這個(gè)值是浮點(diǎn)數(shù) 先清零 再逐個(gè)把0.5的權(quán) 數(shù)據(jù)加進(jìn)來(lái)
while(i<3)
{
temp = RX_Buff[i]; //雖然這個(gè)數(shù)組定義了4個(gè)字節(jié) 實(shí)際就用了 Buff[0] Buff[1] RX_Buff[2]
j = 0;
while(j<8)
{
if(temp&0x80)
{
result += G; //把0.5的權(quán)數(shù)據(jù)加進(jìn)來(lái)
}
temp <<= 1;
j++;
G = G/2;
}
i++;
}
if(result<128) //是的這個(gè)result 是 -127,128 這里已經(jīng)獲取了溫度浮點(diǎn)值 最多是一個(gè)3位數(shù)? 還有小數(shù)點(diǎn)
{
CS5463zhi.WenDu = (uint32_t)result; //是的 這里就是 例如12523 -----> 125.23 怎么去顯示? 如何分離 從8A開始顯示
}
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetStatusReg
** 函數(shù)功能:讀取狀態(tài)寄存器函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
uint8_t CS5463_GetStatusReg(int cs_index)
{
uint8_t sta=0;
CS5463ReadReg(cs_index,0x1E,RX_Buff); //1E 是什么? 狀態(tài)寄存器
if(RX_Buff[0]&0x80) //檢測(cè):電流、電壓、功率測(cè)量是否完畢
{
//檢測(cè)電流/電壓是否超出范圍
//檢測(cè)電流有效值/電壓有效值/電能是否超出范圍
if((RX_Buff[0]&0x03)||(RX_Buff[1]&0x70))
{
CS5463_ResetStatusReg(cs_index); //復(fù)位狀態(tài)寄存器
}
else
{
sta |= 0x01;//B0000_0001; //這什么意思 還可以這樣寫嗎? PT2017-2-8 分隔符嗎?
}
}
if(RX_Buff[2]&0x80) //檢測(cè):溫度測(cè)量是否完畢
{
sta |=0x02; //B0000_0010;
}
return(sta);
}
void Get_Zhi(int cs_index)
{
sta = CS5463_GetStatusReg(cs_index); //檢測(cè)中斷產(chǎn)生的原因
if(0x01==(sta&0x01)) //讀取電流電壓
{
CS5463_ResetStatusReg(cs_index); //清除標(biāo)志
CS5463_GetVoltRMS(cs_index); //獲取電壓
CS5463_GetCurrentRMS(cs_index); //獲取電流
CS5463_GetPactiveRMS(cs_index); //獲取功率
CS5463_GetPowerFactor(cs_index); //獲取功率因數(shù)
if(0x02==(sta&0x02)) //讀取溫度
{
CS5463_GetVoltRMS(cs_index); //獲取電壓
// CS5463_GetTemperature(); //溫度讀取不需要太頻繁,所以跟電流電壓一起讀取
}
else
{
CS5463_Init(cs_index); //重新初始化芯片
}
}
}
static uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode)
{
CS5463_ERROR("SPI!errorCode = %d",errorCode);
return 0;
}
|
|