#include "main.h" #include "Can.h" #include "DengFOC.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/initial.h" #include "systick.h" #include #include extern CAN_transmiter CAN0_transmiter; // CAN初始化 extern sampler sampler; // 采样器 extern angle_sensor KTH7823; // 角度传感器 extern EncoderVelocityKalman Vel_kalman; // 速度滤波 extern EncoderAngleKalman Angle_kalman; // 角度滤波 extern ThermalController thermalController; // 热量控制器 extern FOC_Controlroller FOC; // FOC控制 extern FlashEEPROM flashEEP; // EEPROM类 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初始化 while (init_status) { // 初始化检测 std::printf("初始化失败\r\n"); } angsens_MG_check(); // 角度传感器磁感应强度测试 while (1) { __disable_irq(); u32 currentTasks = scheduler.taskFlags; // 保存当前任务标志快照以提高效率并确保一致性 scheduler.taskFlags &= ~currentTasks; // 一次性清除所有已处理的任务标志 __enable_irq(); do_task(currentTasks); } return 0; } void do_task(u32 currentTasks) { // 按照优先级和重要性处理任务 if (currentTasks & (1 << TASK_CURRENT_UPDATE)) { // 更新电流采样值 sampler.update_current(); } if (currentTasks & (1 << TASK_ANGLE_UPDATE)) { // 更新角度传感器值 KTH7823.update(); FOC.rt_angle = Angle_kalman.update(KTH7823.getAngle()); } if (currentTasks & (1 << TASK_VELOCITY_UPDATE)) { // 更新速度传感器值 FOC.rt_velocity = Vel_kalman.update(Angle_kalman.getVelocity()); } 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, // FOC.limit_velocity); // 角度闭环控制,带速度限制 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; } } } if (currentTasks & (1 << TASK_MCU_TEMP_UPDATE)) { // 更新mcu温度传感器值 sampler.update_mcu_temp(); } if (currentTasks & (1 << TASK_DRV_TEMP_UPDATE)) { // 更新电机温度传感器值 sampler.update_drv_temp(); } if (currentTasks & (1 << TASK_THERMAL_CONTROL)) { // 热量控制 thermalController.update(); } if (currentTasks & (1 << TASK_MAGNETIC_CHECK)) { // 磁感应强度检测 angsens_MG_check(); } if (currentTasks & (1 << TASK_VBUS_UPDATE)) { // 更新vbus电压值 power_manage(); } if (currentTasks & (1 << TASK_CAN_TRANSMIT)) { // CAN通信 // CAN0_transmiter.testfloat_union.f = cnt_test; // 负载检测 cnt_test = 0; CAN0_transmiter.can0_send_flag = SET; CAN0_transmiter.communication_check(); fwdgt_counter_reload(); // 看门狗复位 } }