From 0ccdd0a0d54126e701f86cf18237e31ed2edf57e Mon Sep 17 00:00:00 2001 From: TuxMonkey <8196772+tuxmonkey@user.noreply.gitee.com> Date: Mon, 9 Mar 2026 21:43:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=90=97=EF=BC=9F?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=EF=BC=8C=E5=BE=88=E9=9A=BE=E7=9A=84=E5=95=A6?= =?UTF-8?q?111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Src/fdcan.c | 30 +++++++------- TronOneH7_Scaffold.ioc | 33 +++++++++------- User_Code/bsp/fdcan/bsp_fdcan.c | 32 ++++++++------- .../power_meters/xiditech/xidipwmeter.c | 39 ++++++++++--------- User_Code/user_task/dev_tasks/dev_cmd.c | 13 +------ 5 files changed, 73 insertions(+), 74 deletions(-) diff --git a/Core/Src/fdcan.c b/Core/Src/fdcan.c index c5df5d1..a9e3d0e 100644 --- a/Core/Src/fdcan.c +++ b/Core/Src/fdcan.c @@ -42,9 +42,9 @@ void MX_FDCAN1_Init(void) hfdcan1.Instance = FDCAN1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = ENABLE; + hfdcan1.Init.AutoRetransmission = DISABLE; hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = ENABLE; + hfdcan1.Init.ProtocolException = DISABLE; hfdcan1.Init.NominalPrescaler = 3; hfdcan1.Init.NominalSyncJumpWidth = 10; hfdcan1.Init.NominalTimeSeg1 = 29; @@ -54,11 +54,11 @@ void MX_FDCAN1_Init(void) hfdcan1.Init.DataTimeSeg1 = 29; hfdcan1.Init.DataTimeSeg2 = 10; hfdcan1.Init.MessageRAMOffset = 0; - hfdcan1.Init.StdFiltersNbr = 1; + hfdcan1.Init.StdFiltersNbr = 14; hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.RxFifo0ElmtsNbr = 32; + hfdcan1.Init.RxFifo0ElmtsNbr = 4; hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; - hfdcan1.Init.RxFifo1ElmtsNbr = 0; + hfdcan1.Init.RxFifo1ElmtsNbr = 4; hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; hfdcan1.Init.RxBuffersNbr = 0; hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8; @@ -90,9 +90,9 @@ void MX_FDCAN2_Init(void) hfdcan2.Instance = FDCAN2; hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan2.Init.AutoRetransmission = ENABLE; + hfdcan2.Init.AutoRetransmission = DISABLE; hfdcan2.Init.TransmitPause = DISABLE; - hfdcan2.Init.ProtocolException = ENABLE; + hfdcan2.Init.ProtocolException = DISABLE; hfdcan2.Init.NominalPrescaler = 3; hfdcan2.Init.NominalSyncJumpWidth = 10; hfdcan2.Init.NominalTimeSeg1 = 29; @@ -102,11 +102,11 @@ void MX_FDCAN2_Init(void) hfdcan2.Init.DataTimeSeg1 = 29; hfdcan2.Init.DataTimeSeg2 = 10; hfdcan2.Init.MessageRAMOffset = 853; - hfdcan2.Init.StdFiltersNbr = 1; + hfdcan2.Init.StdFiltersNbr = 14; hfdcan2.Init.ExtFiltersNbr = 0; - hfdcan2.Init.RxFifo0ElmtsNbr = 0; + hfdcan2.Init.RxFifo0ElmtsNbr = 4; hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; - hfdcan2.Init.RxFifo1ElmtsNbr = 32; + hfdcan2.Init.RxFifo1ElmtsNbr = 4; hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; hfdcan2.Init.RxBuffersNbr = 0; hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8; @@ -138,9 +138,9 @@ void MX_FDCAN3_Init(void) hfdcan3.Instance = FDCAN3; hfdcan3.Init.FrameFormat = FDCAN_FRAME_CLASSIC; hfdcan3.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan3.Init.AutoRetransmission = ENABLE; + hfdcan3.Init.AutoRetransmission = DISABLE; hfdcan3.Init.TransmitPause = DISABLE; - hfdcan3.Init.ProtocolException = ENABLE; + hfdcan3.Init.ProtocolException = DISABLE; hfdcan3.Init.NominalPrescaler = 3; hfdcan3.Init.NominalSyncJumpWidth = 10; hfdcan3.Init.NominalTimeSeg1 = 29; @@ -150,11 +150,11 @@ void MX_FDCAN3_Init(void) hfdcan3.Init.DataTimeSeg1 = 29; hfdcan3.Init.DataTimeSeg2 = 10; hfdcan3.Init.MessageRAMOffset = 1706; - hfdcan3.Init.StdFiltersNbr = 1; + hfdcan3.Init.StdFiltersNbr = 14; hfdcan3.Init.ExtFiltersNbr = 0; - hfdcan3.Init.RxFifo0ElmtsNbr = 0; + hfdcan3.Init.RxFifo0ElmtsNbr = 4; hfdcan3.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; - hfdcan3.Init.RxFifo1ElmtsNbr = 32; + hfdcan3.Init.RxFifo1ElmtsNbr = 4; hfdcan3.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; hfdcan3.Init.RxBuffersNbr = 0; hfdcan3.Init.RxBufferSize = FDCAN_DATA_BYTES_8; diff --git a/TronOneH7_Scaffold.ioc b/TronOneH7_Scaffold.ioc index 5e02379..6de4824 100644 --- a/TronOneH7_Scaffold.ioc +++ b/TronOneH7_Scaffold.ioc @@ -330,7 +330,7 @@ Dma.USART3_TX.10.SyncEnable=DISABLE Dma.USART3_TX.10.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT Dma.USART3_TX.10.SyncRequestNumber=1 Dma.USART3_TX.10.SyncSignalID=NONE -FDCAN1.AutoRetransmission=ENABLE +FDCAN1.AutoRetransmission=DISABLE FDCAN1.CalculateBaudRateNominal=1000000 FDCAN1.CalculateTimeBitNominal=1000 FDCAN1.CalculateTimeQuantumNominal=25.0 @@ -338,17 +338,18 @@ FDCAN1.DataPrescaler=3 FDCAN1.DataSyncJumpWidth=10 FDCAN1.DataTimeSeg1=29 FDCAN1.DataTimeSeg2=10 -FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,DataPrescaler,DataTimeSeg1,DataTimeSeg2,TxFifoQueueMode,RxFifo0ElmtsNbr,TxFifoQueueElmtsNbr,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth +FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,DataPrescaler,DataTimeSeg1,DataTimeSeg2,TxFifoQueueMode,RxFifo0ElmtsNbr,TxFifoQueueElmtsNbr,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,RxFifo1ElmtsNbr FDCAN1.NominalPrescaler=3 FDCAN1.NominalSyncJumpWidth=10 FDCAN1.NominalTimeSeg1=29 FDCAN1.NominalTimeSeg2=10 -FDCAN1.ProtocolException=ENABLE -FDCAN1.RxFifo0ElmtsNbr=32 -FDCAN1.StdFiltersNbr=1 +FDCAN1.ProtocolException=DISABLE +FDCAN1.RxFifo0ElmtsNbr=4 +FDCAN1.RxFifo1ElmtsNbr=4 +FDCAN1.StdFiltersNbr=14 FDCAN1.TxFifoQueueElmtsNbr=32 FDCAN1.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION -FDCAN2.AutoRetransmission=ENABLE +FDCAN2.AutoRetransmission=DISABLE FDCAN2.CalculateBaudRateNominal=1000000 FDCAN2.CalculateTimeBitNominal=1000 FDCAN2.CalculateTimeQuantumNominal=25.0 @@ -356,17 +357,18 @@ FDCAN2.DataPrescaler=3 FDCAN2.DataSyncJumpWidth=10 FDCAN2.DataTimeSeg1=29 FDCAN2.DataTimeSeg2=10 -FDCAN2.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth +FDCAN2.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,RxFifo0ElmtsNbr FDCAN2.MessageRAMOffset=853 FDCAN2.NominalPrescaler=3 FDCAN2.NominalSyncJumpWidth=10 FDCAN2.NominalTimeSeg1=29 FDCAN2.NominalTimeSeg2=10 -FDCAN2.ProtocolException=ENABLE -FDCAN2.RxFifo1ElmtsNbr=32 -FDCAN2.StdFiltersNbr=1 +FDCAN2.ProtocolException=DISABLE +FDCAN2.RxFifo0ElmtsNbr=4 +FDCAN2.RxFifo1ElmtsNbr=4 +FDCAN2.StdFiltersNbr=14 FDCAN2.TxFifoQueueElmtsNbr=32 -FDCAN3.AutoRetransmission=ENABLE +FDCAN3.AutoRetransmission=DISABLE FDCAN3.CalculateBaudRateNominal=1000000 FDCAN3.CalculateTimeBitNominal=1000 FDCAN3.CalculateTimeQuantumNominal=25.0 @@ -375,15 +377,16 @@ FDCAN3.DataPrescaler=3 FDCAN3.DataSyncJumpWidth=10 FDCAN3.DataTimeSeg1=29 FDCAN3.DataTimeSeg2=10 -FDCAN3.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,ClockCalibrationCCU +FDCAN3.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,ClockCalibrationCCU,RxFifo0ElmtsNbr FDCAN3.MessageRAMOffset=1706 FDCAN3.NominalPrescaler=3 FDCAN3.NominalSyncJumpWidth=10 FDCAN3.NominalTimeSeg1=29 FDCAN3.NominalTimeSeg2=10 -FDCAN3.ProtocolException=ENABLE -FDCAN3.RxFifo1ElmtsNbr=32 -FDCAN3.StdFiltersNbr=1 +FDCAN3.ProtocolException=DISABLE +FDCAN3.RxFifo0ElmtsNbr=4 +FDCAN3.RxFifo1ElmtsNbr=4 +FDCAN3.StdFiltersNbr=14 FDCAN3.TxFifoQueueElmtsNbr=32 FREERTOS.FootprintOK=true FREERTOS.IPParameters=Tasks01,configENABLE_FPU,FootprintOK,configUSE_NEWLIB_REENTRANT,configCHECK_FOR_STACK_OVERFLOW,configUSE_MALLOC_FAILED_HOOK,configTOTAL_HEAP_SIZE,configMINIMAL_STACK_SIZE diff --git a/User_Code/bsp/fdcan/bsp_fdcan.c b/User_Code/bsp/fdcan/bsp_fdcan.c index fb4850b..35d4d1c 100644 --- a/User_Code/bsp/fdcan/bsp_fdcan.c +++ b/User_Code/bsp/fdcan/bsp_fdcan.c @@ -78,24 +78,26 @@ static void CANAddFilter(FDCANInstance *_instance) fdcan_filter_conf.IsCalibrationMsg = 0; //fdcan_filter_conf.RxBufferIndex=0; - // ================== 【核心修复区】 ==================@todo:有问题 我要验牌 - // 1. 强制让 FDCAN 进入 INIT 模式,否则无法写入 Message RAM - HAL_FDCAN_Stop(_instance->can_handle); + // // ================== 【核心修复区】 ==================@todo:有问题 我要验牌 + // // 1. 强制让 FDCAN 进入 INIT 模式,否则无法写入 Message RAM + // HAL_FDCAN_Stop(_instance->can_handle); + // + // // 2. 写入过滤器配置 + // HAL_FDCAN_ConfigFilter(_instance->can_handle, &fdcan_filter_conf); + // + // // 3. 重新启动 FDCAN + // HAL_FDCAN_Start(_instance->can_handle); + // + // // 4. 【救命稻草】HAL_FDCAN_Stop 关闭了所有中断,必须在这里重新激活! + // uint32_t FDCAN_RXActiveITs = FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO0_FULL | + // FDCAN_IT_RX_FIFO0_WATERMARK | FDCAN_IT_RX_FIFO0_MESSAGE_LOST | + // FDCAN_IT_RX_FIFO1_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_FULL | + // FDCAN_IT_RX_FIFO1_WATERMARK | FDCAN_IT_RX_FIFO1_MESSAGE_LOST; + // HAL_FDCAN_ActivateNotification(_instance->can_handle, FDCAN_RXActiveITs, 0); + // // ==================================================== - // 2. 写入过滤器配置 HAL_FDCAN_ConfigFilter(_instance->can_handle, &fdcan_filter_conf); - // 3. 重新启动 FDCAN - HAL_FDCAN_Start(_instance->can_handle); - - // 4. 【救命稻草】HAL_FDCAN_Stop 关闭了所有中断,必须在这里重新激活! - uint32_t FDCAN_RXActiveITs = FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO0_FULL | - FDCAN_IT_RX_FIFO0_WATERMARK | FDCAN_IT_RX_FIFO0_MESSAGE_LOST | - FDCAN_IT_RX_FIFO1_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_FULL | - FDCAN_IT_RX_FIFO1_WATERMARK | FDCAN_IT_RX_FIFO1_MESSAGE_LOST; - HAL_FDCAN_ActivateNotification(_instance->can_handle, FDCAN_RXActiveITs, 0); - // ==================================================== - #else CAN_FilterTypeDef can_filter_conf; static uint8_t can1_filter_idx = 0, can2_filter_idx = 14; // 0-13给can1用,14-27给can2用 diff --git a/User_Code/module/periph/power_meters/xiditech/xidipwmeter.c b/User_Code/module/periph/power_meters/xiditech/xidipwmeter.c index 49f7625..1e6229b 100644 --- a/User_Code/module/periph/power_meters/xiditech/xidipwmeter.c +++ b/User_Code/module/periph/power_meters/xiditech/xidipwmeter.c @@ -13,14 +13,15 @@ static XidiPowerMeterInstance *power_meter_instance = NULL; * @brief 功率计数据解码函数 * @param _instance FDCAN实例指针 * - * @note 数据格式: - * DATA[0]: 电流数值低8位 - * DATA[1]: 电流数值高8位 - * DATA[2]: 电压数值低8位 - * DATA[3]: 电压数值高8位 - * DATA[4]-DATA[7]: 保留 - * - * 电压电流数值均为放大100倍后的整数,需要除以100.0得到实际值 + * @note 新版数据格式 (大端模式): + * DATA[0]: 电压高8位 + * DATA[1]: 电压低8位 + * DATA[2]: 电流高8位 + * DATA[3]: 电流低8位 + * DATA[4]: 功率高8位 + * DATA[5]: 功率低8位 + * DATA[6]: 标识符 + * DATA[7]: 校验和 */ void XidiPowerMeterDecode(FDCANInstance *_instance) { @@ -39,18 +40,20 @@ void XidiPowerMeterDecode(FDCANInstance *_instance) // 计算时间间隔 measure->dt = DWT_GetDeltaT(&power_meter_instance->feed_cnt); - // 解析电流数据 (放大100倍,需要除以100) - auto current_raw = (int16_t) ((rxbuff[1] << 8) | rxbuff[0]); - measure->current = (float) current_raw / 100.0f; - - // 解析电压数据 (放大100倍,需要除以100) - auto voltage_raw = (int16_t) ((rxbuff[3] << 8) | rxbuff[2]); + // 1. 解析电压 (高8位在前,低8位在后) + uint16_t voltage_raw = (rxbuff[0] << 8) | rxbuff[1]; measure->voltage = (float) voltage_raw / 100.0f; - // 计算功率 - measure->power = measure->voltage * measure->current; + // 2. 解析电流 (高8位在前,低8位在后) + uint16_t current_raw = (rxbuff[2] << 8) | rxbuff[3]; + measure->current = (float) current_raw / 100.0f; - // 计算累计能量 (功率 × 时间) + // 3. 解析功率 (高8位在前,低8位在后) + // 既然协议里直接发了功率,我们就直接读硬件算好的,比自己用 U*I 算更准 + uint16_t power_raw = (rxbuff[4] << 8) | rxbuff[5]; + measure->power = (float) power_raw / 100.0f; + + // 4. 计算累计能量 (功率 × 时间) measure->energy += measure->power * measure->dt * 0.001f; // dt单位是ms,转换为秒 measure->update_cnt++; @@ -79,7 +82,7 @@ XidiPowerMeterInstance *XidiPowerMeterInit(XidiPowerMeter_Init_Config_s *XidiPow } // 2. 分配内存并清零 - power_meter_instance = (XidiPowerMeterInstance *)malloc(sizeof(XidiPowerMeterInstance)); + power_meter_instance = (XidiPowerMeterInstance *) malloc(sizeof(XidiPowerMeterInstance)); if (power_meter_instance == NULL) { return NULL; diff --git a/User_Code/user_task/dev_tasks/dev_cmd.c b/User_Code/user_task/dev_tasks/dev_cmd.c index 11684c0..412d3a5 100644 --- a/User_Code/user_task/dev_tasks/dev_cmd.c +++ b/User_Code/user_task/dev_tasks/dev_cmd.c @@ -19,7 +19,7 @@ static float current_energy_j = 0.0f; // 1. 定义为静态变量(static),确保它的内存空间常驻,防止底层指针悬垂! static XidiPowerMeter_Init_Config_s xidi_pm_config = { .can_config = { - .can_handle = &hfdcan1, // 原来直接传的句柄,现在放进结构体里 + .can_handle = &hfdcan2, // 原来直接传的句柄,现在放进结构体里 .rx_id = 0x213, // 接收 ID .tx_id = 0x000, // 发送 ID (不发送填0) }, @@ -52,16 +52,7 @@ void CmdTask(void *argument) DaemonReload(chassis_power_meter->daemon); while (1) { - if (chassis_power_meter != NULL) - { - current_power_w = XidiPowerMeterGetPower(chassis_power_meter); - current_voltage_v = XidiPowerMeterGetVoltage(chassis_power_meter); - current_energy_j = XidiPowerMeterGetEnergy(chassis_power_meter); - - // 你可以将获取到的功率写入要发送给底盘的 cmd 中,例如限制最大速度 - // chassis_cmd_send.real_power = current_power_w; - } - + DaemonReload(chassis_power_meter->daemon); osDelay(10); // 根据实际需要调整读取频率 } }