refactor(timer): 引入任务调度机制替代硬编码定时操作

通过定义 `TaskScheduler` 结构体和相关枚举类型,
将原TIMER2中断中耦合的操作解耦成多个独立任务标志,
便于后续维护和扩展,并提高系统实时响应能力。

feat(FOC): 优化电压安全范围与PID参数配置
将电压计算中的 `voltage_power_supply` 替换为更安全的 `v_safe`,
并引入电压有效性检测逻辑。同时调整PID控制器参数以适配12V供电场景。
此外,统一布尔变量初始化方式,提升代码可读性和安全性。

chore(build): 更新CMSIS工具链版本依赖
更新vcpkg配置文件中CMSIS Toolbox的版本要求,
从2.11.0升级至2.12.0,确保构建环境兼容最新功能及修复。
This commit is contained in:
cbb
2025-11-13 02:04:58 +08:00
parent db2d08032c
commit 67a1c04458
13 changed files with 161 additions and 110 deletions
+15 -51
View File
@@ -1,21 +1,17 @@
#include "Timer.h"
#include "Can.h"
#include "DengFOC.h"
#include "Filter.h"
#include "Timer.h"
#include "adc.h"
#include "ang_sensor.h"
#include "gd32c10x.h"
#include "gd32c10x_gpio.h"
#include "gd32c10x_misc.h"
#include "gd32c10x_rcu.h"
#include "gd32c10x_timer.h"
#include "thermal.h"
#include <cstdio>
#include "initial.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
constexpr int TIMER2_PRESCALER = 119; // 120MHz / 120 = 1MHz
constexpr int TIMER2_PERIOD = 99; // 1MHz / 100 = 100us
constexpr int TIMER3_PRESCALER = 119; // 120MHz / 120 = 1MHz
@@ -29,18 +25,11 @@ constexpr int TIMER1_CH2_PULSE = 0;
static u32 total_us100_counter = 0; // 总计数器,每100微秒增加1
extern u16 adc_value[7];
extern CAN_transmiter CAN0_transmiter;
extern FOC_Controlroller FOC;
extern TaskScheduler scheduler;
// 添加系统运行时间计数器
static volatile std::u64 system_runtime_us = 0;
// 声明外部FOC控制器对象
extern FOC_Controlroller FOC;
// 声明外部采样器对象
extern sampler sampler;
extern angle_sensor KTH7823;
extern EncoderVelocityKalman Vel_kalman;
extern ThermalController thermalController; // 热量控制器初始化
/**
* @brief 设置引脚中断优先级
* @return void
@@ -167,53 +156,28 @@ void TIMER2_IRQHandler(void) {
// 清除更新中断标志
timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP);
// 增加总计数器 (使用更高效的位运算代替取模运算)
total_us100_counter++;
// system_runtime_us += 100;
// 每100us执行一次的操作
sampler.update_current(); // 更新电流采样值
KTH7823.update(); // 更新角度传感器值
FOC.rt_velocity = Vel_kalman.update(KTH7823.getVelocity());
FOC.rt_angle = KTH7823.getAngle();
switch (FOC.control_mode) {
case 0: {
break;
}
case 1: {
FOC.angle_control(FOC.target_angle); // 角度闭环控制
break;
}
case 2: {
FOC.velocity_control(FOC.target_velocity); // 速度闭环控制
break;
}
case 3: {
FOC.angle_control_NPID(FOC.target_angle); // 角度闭环控制
break;
}
case 4: {
FOC.velocity_open_loop(); // 速度闭环控制
break;
}
}
total_us100_counter++;
scheduler.taskFlags |=
(1 << TASK_CURRENT_UPDATE) | (1 << TASK_ANGLE_UPDATE) |
(1 << TASK_VELOCITY_UPDATE) | (1 << TASK_MOTOR_CONTROL);
switch (total_us100_counter) { // 每1ms执行的代码,负载均衡
case 1: {
// 设置CAN发送标志
CAN0_transmiter.can0_send_flag = SET;
mode = FOC.control_mode;
scheduler.taskFlags |= (1 << TASK_MCU_TEMP_UPDATE);
break;
}
case 2: {
sampler.update_mcu_temp();
scheduler.taskFlags |= (1 << TASK_DRV_TEMP_UPDATE);
break;
}
case 3: {
sampler.update_drv_temp();
scheduler.taskFlags |= (1 << TASK_VBUS_UPDATE);
break;
}
case 4: {
sampler.update_vbus_voltage();
scheduler.taskFlags |= (1 << TASK_CAN_TRANSMIT);
break;
}
}
@@ -224,11 +188,10 @@ void TIMER2_IRQHandler(void) {
ms10_counter++;
switch (ms10_counter) { // 每10ms执行的代码,负载均衡
case 1: {
FOC.update_power();
scheduler.taskFlags |= (1 << TASK_THERMAL_CONTROL);
break;
}
case 2: {
thermalController.update();
break;
}
}
@@ -239,6 +202,7 @@ void TIMER2_IRQHandler(void) {
ms100_counter++;
switch (ms100_counter) { // 每100ms执行的代码,负载均衡
case 1: {
break;
}
if (ms100_counter >= 10) {