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:
+59
-27
@@ -1,3 +1,9 @@
|
||||
/**
|
||||
* @file device/ADC.cpp
|
||||
* @brief 底层设备驱动与外设封装源文件
|
||||
* @note 本文件仅补充 Doxygen 文档注释,不改变代码逻辑。
|
||||
*/
|
||||
|
||||
#include "adc.h"
|
||||
#include "Can.h"
|
||||
#include "FOC.h"
|
||||
@@ -10,9 +16,13 @@
|
||||
#include <cstring>
|
||||
#include <gd32c10x_dma.h>
|
||||
|
||||
/** @brief ADC_SCALE 常量定义 */
|
||||
constexpr float ADC_SCALE = 3.3f / 4096.0f;
|
||||
/** @brief TEMP_FACTOR 常量定义 */
|
||||
constexpr float TEMP_FACTOR = 1000.0f / 4.3f;
|
||||
/** @brief VCC_FACTOR 常量定义 */
|
||||
constexpr float VCC_FACTOR = 11.0f;
|
||||
/** @brief CURRENT_FACTOR 常量定义 */
|
||||
constexpr float CURRENT_FACTOR =
|
||||
1.0f / 50.0f * 100.0f; // 50倍放大,100倍电流采样电阻, 单位mA
|
||||
extern CAN_transmiter CAN0_transmiter;
|
||||
@@ -22,6 +32,11 @@ u16 adc_value[3] = {0}; // regular DMA: MCU温度 / DRV温度 / VBUS
|
||||
static volatile u16 adc_current_value[3] = {0}; // injected 同步采样: U / V / W
|
||||
static volatile u8 adc_current_frame_ready = 0;
|
||||
|
||||
/**
|
||||
* @brief 将电流 ADC 原始值换算为毫安值
|
||||
* @param[in] raw_adc 参数
|
||||
* @return float 返回值
|
||||
*/
|
||||
static inline float current_adc_to_ma(u16 raw_adc) {
|
||||
return (raw_adc * ADC_SCALE + CURRENT_OFFSET) * CURRENT_FACTOR;
|
||||
}
|
||||
@@ -155,12 +170,7 @@ u8 sampler::init() {
|
||||
* 温度值,单位为摄氏度,范围应在-40到145之间,如果读取失败则返回0.0f
|
||||
*/
|
||||
float sampler::get_mcu_temp() {
|
||||
tempora_sample = medium_filter(mcu_temp_samples, ADC_FILTER_SIZE);
|
||||
// 检查温度读数是否在有效范围内
|
||||
if (tempora_sample < MIN_TEMP or tempora_sample > MAX_TEMP) {
|
||||
return ERROR_ADC_VAL;
|
||||
}
|
||||
return tempora_sample;
|
||||
return cached_mcu_temp;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -171,12 +181,7 @@ float sampler::get_mcu_temp() {
|
||||
* 如果计算结果超出有效范围(-40到255摄氏度),则重新采样计算。
|
||||
*/
|
||||
float sampler::get_drv_temp() {
|
||||
tempora_sample = medium_filter(drv_temp_samples, ADC_FILTER_SIZE);
|
||||
// 检查温度读数是否在有效范围内
|
||||
if (tempora_sample < MIN_TEMP || tempora_sample > MAX_TEMP) {
|
||||
return ERROR_ADC_VAL;
|
||||
}
|
||||
return tempora_sample;
|
||||
return cached_drv_temp;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -221,13 +226,7 @@ float sampler::get_current(char type) {
|
||||
* 如果计算结果超出有效范围(-40到255伏特),则重新采样计算。
|
||||
*/
|
||||
float sampler::get_vbus_voltage() {
|
||||
tempora_sample = medium_filter(vbus_samples, ADC_FILTER_SIZE);
|
||||
// 检查电压读数是否在有效范围内
|
||||
const u8 mid = ADC_FILTER_SIZE / 2;
|
||||
if (vbus_samples[mid] > MAX_VCC or vbus_samples[mid] < MIN_VCC) {
|
||||
return ERROR_ADC_VAL;
|
||||
}
|
||||
return tempora_sample;
|
||||
return cached_vbus;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -237,21 +236,39 @@ float sampler::get_vbus_voltage() {
|
||||
* 如果计算结果超出有效范围(-40到255摄氏度),则重新采样计算。
|
||||
*/
|
||||
void sampler::update_mcu_temp() {
|
||||
memmove(mcu_temp_samples, mcu_temp_samples + 1,
|
||||
(ADC_FILTER_SIZE - 1) * sizeof(float));
|
||||
mcu_temp_samples[ADC_FILTER_SIZE - 1] =
|
||||
// 环形缓冲区写入,替代 memmove
|
||||
mcu_temp_samples[mcu_temp_head] =
|
||||
(1.43f - adc_value[0] * ADC_SCALE) * TEMP_FACTOR + 35.0f;
|
||||
mcu_temp_head++;
|
||||
if (mcu_temp_head >= ADC_FILTER_SIZE) mcu_temp_head = 0;
|
||||
|
||||
// 更新缓存:中值滤波
|
||||
tempora_sample = medium_filter(mcu_temp_samples, ADC_FILTER_SIZE);
|
||||
if (tempora_sample < MIN_TEMP || tempora_sample > MAX_TEMP) {
|
||||
cached_mcu_temp = ERROR_ADC_VAL;
|
||||
} else {
|
||||
cached_mcu_temp = tempora_sample;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 更新MCU温度
|
||||
*/
|
||||
void sampler::update_drv_temp() {
|
||||
memmove(drv_temp_samples, drv_temp_samples + 1,
|
||||
(ADC_FILTER_SIZE - 1) * sizeof(float));
|
||||
// 环形缓冲区写入,替代 memmove
|
||||
float R_now = (float)adc_value[1] / (4096 - (float)adc_value[1]) * 4700;
|
||||
drv_temp_samples[ADC_FILTER_SIZE - 1] =
|
||||
drv_temp_samples[drv_temp_head] =
|
||||
1.0f / (0.00335f + 0.00025f * log(R_now / 10000.0f)) - 273.15f;
|
||||
drv_temp_head++;
|
||||
if (drv_temp_head >= ADC_FILTER_SIZE) drv_temp_head = 0;
|
||||
|
||||
// 更新缓存:中值滤波
|
||||
tempora_sample = medium_filter(drv_temp_samples, ADC_FILTER_SIZE);
|
||||
if (tempora_sample < MIN_TEMP || tempora_sample > MAX_TEMP) {
|
||||
cached_drv_temp = ERROR_ADC_VAL;
|
||||
} else {
|
||||
cached_drv_temp = tempora_sample;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -278,10 +295,25 @@ void sampler::update_current() {
|
||||
* @brief 更新供电电压
|
||||
*/
|
||||
void sampler::update_vbus_voltage() {
|
||||
memmove(vbus_samples, vbus_samples + 1, (ADC_FILTER_SIZE - 1) * sizeof(float));
|
||||
vbus_samples[ADC_FILTER_SIZE - 1] = adc_value[2] * ADC_SCALE * VCC_FACTOR;
|
||||
// 环形缓冲区写入,替代 memmove
|
||||
vbus_samples[temp_vbus_head] = adc_value[2] * ADC_SCALE * VCC_FACTOR;
|
||||
temp_vbus_head++;
|
||||
if (temp_vbus_head >= ADC_FILTER_SIZE) temp_vbus_head = 0;
|
||||
|
||||
// 更新缓存:中值滤波 + 范围检查
|
||||
tempora_sample = medium_filter(vbus_samples, ADC_FILTER_SIZE);
|
||||
const u8 mid = ADC_FILTER_SIZE / 2;
|
||||
if (vbus_samples[mid] > MAX_VCC || vbus_samples[mid] < MIN_VCC) {
|
||||
cached_vbus = ERROR_ADC_VAL;
|
||||
} else {
|
||||
cached_vbus = tempora_sample;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ADC0_1_IRQHandler 中断处理函数
|
||||
* @return void
|
||||
*/
|
||||
extern "C" void ADC0_1_IRQHandler(void) {
|
||||
if (adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOIC) != RESET) {
|
||||
/* 丢弃 rank0 dummy,真实样本使用 rank1/2/3,对应 U/V/W 同一 PWM 时刻 */
|
||||
|
||||
Reference in New Issue
Block a user