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:
@@ -1,3 +1,9 @@
|
||||
/**
|
||||
* @file device/Can.h
|
||||
* @brief 底层设备驱动与外设封装源文件
|
||||
* @note 本文件仅补充 Doxygen 文档注释,不改变代码逻辑。
|
||||
*/
|
||||
|
||||
#ifndef _CAN_H
|
||||
#define _CAN_H
|
||||
|
||||
@@ -11,18 +17,35 @@ extern "C" {
|
||||
#include "config.h"
|
||||
|
||||
// 定义一个联合体类型用于 float 和 byte 数组之间的转换
|
||||
/**
|
||||
* @brief 匿名联合体 联合体定义
|
||||
*/
|
||||
typedef union {
|
||||
float f;
|
||||
u8 b[4];
|
||||
} float_union_t;
|
||||
|
||||
// 添加辅助函数用于将 u16 类型数据打包到 u8 数组中
|
||||
/**
|
||||
* @brief pack_u16_to_bytes 函数
|
||||
* @param[in] buffer 参数
|
||||
* @param[in] offset 参数
|
||||
* @param[in] value 参数
|
||||
* @return void
|
||||
*/
|
||||
static inline void pack_u16_to_bytes(u8 *buffer, u16 offset, u16 value) {
|
||||
buffer[offset] = (u8)(value & 0xFF);
|
||||
buffer[offset + 1] = (u8)((value >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
// 添加辅助函数用于将 float 类型数据打包到 u8 数组中
|
||||
/**
|
||||
* @brief pack_float_to_bytes 函数
|
||||
* @param[in] buffer 参数
|
||||
* @param[in] offset 参数
|
||||
* @param[in] float_union 参数
|
||||
* @return void
|
||||
*/
|
||||
static inline void pack_float_to_bytes(u8 *buffer, u16 offset,
|
||||
float_union_t &float_union) {
|
||||
buffer[offset] = float_union.b[0];
|
||||
@@ -32,18 +55,36 @@ static inline void pack_float_to_bytes(u8 *buffer, u16 offset,
|
||||
}
|
||||
|
||||
// 添加辅助函数用于从 u8 数组中解包 short 类型数据
|
||||
/**
|
||||
* @brief unpack_bytes_to_short 函数
|
||||
* @param[in] buffer 参数
|
||||
* @param[in] offset 参数
|
||||
* @return short 返回值
|
||||
*/
|
||||
static inline short unpack_bytes_to_short(u8 *buffer, u16 offset) {
|
||||
short value = (short)(buffer[offset] | (buffer[offset + 1] << 8));
|
||||
return value;
|
||||
}
|
||||
|
||||
// 添加辅助函数用于从 u8 数组中解包 u16 类型数据
|
||||
/**
|
||||
* @brief unpack_bytes_to_u16 函数
|
||||
* @param[in] buffer 参数
|
||||
* @param[in] offset 参数
|
||||
* @return u16 返回值
|
||||
*/
|
||||
static inline u16 unpack_bytes_to_u16(u8 *buffer, u16 offset) {
|
||||
u16 value = (u16)(buffer[offset] | (buffer[offset + 1] << 8));
|
||||
return value;
|
||||
}
|
||||
|
||||
// 添加辅助函数用于从 u8 数组中解包 float 类型数据
|
||||
/**
|
||||
* @brief unpack_bytes_to_float 函数
|
||||
* @param[in] buffer 参数
|
||||
* @param[in] offset 参数
|
||||
* @return float_union_t 返回值
|
||||
*/
|
||||
static inline float_union_t unpack_bytes_to_float(u8 *buffer, u16 offset) {
|
||||
float_union_t float_union;
|
||||
float_union.b[0] = buffer[offset];
|
||||
@@ -53,17 +94,61 @@ static inline float_union_t unpack_bytes_to_float(u8 *buffer, u16 offset) {
|
||||
return float_union;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化 CAN 引脚
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 can_gpio_init(void); // CAN 引脚初始化
|
||||
/**
|
||||
* @brief 配置 CAN 外设
|
||||
* @return void
|
||||
*/
|
||||
void can_config(void); // CAN 初始化
|
||||
/**
|
||||
* @brief 配置 CAN FD 外设
|
||||
* @return void
|
||||
*/
|
||||
void canfd_config(void); // CANFD 初始化
|
||||
/**
|
||||
* @brief 初始化 CAN DMA 通道
|
||||
* @return void
|
||||
*/
|
||||
void can_dma_init(void); // CAN DMA 初始化
|
||||
/**
|
||||
* @brief CAN0 发送中断处理函数
|
||||
* @return void
|
||||
*/
|
||||
void CAN0_TX_IRQHandler(void); // CAN 发送中断处理函数
|
||||
/**
|
||||
* @brief CAN0 接收中断处理函数
|
||||
* @return void
|
||||
*/
|
||||
void CAN0_RX0_IRQHandler(void); // CAN 接收中断处理函数
|
||||
/**
|
||||
* @brief DMA0 通道 4 中断处理函数
|
||||
* @return void
|
||||
*/
|
||||
void DMA0_Channel4_IRQHandler(void); // DMA 通道 4 中断处理函数 (CAN 接收)
|
||||
/**
|
||||
* @brief DMA0 通道 5 中断处理函数
|
||||
* @return void
|
||||
*/
|
||||
void DMA0_Channel5_IRQHandler(void); // DMA 通道 5 中断处理函数 (CAN 发送)
|
||||
/**
|
||||
* @brief jumpToBOOT 函数
|
||||
* @return void
|
||||
*/
|
||||
void jumpToBOOT();
|
||||
|
||||
/**
|
||||
* @brief can_loopback_init 函数
|
||||
* @return void
|
||||
*/
|
||||
void can_loopback_init(void);
|
||||
/**
|
||||
* @brief can_loopback_test 函数
|
||||
* @return void
|
||||
*/
|
||||
void can_loopback_test(void);
|
||||
|
||||
/*!
|
||||
@@ -114,21 +199,64 @@ class CAN_transmiter {
|
||||
volatile uint8_t rx_buffer_head = 0;
|
||||
volatile uint8_t rx_buffer_tail = 0;
|
||||
|
||||
/**
|
||||
* @brief 更新对象内部状态或采样数据
|
||||
* @return void
|
||||
*/
|
||||
void update(); // 更新数据
|
||||
/**
|
||||
* @brief CAN_Receive 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CAN_Receive(); // CAN 接收
|
||||
/**
|
||||
* @brief CANFD_Receive 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CANFD_Receive(); // CANFD 接收
|
||||
/**
|
||||
* @brief is_rx_buffer_full 函数
|
||||
* @return bool 返回值
|
||||
*/
|
||||
bool is_rx_buffer_full();
|
||||
/**
|
||||
* @brief is_rx_buffer_empty 函数
|
||||
* @return bool 返回值
|
||||
*/
|
||||
bool is_rx_buffer_empty();
|
||||
/**
|
||||
* @brief dequeue_rx_message 函数
|
||||
* @param[in] message 参数
|
||||
* @return bool 返回值
|
||||
*/
|
||||
bool dequeue_rx_message(can_receive_message_struct& message);
|
||||
/**
|
||||
* @brief check_silent_mode 函数
|
||||
* @return void
|
||||
*/
|
||||
void check_silent_mode(); // 检查静默模式是否结束
|
||||
|
||||
public:
|
||||
// 节点 ID 相关辅助函数 (使用高 16 位存储节点 ID)
|
||||
/**
|
||||
* @brief build_can_id 函数
|
||||
* @param[in] base_id 参数
|
||||
* @return u32 返回值
|
||||
*/
|
||||
u32 build_can_id(u32 base_id); // 根据节点 ID 构建 CAN ID,格式:[节点 ID(16 位)][基础 ID(16 位)]
|
||||
/**
|
||||
* @brief is_message_for_me 函数
|
||||
* @param[in] received_id 参数
|
||||
* @return bool 返回值
|
||||
*/
|
||||
bool is_message_for_me(u32 received_id); // 判断消息是否发给本节点
|
||||
|
||||
public:
|
||||
// 添加构造函数声明
|
||||
/**
|
||||
* @brief 初始化对象或模块
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 init(void);
|
||||
|
||||
can_receive_message_struct receive_message; // 接收消息结构体
|
||||
@@ -138,23 +266,88 @@ class CAN_transmiter {
|
||||
|
||||
bool MagStatus = 0; // 磁状态码
|
||||
bool ThermalStatus = 0; // 热能状态码
|
||||
/**
|
||||
* @brief communication_check 函数
|
||||
* @return void
|
||||
*/
|
||||
void communication_check(); // 通信检查
|
||||
/**
|
||||
* @brief CAN_Sleep 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CAN_Sleep(); // CAN 进入睡眠
|
||||
/**
|
||||
* @brief CAN_Wakeup 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CAN_Wakeup(); // CAN 唤醒
|
||||
/**
|
||||
* @brief CAN_AsyncSend 函数
|
||||
* @param[in] ID 参数
|
||||
* @param[in] length 参数
|
||||
* @param[in] data 参数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CAN_AsyncSend(u32 ID, u8 length, u8 *data); // CAN 异步发送 (使用 DMA)
|
||||
/**
|
||||
* @brief CANFD_AsyncSend 函数
|
||||
* @param[in] ID 参数
|
||||
* @param[in] length 参数
|
||||
* @param[in] data 参数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CANFD_AsyncSend(u32 ID, u8 length, u8 *data); // CANFD 异步发送 (使用 DMA)
|
||||
/**
|
||||
* @brief CAN_all_Send 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CAN_all_Send(); // CAN 发送
|
||||
/**
|
||||
* @brief CANFD_all_Send 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 CANFD_all_Send(); // CANFD 发送
|
||||
/**
|
||||
* @brief enter_silent_mode 函数
|
||||
* @return void
|
||||
*/
|
||||
void enter_silent_mode(); // 进入静默模式(停发 10 秒)
|
||||
/**
|
||||
* @brief is_in_silent_mode 函数
|
||||
* @return bool 返回值
|
||||
*/
|
||||
bool is_in_silent_mode(); // 检查是否在静默模式中
|
||||
|
||||
// 节点 ID 管理接口
|
||||
/**
|
||||
* @brief 获取 get_node_id 对应的数据或状态
|
||||
* @return u16 返回值
|
||||
*/
|
||||
u16 get_node_id(); // 获取当前节点 ID
|
||||
/**
|
||||
* @brief 设置 set_node_id 对应的参数或状态
|
||||
* @param[in] new_id 参数
|
||||
* @return void
|
||||
*/
|
||||
void set_node_id(u16 new_id); // 设置节点 ID
|
||||
/**
|
||||
* @brief load_node_id_from_flash 函数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 load_node_id_from_flash(); // 从 Flash 加载节点 ID
|
||||
/**
|
||||
* @brief save_node_id_to_flash 函数
|
||||
* @param[in] new_id 参数
|
||||
* @return u8 返回值
|
||||
*/
|
||||
u8 save_node_id_to_flash(u16 new_id); // 保存节点 ID 到 Flash
|
||||
|
||||
// 中断处理函数需要访问的公共接口
|
||||
/**
|
||||
* @brief enqueue_rx_message_from_isr 函数
|
||||
* @param[in] message 参数
|
||||
* @return void
|
||||
*/
|
||||
void enqueue_rx_message_from_isr(const can_receive_message_struct& message) {
|
||||
if (!is_rx_buffer_full()) {
|
||||
rx_message_buffer[rx_buffer_head] = message;
|
||||
|
||||
Reference in New Issue
Block a user