current_v/Inc/coulombmeter.h
2026-01-05 17:49:00 +08:00

238 lines
7.1 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.

/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : coulombmeter.h
* @brief : 电量计驱动程序
* @version : 1.0
* @changelog : version 1.0 初始版本 2025.12.31
******************************************************************************
* @attention
*
* Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China
* THIS SOFTWARE is licensed under the Mulan PSL v1.
* can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __COULOMBMETER_H
#define __COULOMBMETER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "mf_config.h"
#include "string.h"
/************************** 硬件参数重映射 **************************/
/* 对硬件使用进行配置 */
#define COULOMBMETER_USED_UART_NUM UART5
#define COULOMBMETER_UART_TX_GPIO_PORT GPIOC
#define COULOMBMETER_UART_TX_GPIO_PIN FL_GPIO_PIN_5
#define COULOMBMETER_UART_RX_GPIO_PORT GPIOC
#define COULOMBMETER_UART_RX_GPIO_PIN FL_GPIO_PIN_4
#define COULOMBMETER_IRQn UART5_IRQn
// CPU阻塞式发送
#define CHECK_TRANS_DONE while(FL_UART_IsActiveFlag_TXShiftBuffEmpty(COULOMBMETER_USED_UART_NUM) != FL_SET){};
#define COULOMBMETER_UART_TRANS_BYTE(x) FL_UART_WriteTXBuff(COULOMBMETER_USED_UART_NUM, x);CHECK_TRANS_DONE;
/************************** 芯片内部寄存器地址定义 **************************/
// 电参数寄存器(只读)
#define Addr_I_WAVE 0x01 // 电流通道波形
#define Addr_V_WAVE 0x02 // 电压通道波形
#define Addr_I_RMS 0x03 // 电流有效值
#define Addr_V_RMS 0x04 // 电压有效值
#define Addr_I_FAST_RMS 0x05 // 电流快速有效值
#define Addr_WATT 0x06 // 有功功率
#define Addr_CF_CNT 0x07 // 有功电能脉冲计数
#define Addr_FREQ 0x08 // 工频频率
#define Addr_STATUS 0x09 // 状态
#define Addr_VERSION 0x0F // 版本
// 用户操作寄存器(读写)
#define Addr_I_CHOS 0x11 // 电流通道直流偏置校正
#define Addr_I_RMSOS 0x12 // 电流通道有效值小信号校正
#define Addr_WA_CREEP 0x14 // 有功功率防潜阈值
#define Addr_FAST_RMS_TH 0x15 // 电流快速有效值阈值寄存器
#define Addr_FAST_RMS_CYC 0x16 // 电流快速有效值刷新周期寄存器
#define Addr_FREQ_CYC 0x17 // 线电压频率刷新周期寄存器
#define Addr_MASK 0x18 // 输出配置寄存器
#define Addr_MODE 0x19 // 用户模式选择寄存器
#define Addr_GAIN_CR 0x1A // 电流通道增益控制寄存器
#define Addr_SOFT_RESET 0x1C // 软复位
#define Addr_WRPROT 0x1D // 用户写保护设置
//注意 BL0940的读命令字节固定为0x58+ICAddr写命令字节固定为0xA8+ICAddrSOP10封装芯片的IC_Addr地址固定为0
// BL0942 TSSOP14封装带地址选择管脚需根据A1~A2地址选择管脚的电平配置命令字节可以进行多机并联通信
// 8F-5AW 制氧机采用的是SOP-10封装芯片 地址为ICAddr = 0
#define BL0942_ADDR_R 0x58
#define BL0942_ADDR_W 0xA8
//出厂校准芯片增益控制1%以内外围器件精度控制1%以内,采用同一系数,不用 EEPROM保存参数
// 功率转换系数=3537*1毫欧*0.51K*1000/(1.218*1.218)/(390K*5+0.51K)=623.39 ,整数运算考虑放大10倍*10=6234
// 电流转换系数=305978*1毫欧/1.218=251213整数运算考虑防止运算溢出缩小10倍/10=25121
// 电压转换系数=73989*0.51K*1000/1.218/(390K*5+0.51K)=15883
// 电能系数=3600000*Power_K/1638.4/256=5350.6,对应于1度电的脉冲计数
// 电流采用1毫欧电阻采样电压采用390K*5+0.51K进行分压,实际测试发现电阻存在偏差,进行微调
// BL0942评估版立创直接贴片合金电阻(台湾厚声MS121WF100NT4E )实际测量比1毫欧偏小约0.93毫欧
#define Power_K 5798; //理论值*0.93
#define Current_K 23362; //理论值*0.93
#define Voltage_K 15883; //
#define Energy_K 4976; //理论值*0.93
//采用美隆1毫欧贴片合金电阻实际比1毫欧偏大约1.023毫欧
/*
#define Power_K 6378; //理论值*1.023
#define Current_K 25699; //理论值*1.023
#define Voltage_K 15883; //
#define Energy_K 5474; //理论值*1.023
*/
typedef union
{
uint8_t uByte[4];
uint16_t uInt[2];
uint32_t uLongs;
}FourBytes_Type;
typedef union
{
uint8_t uByte[2];
uint16_t uInt;
}TwoByte_Type;
//全电参数数据包格式
typedef struct
{
uint8_t head;
uint8_t I_RMS[3];
uint8_t V_RMS[3];
uint8_t I_FAST_RMS[3];
uint8_t WATT[3];
uint8_t CF_CNT[3];
uint8_t FREQ[3];
uint8_t STATUS[3];
uint8_t CHKSUM;
}AllFlame_StructDef;
typedef union
{
uint8_t B8[23];
AllFlame_StructDef Flame;
}AllFlame_TypeDef;
//BL0942/0940的电参数定义
typedef struct
{
uint16_t Energy_kwh; // 实际用电量,千瓦小时 XXXXXX,1度电/LSB最大65535度电
uint32_t Fir_CF_CNT; // 上一次的CF_CNT寄存器读数
uint32_t Mid_CF_CNT; // 小于1度电的脉冲底数
uint16_t Power_Value; // unit: 0.1W XXXX.X整型变量最低位代表0.1W
uint16_t Current_Value; // unit: 0.001A XX.XXX整型变量最低位代表0.001A
uint16_t Voltage_Value; // unit:0.01V XXX.XX整型变量最低位代表0.01V
uint16_t Freq; // unit:0.01Hz XX.XX整型变量最低位代表0.01Hz
uint16_t F_Current_Value;
}Elect_StructDef;
typedef enum
{
BUS_COM_STATE_IDLE,
BUS_COM_STATE_WAITE_CURRENT,
BUS_COM_STATE_WAITE_VOLTAGE,
BUS_CHECK_ERROR,
BUS_COM_STATE_WAITE_CHECK
}Bus_Com_State;
typedef union
{
uint32_t raw_long;
uint8_t raw_b8[4];
}Raw_Data;
typedef struct
{
uint16_t bus_rms_current_mA; // 总线供电电路有效值 单位为mA
uint16_t bus_rms_voltage_V; // 总线供电电压有效值 单位为V
uint32_t voltage_raw;
uint32_t current_raw;
Bus_Com_State bus_com_stm;
uint8_t current_index;
}EleC_V_data;
extern EleC_V_data elec_v_data;
extern Elect_StructDef BL0942_Elect;
extern uint16_t u16_TmrCnt; //定时计数
extern bool IsGetBL0942EData; //定时到1秒与BL0942通信获取电参数
extern bool flg_Comm; //读数据是否成功状态
void Delay_MS(uint16_t Count);
void Uart_Init(void);
void Delay_100uS(uint16_t Count);
void BL0942_Uart_Init(void);
bool BL0942_Uart1_R(uint8_t ICAddr,uint8_t cmd);
void BL0942_Uart1_W(uint8_t ICAddr,uint8_t cmd);
void BL0942_Uart_ReadEData(void);
void BL0942_Uart_ConfigInit(void);
bool BL0942_Uart1_ReadAll(uint8_t ICAddr);
void BL0942_Uart_ReadEDataAll(void);
/************************** 外部API函数导出 **************************/
void User_Coulombmeter_Init(void);
void UART5_IRQHandler(void);
void User_Coulombmeter_Data_refresh(void);
#ifdef __cplusplus
}
#endif
#endif /* __COULOMBMETER_H */
/************************ (C) COPYRIGHT Yuwell *****END OF FILE****/