refactor(FOC): 添加Doxygen文档注释并优化SVPWM算法性能

添加了完整的Doxygen文档注释到FOC算法模块的所有函数、类和变量,提升了代码可读性和维护性。同时优化了SVPWM算法实现,将atan2f替换为符号法扇区判断,显著提升计算效率(约15周期vs atan2f 300周期),并改进了arm_sin_cos_f32替代sqrtf提高性能。

feat(FOC): 统一电气角度计算避免重复运算

重构代码以统一电气角度计算,在各个控制循环中只计算一次电气角度并传递给需要的函数,避免了多次重复的fmodf运算和角度归一化操作,提升了实时控制性能。

refactor(Filter): 改进α-β观测器角度处理精度

修改角度卡尔曼滤波器在归一化角度空间[0,360)内工作,避免大累积角度的浮点精度损失问题,确保静止状态下不会产生虚假速度,同时保持与下游代码的兼容性。

refactor: 为算法模块添加完整文档注释

为所有算法模块(FOC、Filter、pid、thermal)添加了详细的Doxygen文档注释,包括函数说明、参数描述、返回值说明等,便于代码理解和API文档生成。
This commit is contained in:
cbb
2026-05-23 22:46:32 +08:00
parent bec7c11b87
commit 4c4e47e9e3
62 changed files with 10367 additions and 126 deletions
+108
View File
@@ -1,3 +1,9 @@
/**
* @file device/Can.cpp
* @brief 底层设备驱动与外设封装源文件
* @note 本文件仅补充 Doxygen 文档注释,不改变代码逻辑。
*/
#include "Can.h"
#include "FOC.h"
#include "Filter.h"
@@ -20,11 +26,14 @@
// CAN 调试宏定义
#if CAN_DEBUG
/** @brief CAN_DEBUG_PRINT 宏定义 */
#define CAN_DEBUG_PRINT(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
/** @brief CAN_DEBUG_PRINT 宏定义 */
#define CAN_DEBUG_PRINT(fmt, ...) ((void)0)
#endif
/** @brief CANX 常量定义 */
constexpr u16 CANX = CAN0;
extern FOC_Controller FOC;
extern sampler sampler;
@@ -43,7 +52,9 @@ static volatile bool can_rx_dma_busy = false;
static can_receive_message_struct can_rx_dma_message;
// CAN接收/发送队列结构
/** @brief CAN_RX_QUEUE_SIZE 宏定义 */
#define CAN_RX_QUEUE_SIZE 32
/** @brief CAN_TX_QUEUE_SIZE 宏定义 */
#define CAN_TX_QUEUE_SIZE 32
typedef struct {
@@ -233,6 +244,10 @@ bool CAN_transmiter::dequeue_rx_message(can_receive_message_struct &message) {
// 静默模式相关函数实现
// 使用 systick 获取系统时间(ms)
/**
* @brief 获取系统毫秒计数
* @return extern u32 返回值
*/
extern u32 get_systick_ms(void);
/*!
@@ -523,6 +538,10 @@ void canfd_loopback_test(void) {
uint8_t transmit_mailbox = 0;
std::mt19937 gen;
/**
* @brief dis 函数
* @return std::uniform_int_distribution<int> 返回值
*/
std::uniform_int_distribution<int> dis(0, 255);
can_struct_para_init(CAN_FD_FRAME_STRUCT, &transmit_message);
@@ -581,7 +600,17 @@ void can_loopback_test(void) {
uint32_t timeout = 0xFF;
uint8_t transmit_mailbox = 0;
/**
* @brief gen 函数
* @param[in] rand 参数
* @return std::mt19937 返回值
*/
std::mt19937 gen(rand()); // 使用随机设备生成的种子
/**
* @brief dis 函数
* @param[in] xff 参数
* @return std::uniform_int_distribution<int> 返回值
*/
std::uniform_int_distribution<int> dis(0, 0xff);
can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message);
@@ -671,19 +700,38 @@ u8 CAN_transmiter::init() {
return 0;
}
/**
* @brief CAN_EnterCritical 函数
* @return uint32_t 返回值
*/
static uint32_t CAN_EnterCritical(void) {
uint32_t primask = __get_PRIMASK();
__disable_irq();
return primask;
}
/**
* @brief CAN_ExitCritical 函数
* @param[in] primask 参数
* @return void
*/
static void CAN_ExitCritical(uint32_t primask) { __set_PRIMASK(primask); }
/**
* @brief CANFD_DlcToLength 函数
* @param[in] dlc 参数
* @return u8 返回值
*/
static u8 CANFD_DlcToLength(u8 dlc) {
return (dlc <= 8U) ? dlc
: ((dlc <= 15U) ? CANFD_DLC_LENGTH_TABLE[dlc - 9U] : 0U);
}
/**
* @brief CANFD_NormalizeLength 函数
* @param[in] length 参数
* @return u8 返回值
*/
static u8 CANFD_NormalizeLength(u8 length) {
if (length <= 8U)
return length;
@@ -695,8 +743,18 @@ static u8 CANFD_NormalizeLength(u8 length) {
return 0U;
}
/**
* @brief CANFD_WordCount 函数
* @param[in] length 参数
* @return u8 返回值
*/
static u8 CANFD_WordCount(u8 length) { return (length + 3U) / 4U; }
/**
* @brief CAN_RX_QueuePushFromIsr 函数
* @param[in] message 参数
* @return void
*/
static void CAN_RX_QueuePushFromIsr(const can_receive_message_struct &message) {
if (rx_queue_count < CAN_RX_QUEUE_SIZE) {
rx_queue[rx_queue_tail].id = message.rx_efid;
@@ -716,16 +774,29 @@ static void CAN_RX_QueuePushFromIsr(const can_receive_message_struct &message) {
static void CAN_RX_ReleaseFifo0(void) { CAN_RFIFO0(CAN0) |= CAN_RFIFO0_RFD0; }
/**
* @brief CAN_RX_Fifo0PendingCount 函数
* @return u8 返回值
*/
static u8 CAN_RX_Fifo0PendingCount(void) {
return can_receive_message_length_get(CAN0, CAN_FIFO0);
}
/**
* @brief CAN_TX_HasEmptyMailbox 函数
* @return bool 返回值
*/
static bool CAN_TX_HasEmptyMailbox(void) {
return (can_flag_get(CAN0, CAN_FLAG_TME0) != RESET) ||
(can_flag_get(CAN0, CAN_FLAG_TME1) != RESET) ||
(can_flag_get(CAN0, CAN_FLAG_TME2) != RESET);
}
/**
* @brief CAN_RX_ReadMetadata 函数
* @param[in] message 参数
* @return void
*/
static void CAN_RX_ReadMetadata(can_receive_message_struct *message) {
uint8_t dlc;
uint32_t rfifomi = CAN_RFIFOMI(CAN0, CAN_FIFO0);
@@ -752,6 +823,11 @@ static void CAN_RX_ReadMetadata(can_receive_message_struct *message) {
}
}
/**
* @brief CAN_RX_StartPayloadDma 函数
* @param[in] metadata 参数
* @return void
*/
static void CAN_RX_StartPayloadDma(const can_receive_message_struct &metadata) {
can_rx_dma_message = metadata;
if (can_rx_dma_message.rx_dlen > 64) {
@@ -775,6 +851,10 @@ static void CAN_RX_StartPayloadDma(const can_receive_message_struct &metadata) {
dma_channel_enable(DMA0, DMA_CH4);
}
/**
* @brief CAN_RX_PumpFifo0 函数
* @return void
*/
static void CAN_RX_PumpFifo0(void) {
while (!can_rx_dma_busy) {
if (CAN_RX_Fifo0PendingCount() == 0U) {
@@ -794,6 +874,11 @@ static void CAN_RX_PumpFifo0(void) {
}
}
/**
* @brief CAN_RX_QueuePop 函数
* @param[in] item 参数
* @return u8 返回值
*/
static u8 CAN_RX_QueuePop(can_rx_queue_item_t *item) {
u8 popped = 0U;
uint32_t primask = CAN_EnterCritical();
@@ -810,6 +895,11 @@ static u8 CAN_RX_QueuePop(can_rx_queue_item_t *item) {
return popped;
}
/**
* @brief CAN_TX_QueuePush 函数
* @param[in] message 参数
* @return u8 返回值
*/
static u8 CAN_TX_QueuePush(const can_trasnmit_message_struct &message) {
u8 queued = 0U;
uint32_t primask = CAN_EnterCritical();
@@ -831,6 +921,11 @@ static u8 CAN_TX_QueuePush(const can_trasnmit_message_struct &message) {
return 0U;
}
/**
* @brief CAN_TX_QueuePeek 函数
* @param[in] message 参数
* @return u8 返回值
*/
static u8 CAN_TX_QueuePeek(can_trasnmit_message_struct *message) {
u8 has_message = 0U;
uint32_t primask = CAN_EnterCritical();
@@ -842,6 +937,11 @@ static u8 CAN_TX_QueuePeek(can_trasnmit_message_struct *message) {
return has_message;
}
/**
* @brief CAN_TX_QueuePop 函数
* @param[in] message 参数
* @return u8 返回值
*/
static u8 CAN_TX_QueuePop(can_trasnmit_message_struct *message) {
u8 popped = 0U;
uint32_t primask = CAN_EnterCritical();
@@ -856,6 +956,10 @@ static u8 CAN_TX_QueuePop(can_trasnmit_message_struct *message) {
return popped;
}
/**
* @brief CAN_TX_DisableTmeIfQueueEmpty 函数
* @return void
*/
static void CAN_TX_DisableTmeIfQueueEmpty(void) {
uint32_t primask = CAN_EnterCritical();
if (tx_queue_count == 0U) {
@@ -864,6 +968,10 @@ static void CAN_TX_DisableTmeIfQueueEmpty(void) {
CAN_ExitCritical(primask);
}
/**
* @brief CAN_TX_ServiceQueue 函数
* @return void
*/
static void CAN_TX_ServiceQueue(void) {
can_trasnmit_message_struct queued_message;
while (CAN_TX_HasEmptyMailbox()) {