current_v/8F_5AW_PowerMeter/8f_5aw_powerMeter.c

335 lines
12 KiB
C
Raw Permalink Normal View History

2026-01-05 17:49:00 +08:00
/**
******************************************************************************
2026-01-08 08:45:31 +08:00
* @file 8f_5aw_powerMeter.c
2026-01-05 17:49:00 +08:00
* @author Motor Control SDK Team, Yuwell Software XiangenWang
* @brief Voice Recognition Module Initialization Section,
including peripheral initialization and message node insertion, etc.
* @version 1.0
* @changelog version 1.0 <EFBFBD><EFBFBD>ʼ<EFBFBD> 2026.1.6
2026-01-05 17:49:00 +08:00
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China.
* All rights reserved.</center></h2>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted, provided that the following conditions are met:
*
* 1. Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of Yuwell Software nor the names of other
* contributors to this software may be used to endorse or promote products
* derived from this software without specific written permission.
* 4. This software, including modifications and/or derivative works of this
* software, must execute solely and exclusively on microcontroller or
* microprocessor devices manufactured by or for Yuwell Software.
* 5. Redistribution and use of this software other than as permitted under
* this license is void and will automatically terminate your rights under
* this license.
*
* THIS SOFTWARE IS PROVIDED BY Yuwell Software AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
* SHALL Yuwell Software OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* USER CODE END Header */
2026-01-08 08:45:31 +08:00
#include "8f_5aw_powerMeter.h"
2026-01-05 17:49:00 +08:00
// <20><EFBFBD><E1B9A9><EFBFBD>ⲿ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-01-08 08:45:31 +08:00
EleC_V_Data elec_v_data;
2026-01-05 17:49:00 +08:00
2026-01-08 08:45:31 +08:00
#if POWER_METER_SET_FUNC_ENABLE // ʹ<><CAB9>Ĭ<EFBFBD>ϼĴ<CFBC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޸ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/**
* @brief <EFBFBD><EFBFBD>BL0942ָ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>24λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param addr: <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ(8λ)
* @param reg_data: <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ں<EFBFBD>
* @retval <EFBFBD><EFBFBD>
* @note 1. <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>24bit<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>
* 2. ͨ<EFBFBD><EFBFBD>Э<EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>ʽΪ[д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(BL0942_ADDR_W)+<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ+3<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>]
* 3. У<EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>(д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<EFBFBD><EFBFBD>ַ+3<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD>ĵ<EFBFBD>8λȡ<EFBFBD><EFBFBD>
* 4. <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD>ʹ<EFBFBD>С<EFBFBD>޶<EFBFBD>Ϊ3<EFBFBD><EFBFBD><EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
*/
2026-01-08 08:45:31 +08:00
static void power_meter_write_reg(uint8_t addr, uint8_t* reg_data)
2026-01-05 17:49:00 +08:00
{
uint8_t check_sum = 0;
// 1. <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> BL0942_ADDR_W
2026-01-08 08:45:31 +08:00
POWER_METER_UART_TRANS_BYTE(BL0942_ADDR_W);
2026-01-05 17:49:00 +08:00
// 2. <20>·<EFBFBD><C2B7><EFBFBD>Ҫд<D2AA>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
2026-01-08 08:45:31 +08:00
POWER_METER_UART_TRANS_BYTE(addr);
2026-01-05 17:49:00 +08:00
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַд<D6B7><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-01-08 08:45:31 +08:00
POWER_METER_UART_TRANS_BYTE(reg_data[0]);
POWER_METER_UART_TRANS_BYTE(reg_data[1]);
POWER_METER_UART_TRANS_BYTE(reg_data[2]);
2026-01-05 17:49:00 +08:00
// 4. <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
check_sum = (BL0942_ADDR_W + addr + reg_data[0] + reg_data[1] + reg_data[2]);
check_sum = ~(check_sum & 0xFF);
2026-01-08 08:45:31 +08:00
POWER_METER_UART_TRANS_BYTE(check_sum);
2026-01-05 17:49:00 +08:00
}
#endif
2026-01-05 17:49:00 +08:00
/**
* @brief <EFBFBD><EFBFBD>BL0942ָ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param addr: <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ(8λ)
* @retval <EFBFBD><EFBFBD>
* @note 1. ͨ<EFBFBD><EFBFBD>Э<EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>ʽΪ[<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(BL0942_ADDR_R)+<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ]
* 2. оƬ<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬻<EFBFBD><EFBFBD><EFBFBD>150us<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(3<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>+1<EFBFBD>ֽ<EFBFBD>У<EFBFBD><EFBFBD>)
2026-01-08 08:45:31 +08:00
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>500msִ<EFBFBD><EFBFBD>һ<EFBFBD>θú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>(ϵͳ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD>400msˢ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>)
*/
2026-01-08 08:45:31 +08:00
static void power_meter_read_reg(uint8_t addr)
2026-01-05 17:49:00 +08:00
{
// 1. <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> BL0942_ADDR_R
2026-01-08 08:45:31 +08:00
POWER_METER_UART_TRANS_BYTE(BL0942_ADDR_R);
2026-01-05 17:49:00 +08:00
// 2. <20>·<EFBFBD><C2B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
2026-01-08 08:45:31 +08:00
POWER_METER_UART_TRANS_BYTE(addr);
2026-01-05 17:49:00 +08:00
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>(UART5)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
* @note 1. <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>UART TX/RX<EFBFBD><EFBFBD><EFBFBD>š<EFBFBD>UARTͨ<EFBFBD>Ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* 2. UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9600<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʡ<EFBFBD>8λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>1λֹͣλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ȫ˫<EFBFBD><EFBFBD>
* 3. <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>UART5<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD>Ϊ2
* 4. <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>elec_v_data
*/
2026-01-06 16:00:44 +08:00
void User_PowerMeter_Init(void)
2026-01-05 17:49:00 +08:00
{
2026-01-08 08:45:31 +08:00
FL_GPIO_InitTypeDef GPIO_InitStruct;
2026-01-05 17:49:00 +08:00
// <20><>ʼ<EFBFBD><CABC>GPIO
2026-01-08 08:45:31 +08:00
GPIO_InitStruct.pin = POWER_METER_UART_RX_GPIO_PIN;
2026-01-05 17:49:00 +08:00
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
GPIO_InitStruct.remapPin = FL_DISABLE;
GPIO_InitStruct.analogSwitch = FL_DISABLE;
2026-01-08 08:45:31 +08:00
FL_GPIO_Init(POWER_METER_UART_RX_GPIO_PORT, &GPIO_InitStruct);
2026-01-05 17:49:00 +08:00
2026-01-08 08:45:31 +08:00
GPIO_InitStruct.pin = POWER_METER_UART_TX_GPIO_PIN;
FL_GPIO_Init(POWER_METER_UART_TX_GPIO_PORT, &GPIO_InitStruct);
2026-01-05 17:49:00 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
FL_UART_InitTypeDef UART_InitStruct = {0};
UART_InitStruct.baudRate = 9600; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UART_InitStruct.dataWidth = FL_UART_DATA_WIDTH_8B; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
UART_InitStruct.stopBits = FL_UART_STOP_BIT_WIDTH_1B; //ֹͣλ
UART_InitStruct.parity = FL_UART_PARITY_NONE; //<2F><>żУ<C5BC><D0A3>
UART_InitStruct.transferDirection = FL_UART_DIRECTION_TX_RX; //<2F><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
2026-01-08 08:45:31 +08:00
FL_UART_Init(POWER_METER_USED_UART_NUM, &UART_InitStruct);
2026-01-05 17:49:00 +08:00
2026-01-08 08:45:31 +08:00
NVIC_DisableIRQ(POWER_METER_IRQn);
NVIC_SetPriority(POWER_METER_IRQn,2); //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
NVIC_EnableIRQ(POWER_METER_IRQn);
2026-01-05 17:49:00 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
2026-01-08 08:45:31 +08:00
FL_UART_ClearFlag_RXBuffFull(POWER_METER_USED_UART_NUM);
FL_UART_EnableIT_RXBuffFull(POWER_METER_USED_UART_NUM);
2026-01-05 17:49:00 +08:00
// <20><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>
memset(&elec_v_data, 0, sizeof(elec_v_data));
}
2026-01-06 16:00:44 +08:00
2026-01-05 17:49:00 +08:00
/**
* @brief ˢ<EFBFBD>¿<EFBFBD><EFBFBD>ؼƵĵ<EFBFBD>ѹ/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
* @note 1. <EFBFBD>Ƽ<EFBFBD>1s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>θú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ѹ<EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ
* 2. <EFBFBD>״ε<EFBFBD><EFBFBD>ö<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>(Addr_I_RMS)<EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD>ζ<EFBFBD>ȡ<EFBFBD><EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>(Addr_V_RMS)<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>󣬻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD>ĵȴ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>պͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UART<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 4. <EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>elec_v_data<EFBFBD><EFBFBD>
*/
2026-01-08 08:45:31 +08:00
void User_Power_refresh(void)
2026-01-05 17:49:00 +08:00
{
2026-01-08 08:45:31 +08:00
static Bus_Mod mod = MOD_VOLTAGE_METER;
2026-01-05 17:49:00 +08:00
2026-01-06 16:00:44 +08:00
if(mod == MOD_VOLTAGE_METER)
2026-01-05 17:49:00 +08:00
{
2026-01-06 16:00:44 +08:00
mod = MOD_CURRENT_METER;
2026-01-08 08:45:31 +08:00
power_meter_read_reg(Addr_V_RMS);
2026-01-05 17:49:00 +08:00
elec_v_data.bus_com_stm = BUS_COM_STATE_WAITE_VOLTAGE; // ת<><D7AA><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>״̬
elec_v_data.current_index = 0;
elec_v_data.voltage_raw = 0;
2026-01-08 08:45:31 +08:00
}else if(mod == MOD_CURRENT_METER){
2026-01-05 17:49:00 +08:00
2026-01-08 08:45:31 +08:00
mod = MOD_POWER_METER;
power_meter_read_reg(Addr_I_RMS);
2026-01-05 17:49:00 +08:00
2026-01-08 08:45:31 +08:00
elec_v_data.bus_com_stm = BUS_COM_STATE_WAITE_CURRENT; // ת<><D7AA><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
2026-01-05 17:49:00 +08:00
elec_v_data.current_index = 0;
elec_v_data.current_raw = 0;
2026-01-08 08:45:31 +08:00
}else if(mod == MOD_POWER_METER){
mod = MOD_VOLTAGE_METER;
power_meter_read_reg(Addr_WATT);
elec_v_data.bus_com_stm = BUS_COM_STATE_WAITE_POWER; // ת<><D7AA><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
elec_v_data.current_index = 0;
elec_v_data.power_raw = 0;
2026-01-05 17:49:00 +08:00
}
2026-01-08 08:45:31 +08:00
2026-01-05 17:49:00 +08:00
}
/**
2026-01-08 08:45:31 +08:00
* @brief UART5<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>(RXBuffFull)
2026-01-08 08:45:31 +08:00
* 2. <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ǰͨ<EFBFBD><EFBFBD>״̬(BUS_COM_STATE)<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 3. <EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ո<EFBFBD>ʽ<EFBFBD><EFBFBD>3<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ǰ)+1<EFBFBD>ֽ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-01-08 08:45:31 +08:00
* 4. У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊʵ<EFBFBD>ʵ<EFBFBD>ѹ(V)/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(mA)/<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>
* 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡRXBuff<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RXBuffFull<EFBFBD><EFBFBD>־
*/
2026-01-05 17:49:00 +08:00
void UART5_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
2026-01-08 08:45:31 +08:00
if(FL_UART_IsEnabledIT_RXBuffFull(POWER_METER_USED_UART_NUM) &&
FL_UART_IsActiveFlag_RXBuffFull(POWER_METER_USED_UART_NUM))
2026-01-05 17:49:00 +08:00
{
if(elec_v_data.bus_com_stm == BUS_COM_STATE_WAITE_VOLTAGE)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ȡrxreg<65>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t tmp_data = 0;
2026-01-08 08:45:31 +08:00
tmp_data = FL_UART_ReadRXBuff(POWER_METER_USED_UART_NUM);
2026-01-05 17:49:00 +08:00
2026-01-06 16:00:44 +08:00
if(elec_v_data.current_index < 3)
2026-01-05 17:49:00 +08:00
{
2026-01-06 16:00:44 +08:00
elec_v_data.voltage_raw |= (tmp_data<<(elec_v_data.current_index*8));
}
elec_v_data.voltage_array[elec_v_data.current_index++] = tmp_data;
if(elec_v_data.current_index == 4)
{
uint8_t checkSum = ~((elec_v_data.voltage_array[0] + elec_v_data.voltage_array[1] + elec_v_data.voltage_array[2] + BL0942_ADDR_R + Addr_V_RMS)&0xFF);
if(elec_v_data.voltage_array[3] == checkSum)
{
elec_v_data.bus_rms_voltage_V =elec_v_data.voltage_raw / Voltage_K;
elec_v_data.voltage_raw = 0;
}
2026-01-08 09:26:21 +08:00
// У<><D0A3><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>и<EFBFBD>ֵ
elec_v_data.bus_com_stm = BUS_COM_STATE_IDLE;
elec_v_data.current_index = 0;
2026-01-05 17:49:00 +08:00
}
2026-01-06 16:00:44 +08:00
2026-01-05 17:49:00 +08:00
}else if(elec_v_data.bus_com_stm == BUS_COM_STATE_WAITE_CURRENT)
{
uint8_t tmp_data = 0;
2026-01-08 08:45:31 +08:00
tmp_data = FL_UART_ReadRXBuff(POWER_METER_USED_UART_NUM);
2026-01-05 18:53:05 +08:00
2026-01-06 16:00:44 +08:00
if(elec_v_data.current_index < 3)
{
elec_v_data.current_raw |= (tmp_data<<(elec_v_data.current_index*8));
}
elec_v_data.current_array[elec_v_data.current_index++] = tmp_data;
2026-01-05 17:49:00 +08:00
2026-01-06 16:00:44 +08:00
if(elec_v_data.current_index == 4)
2026-01-05 17:49:00 +08:00
{
2026-01-06 16:00:44 +08:00
uint8_t checkSum = ~((elec_v_data.current_array[0] + elec_v_data.current_array[1] + elec_v_data.current_array[2] + BL0942_ADDR_R + Addr_I_RMS)&0xFF);
2026-01-05 17:49:00 +08:00
2026-01-06 16:00:44 +08:00
if(elec_v_data.current_array[3] == checkSum)
{
// У<><D0A3><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>и<EFBFBD>ֵ
elec_v_data.bus_rms_current_mA =elec_v_data.current_raw*100 / Current_K;
2026-01-08 09:26:21 +08:00
2026-01-06 16:00:44 +08:00
}
2026-01-08 09:26:21 +08:00
elec_v_data.bus_com_stm = BUS_COM_STATE_IDLE;
elec_v_data.current_index = 0;
elec_v_data.current_raw = 0;
2026-01-05 17:49:00 +08:00
}
2026-01-08 08:45:31 +08:00
}else if(elec_v_data.bus_com_stm == BUS_COM_STATE_WAITE_POWER)
{
uint8_t tmp_data = 0;
tmp_data = FL_UART_ReadRXBuff(POWER_METER_USED_UART_NUM);
if(elec_v_data.current_index < 3)
{
elec_v_data.power_raw |= (tmp_data<<(elec_v_data.current_index*8));
}
elec_v_data.power_array[elec_v_data.current_index++] = tmp_data;
if(elec_v_data.current_index == 4)
{
uint8_t checkSum = ~((elec_v_data.power_array[0] + elec_v_data.power_array[1] + elec_v_data.power_array[2] + BL0942_ADDR_R + Addr_WATT)&0xFF);
if(elec_v_data.power_array[3] == checkSum)
{
// У<><D0A3><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>и<EFBFBD>ֵ
2026-01-08 09:26:21 +08:00
2026-01-08 08:45:31 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ֵʱ<D6B5><CAB1><EFBFBD><EFBFBD>תΪ<D7AA><CEAA>ֵ
if(elec_v_data.power_array[2] > 0x7F)
{
2026-01-08 09:26:21 +08:00
elec_v_data.power_raw = (~elec_v_data.power_raw & 0xFFFFFF) + 1;
2026-01-08 08:45:31 +08:00
}
elec_v_data.bus_active_power_watt = elec_v_data.power_raw * 100 /Power_K;
}
2026-01-08 09:26:21 +08:00
elec_v_data.bus_com_stm = BUS_COM_STATE_IDLE;
elec_v_data.power_raw = 0;
elec_v_data.current_index = 0;
2026-01-08 08:45:31 +08:00
}
2026-01-05 17:49:00 +08:00
}
2026-01-08 08:45:31 +08:00
2026-01-06 16:00:44 +08:00
2026-01-08 08:45:31 +08:00
FL_UART_ClearFlag_RXBuffFull(POWER_METER_USED_UART_NUM);
2026-01-05 17:49:00 +08:00
}
}
/************************ (C) COPYRIGHT YUWELL *****END OF FILE****/