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>汾 2025.12.31
|
|
|
|
|
|
******************************************************************************
|
|
|
|
|
|
* @attention
|
|
|
|
|
|
*
|
|
|
|
|
|
* <h2><center>© 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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>λ<EFBFBD>ڵ<EFBFBD>λ <20><>λ<EFBFBD>ڸ<EFBFBD>λ
|
|
|
|
|
|
// <20><>24bit<69><74><EFBFBD><EFBFBD><EFBFBD>㴦<EFBFBD><E3B4A6>0<EFBFBD><30><EFBFBD>룬<EFBFBD><EBA3AC>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><EFBFBD>Ϊ3<CEAA><33><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ض<EFBFBD><D8B6>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> оƬ<D0BE><C6AC>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD>
|
|
|
|
|
|
// оƬ<D0BE>յ<EFBFBD><D5B5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>150us<75>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// 1sִ<73><D6B4>һ<EFBFBD><D2BB> <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>д<EFBFBD><D0B4><EFBFBD>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20>Ƽ<EFBFBD>1sˢ<73><CBA2>һ<EFBFBD><D2BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>洢<EFBFBD><E6B4A2>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>elec_v_data<74><61>
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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-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 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****/
|