首先我们看下hlw8032相关
1、引脚配置和功能描述
引脚序号 | 引脚名称 | 输入/输出 | 说明 |
---|---|---|---|
1 | VDD | 芯片电源 | 芯片电源 |
2 | IP | 模拟输入 | 电流差分信号正输入端,最大差分输入电压有效值是±30.9mV |
3 | IN | 模拟输入 | 电流差分信号负输入端,最大差分输入电压有效值是±30.9mV |
4 | VP | 模拟输入 | 电压信号正输入端,最大输入电压有效值是±495mV |
5 | GND | 芯片地 | 芯片地 |
6 | TX | 数字输出 | UART 数据输出口 |
7 | RF | 输出 | 输出有功高频方波脉冲,占空比 50% |
8 | RX | 数字输入 | UART 数据输入口(保留端口,用户不需使用) |
2、寄存器说明
序号 | 数据类型 | 数据长度(Byte) | 描述 |
---|---|---|---|
1 | 状态寄存器(State REG) | 1 | 数据状态的指示 |
2 | 检测寄存器(Check REG) | 1 | 默认值 |
3 | 电压参数寄存器(Voltage parameter REG) | 3 | 默认值 |
4 | 电压寄存器(Voltage REG) | 3 | |
5 | 电流参数寄存器(Current Parameter REG) | 3 | 默认值 |
6 | 电流寄存器(Current REG) | 3 | |
7 | 功率参数寄存器(Power parameter REG) | 3 | 默认值 |
8 | 功率寄存器(Power REG) | 3 | |
9 | 数据更新寄存器(Data Updata REG) | 1 | 功率、电压、电流状态指示 |
10 | PF 寄存器(PF REG) | 2 | PF 脉冲个数,配合状态寄存器使用,掉电后不保存 |
11 | 校验和寄存器(CheckSum REG) | 1 | 数据校验和,用于通讯时验证数据包是否完整 |
HLW8032 每发送一次完整数据是 24byte; 从寄存器 1(State REG)开发发送,到寄存器
11(CheckSum REG)结束一组数据,一共 11 个寄存器,24 byte 数据。
2.1 状态寄存器(State REG)
1、 当 State REG = 0xaa 时,芯片误差修正功能失效,此时电压参数寄存器、电流参数寄存器和功率参数寄存器不可用;
2、 当 State REG = 0x55 时,芯片误差修正功能正常,此时电压参数寄存器、电流参数寄存器和功率参数寄存器可用,且电压寄存器、电流寄存器和功率寄存器未溢出;
3、 当 State REG = 0xfx 时,芯片误差修正功能正常, 此时电压参数寄存器、电流参数寄存器和功率参数寄存器可用, State REG 的相应位为 1 时表示相应的寄存器溢出,溢出表示电流、电压或功率值非常小,接近 0;
2.2 检测寄存器(Check REG)
Check REG | 十六进制 | 描述 |
---|---|---|
8bit | 0x5A | 默认值 |
2.3 电压参数寄存器(Voltage Parameter REG)
U Parameter REG | High Byte | Middle Byte | Low Byte |
---|---|---|---|
24bit | 8bit | 8bit | 8bit |
数据发送顺序:高 8bit–>中 8bit–>低 8bit
此寄存器是默认值
2.4 电压寄存器(Voltage REG)
Voltage REG | High Byte | Middle Byte | Low Byte |
---|---|---|---|
24bit | 8bit | 8bit | 8bit |
数据发送顺序:高 8bit–>中 8bit–>低 8bit
2.5 电流参数寄存器(Current Parameter REG)
Current ParameterREG | High Byte | Middle Byte | Low Byte |
---|---|---|---|
24bit | 8bit | 8bit | 8bit |
数据发送顺序:高 8bit–>中 8bit–>低 8bit
此寄存器是默认值
2.6 电流寄存器(Current REG)
Current REG | High Byte | Middle Byte | Low Byte |
---|---|---|---|
24bit | 8bit | 8bit | 8bit |
数据发送顺序:高 8bit–>中 8bit–>低 8bit
2.7 功率参数寄存器(Power Parameter REG)
Power Parameter REG | High Byte | Middle Byte | Low Byte |
---|---|---|---|
24bit | 8bit | 8bit | 8bit |
数据发送顺序:高 8bit–>中 8bit–>低 8bit
此寄存器是默认值
2.8 功率寄存器(Power REG)
Power REG | High Byte | Middle Byte | Low Byte |
---|---|---|---|
24bit | 8bit | 8bit | 8bit |
数据发送顺序:高 8bit–>中 8bit–>低 8bit
2.9 数据更新寄存器(Data Updata REG)
1、 当 bit6 = 1 时,表示电压寄存器的数据状态己更新;
2、 当 bit5 = 1 时,表示电流寄存器的数据状态己更新;
3、 当 bit4 = 1 时,表示功率寄存器的数据状态己更新;
2.10 PF 寄存器(PF REG)
RF REG | Middle Byte | Low Byte | |
---|---|---|---|
16bit | 8bit | 8bit |
数据发送顺序:高 8bit -->低 8bit
PF 寄存器用来累计脉冲信号,当 16 位寄存器数据溢出时,数据更新寄存器(Data Updata REG)
的 bit7 位会进行一次取反,PF 寄存器(PF REG)清零。
2.11 校验和寄存器(CheckSum REG)
CheckSum REG | 十六进制 | 描述 | |
---|---|---|---|
8bit | 0xXX | CHECKSUM除状态寄存器(State REG)、检测寄存器(Check REG)和校验和寄存器(CheckSum REG)之外的寄存器的数据之和的低 8bit |
3.参数计算
3.1 电压有效值计算
3.2 电流有效值的计算
3.3 有功功率的计算
3.4 视在功率的计算
3.5 功率因数的计算
4 、esp8266 代码实现
4.1 流程图
4.2 代码实现
创建串口读取任务
static void hlw8032_uart_task()
{
// Configure parameters of an UART driver,
// communication pins and install the driver
uart_config_t uart_config = {
.baud_rate = 4800,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
};
uart_param_config(UART_NUM_0, &uart_config);
uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);
// Configure a temporary buffer for the incoming data
unsigned char *data = (uint8_t *) malloc(BUF_SIZE);
while (1) {
// Read data from the UART
int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);
// Write data back to the UART
// uart_write_bytes(UART_NUM_0, (const char *) data, len);
if(len >0)
{
// log_info("read hlw8032 data len:%d",len);
// for(int i =0;i<len;i++)
// {
// printf("%02x ",data[i]);
// }
// printf("\r\n");
hlw8032_data_deal(data,len);
}
vTaskDelay(100 / portTICK_RATE_MS);
}
}
xTaskCreate(hlw8032_uart_task, "hlw8032_uart_task", 1024*3, NULL, 10, NULL);
主要数据处理
//电压参数寄存器值
(data[VOLTAGE_PARA_REG_H] <<16) +(data[VOLTAGE_PARA_REG_M]<<8)+data[VOLTAGE_PARA_REG_L]
//电压寄存器值
(data[VOLTAGE_REG_H] <<16) +(data[VOLTAGE_REG_M]<<8)+data[VOLTAGE_REG_L]
//电流参数寄存器值
(data[CURRENT_PARA_REG_H] <<16) +(data[CURRENT_PARA_REG_M]<<8)+data[CURRENT_PARA_REG_L]
//电流寄存器值
(data[CURRENT_REG_H] <<16) +(data[CURRENT_REG_M]<<8)+data[CURRENT_REG_L]
//功率参数寄存器值
(data[POWER_PARA_REG_H] <<16) +(data[POWER_PARA_REG_M]<<8)+data[POWER_PARA_REG_L]
//功率寄存器值
(data[POWER_REG_H] <<16) +(data[POWER_REG_M]<<8)+data[POWER_REG_L]
//电流寄存器状态标志位
((data[DATA_UPDATA_REG] & 0x20) == 0x20)?1:0
//电压寄存器状态标志位
((data[DATA_UPDATA_REG] & 0x40) == 0x40)?1:0
//功率寄存器状态标志位
((data[DATA_UPDATA_REG] & 0x10) == 0x10)?1:0