current_v/8F-3AW-PowerMeter/power_meter.c

294 lines
10 KiB
C
Raw Normal View History

2026-01-05 17:49:00 +08:00
/**
******************************************************************************
2026-01-06 16:00:44 +08:00
* @file power_meter.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-06 16:00:44 +08:00
#include "power_meter.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>
EleC_V_data elec_v_data;
#if COULOMBMETER_SET_FUNC_ENABLE
/**
* @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-05 17:49:00 +08:00
static void coulombmeter_write_reg(uint8_t addr, uint8_t* reg_data)
{
uint8_t check_sum = 0;
// 1. <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> BL0942_ADDR_W
COULOMBMETER_UART_TRANS_BYTE(BL0942_ADDR_W);
// 2. <20>·<EFBFBD><C2B7><EFBFBD>Ҫд<D2AA>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
COULOMBMETER_UART_TRANS_BYTE(addr);
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַд<D6B7><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COULOMBMETER_UART_TRANS_BYTE(reg_data[0]);
COULOMBMETER_UART_TRANS_BYTE(reg_data[1]);
COULOMBMETER_UART_TRANS_BYTE(reg_data[2]);
// 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);
COULOMBMETER_UART_TRANS_BYTE(check_sum);
}
#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>)
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<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>
*/
2026-01-05 17:49:00 +08:00
static void coulombmeter_read_reg(uint8_t addr)
{
// 1. <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> BL0942_ADDR_R
COULOMBMETER_UART_TRANS_BYTE(BL0942_ADDR_R);
// 2. <20>·<EFBFBD><C2B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
COULOMBMETER_UART_TRANS_BYTE(addr);
}
/**
* @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
{
FL_GPIO_InitTypeDef GPIO_InitStruct;
// <20><>ʼ<EFBFBD><CABC>GPIO
GPIO_InitStruct.pin = COULOMBMETER_UART_RX_GPIO_PIN;
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;
FL_GPIO_Init(COULOMBMETER_UART_RX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.pin = COULOMBMETER_UART_TX_GPIO_PIN;
FL_GPIO_Init(COULOMBMETER_UART_TX_GPIO_PORT, &GPIO_InitStruct);
// <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>
FL_UART_Init(COULOMBMETER_USED_UART_NUM, &UART_InitStruct);
NVIC_DisableIRQ(COULOMBMETER_IRQn);
NVIC_SetPriority(COULOMBMETER_IRQn,2); //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
NVIC_EnableIRQ(COULOMBMETER_IRQn);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
FL_UART_ClearFlag_RXBuffFull(COULOMBMETER_USED_UART_NUM);
FL_UART_EnableIT_RXBuffFull(COULOMBMETER_USED_UART_NUM);
// <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
}
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-05 17:49:00 +08:00
void User_Coulombmeter_Data_refresh(void)
{
2026-01-06 16:00:44 +08:00
static Bus_Mod mod = MOD_CURRENT_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-05 17:49:00 +08:00
coulombmeter_read_reg(Addr_V_RMS);
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;
}else{
2026-01-06 16:00:44 +08:00
mod = MOD_VOLTAGE_METER;
2026-01-05 17:49:00 +08:00
coulombmeter_read_reg(Addr_I_RMS);
elec_v_data.bus_com_stm = BUS_COM_STATE_WAITE_CURRENT; // ת<><D7AA><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>״̬
elec_v_data.current_index = 0;
elec_v_data.current_raw = 0;
}
}
/**
* @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>
* @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)
* 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>
* 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>
* 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>
* 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>RXBuffFull<EFBFBD><EFBFBD>־
*/
2026-01-05 17:49:00 +08:00
void UART5_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
if(FL_UART_IsEnabledIT_RXBuffFull(COULOMBMETER_USED_UART_NUM) &&
FL_UART_IsActiveFlag_RXBuffFull(COULOMBMETER_USED_UART_NUM))
{
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-06 16:00:44 +08:00
tmp_data = FL_UART_ReadRXBuff(COULOMBMETER_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)
{
// У<><D0A3><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>и<EFBFBD>ֵ
elec_v_data.bus_com_stm = BUS_COM_STATE_IDLE;
elec_v_data.bus_rms_voltage_V =elec_v_data.voltage_raw / Voltage_K;
elec_v_data.voltage_raw = 0;
2026-01-05 17:49:00 +08:00
2026-01-06 16:00:44 +08:00
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;
tmp_data = FL_UART_ReadRXBuff(COULOMBMETER_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_com_stm = BUS_COM_STATE_IDLE;
elec_v_data.bus_rms_current_mA =elec_v_data.current_raw*100 / Current_K;
elec_v_data.current_raw = 0;
elec_v_data.current_index = 0;
}
2026-01-05 17:49:00 +08:00
}
2026-01-05 17:49:00 +08:00
}
2026-01-06 16:00:44 +08:00
2026-01-05 18:53:05 +08:00
FL_UART_ClearFlag_RXBuffFull(COULOMBMETER_USED_UART_NUM);
2026-01-05 17:49:00 +08:00
}
}
/************************ (C) COPYRIGHT YUWELL *****END OF FILE****/