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:
+15
-51
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user