更新OTA功能,config独立成文件统一定义
refactor(build): 更新项目配置和链接器设置 - 修改GD32C103CB的ROM基地址和大小配置 - 更新系统时钟向量表偏移量设置 - 在cproject.yml中添加BIN输出格式支持 - 增加-O3优化级别和代码移除选项 - 更新csolution版本依赖 feat(device): 优化ADC采样和配置管理 - 将DengFOC依赖替换为FOC模块 - 从config.h引入配置常量 - 重命名FILTER_SIZE为ADC_FILTER_SIZE以提高清晰度 - 优化温度和电流采样滤波实现 refactor(algorithm): 简化FOC控制函数接口 - 为angle_control、velocity_control等函数移除不必要的参数 - 统一函数指针类型定义 - 优化电流计算函数的代码格式 - 调整PID控制器初始化参数
This commit is contained in:
+48
-50
@@ -1,16 +1,16 @@
|
||||
#include "main.h"
|
||||
#include "Can.h"
|
||||
#include "DengFOC.h"
|
||||
#include "FOC.h"
|
||||
#include "Filter.h"
|
||||
#include "Timer.h"
|
||||
#include "adc.h"
|
||||
#include "ang_sensor.h"
|
||||
#include "core_cm4.h"
|
||||
#include "core_cmFunc.h"
|
||||
#include "flash.h"
|
||||
#include "health.h"
|
||||
#include "initial.h"
|
||||
#include "motor.h"
|
||||
#include "sys/config.h"
|
||||
#include "sys/flash.h"
|
||||
#include "sys/initial.h"
|
||||
#include "systick.h"
|
||||
#include <cstdio>
|
||||
@@ -28,35 +28,14 @@ TaskScheduler scheduler = {0};
|
||||
volatile u32 system_runtime_us = 0; // 电机驱动计算轮次
|
||||
volatile u32 cnt_test = 0; // 负载检测
|
||||
int main(void) {
|
||||
systick_config(); // 系统时钟初始化
|
||||
SystemCoreClockUpdate(); // 更新系统时钟变量
|
||||
watchdog_init(50); // 看门狗初始化
|
||||
unused_pin_init(); // 未使用引脚初始化
|
||||
USART0_init(); // 调试串口初始化
|
||||
motor_init(); // 电机驱动初始化
|
||||
if (get_reset_cause() ==
|
||||
RCU_FLAG_FWDGTRST) { // 如果是看门狗复位,本次看门狗时间延长并休眠
|
||||
printf("continue sleep\r\n");
|
||||
watchdog_init(5000); // 看门狗初始化
|
||||
delay_1ms(1);
|
||||
prepare_deep_sleep(false);
|
||||
}
|
||||
User_timer_init(); // 任务Timer初始化
|
||||
u8 init_status = 0;
|
||||
init_status += KTH7823.init(); // 角度传感器初始化
|
||||
init_status += sampler.init(); // 采样器初始化
|
||||
init_status +=
|
||||
flashEEP.init(); // EEPROM初始化,必须放在角度卡尔曼之前,角度传感器之后
|
||||
|
||||
init_status += Angle_kalman.init(KTH7823.getAngle()); // 角度滤波初始化
|
||||
init_status += Vel_kalman.init(0.0f); // 速度滤波初始化
|
||||
init_status += CAN0_transmiter.init(); // CAN初始化
|
||||
u8 init_status = hardware_init();
|
||||
|
||||
while (init_status) { // 初始化检测
|
||||
std::printf("初始化失败\r\n");
|
||||
}
|
||||
|
||||
OTA_initial(); // OTA初始化,A/B分区处理
|
||||
angsens_MG_check(); // 角度传感器磁感应强度测试
|
||||
|
||||
while (1) {
|
||||
__disable_irq();
|
||||
u32 currentTasks =
|
||||
@@ -69,6 +48,32 @@ int main(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 hardware_init(void) {
|
||||
__enable_irq();
|
||||
systick_config(); // 系统时钟初始化
|
||||
watchdog_init(50); // 看门狗初始化
|
||||
unused_pin_init(); // 未使用引脚初始化
|
||||
USART0_init(); // 调试串口初始化
|
||||
motor_init(); // 电机驱动初始化
|
||||
if (get_reset_cause() ==
|
||||
RCU_FLAG_FWDGTRST) { // 如果是看门狗复位,本次看门狗时间延长并休眠
|
||||
printf("continue sleep\r\n");
|
||||
watchdog_init(5000); // 看门狗初始化
|
||||
delay_1ms(3000);
|
||||
prepare_deep_sleep(false);
|
||||
}
|
||||
User_timer_init(); // 任务Timer初始化
|
||||
u8 init_status = 0;
|
||||
init_status += KTH7823.init(); // 角度传感器初始化
|
||||
init_status += sampler.init(); // 采样器初始化
|
||||
flashEEP.init(); // EEPROM初始化,必须放在角度卡尔曼之前,角度传感器之后
|
||||
|
||||
init_status += Angle_kalman.init(KTH7823.getAngle()); // 角度滤波初始化
|
||||
init_status += Vel_kalman.init(0.0f); // 速度滤波初始化
|
||||
init_status += CAN0_transmiter.init(); // CAN初始化
|
||||
return init_status;
|
||||
}
|
||||
|
||||
void do_task(u32 currentTasks) {
|
||||
// 按照优先级和重要性处理任务
|
||||
if (currentTasks & (1 << TASK_CURRENT_UPDATE)) { // 更新电流采样值
|
||||
@@ -83,29 +88,22 @@ void do_task(u32 currentTasks) {
|
||||
}
|
||||
if (currentTasks & (1 << TASK_MOTOR_CONTROL)) { // 电机控制任务(最高优先级)
|
||||
system_runtime_us++;
|
||||
switch (FOC.control_mode) {
|
||||
case 0: {
|
||||
FOC.drv_hold(0.95); // 占空比置0
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
// FOC.angle_control(FOC.target_angle); // 角度闭环控制
|
||||
FOC.angle_control_with_velocity_limit(FOC.target_angle); // 角度闭环控制,带速度限制
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
FOC.velocity_control(FOC.target_velocity); // 速度闭环控制
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
// FOC.angle_control_NPID(FOC.target_angle); // 角度闭环控制
|
||||
FOC.current_control(FOC.limit_velocity); // 电流闭环控制
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
FOC.velocity_open_loop(); // 速度开环控制
|
||||
break;
|
||||
}
|
||||
|
||||
// 函数指针数组,包含各种控制模式对应的函数
|
||||
static FOCFunctionPtr control_functions[] = {
|
||||
&FOC_Controlroller::drv_hold, // 0: 占空比置
|
||||
&FOC_Controlroller::
|
||||
angle_control_with_velocity_limit, // 1:
|
||||
// 角度闭环控制,带速度限制
|
||||
&FOC_Controlroller::velocity_control, // 2: 速度闭环控制
|
||||
&FOC_Controlroller::current_control, // 3: 电流闭环控制
|
||||
&FOC_Controlroller::velocity_open_loop // 4: 速度开环控制
|
||||
};
|
||||
|
||||
// 边界检查,防止数组越界
|
||||
if (FOC.control_mode >= 0 && FOC.control_mode < 5) {
|
||||
// 调用对应的控制函数
|
||||
(FOC.*control_functions[FOC.control_mode])();
|
||||
}
|
||||
}
|
||||
if (currentTasks & (1 << TASK_MCU_TEMP_UPDATE)) { // 更新mcu温度传感器值
|
||||
|
||||
Reference in New Issue
Block a user