feat(FOC): 重构FOC控制器实现并修复SVPWM算法支持
- 修复类名拼写错误:FOC_Controlroller -> FOC_Controller - 移除不必要的角度归一化函数,直接使用fmod优化性能 - 添加完整的SVPWM算法实现,提高电机控制效率 - 重构PID参数配置,使用动态参数调整机制 - 增加电流反馈功能,实时监测电机运行状态 - 优化电压安全限制,提高系统稳定性 - 更新控制模式映射,支持更多控制策略 - 改进CAN通信协议,增加电流反馈传输
This commit is contained in:
+34
-10
@@ -1,5 +1,6 @@
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
#include "gd32c10x_eval.h"
|
||||
#include <cstdint>
|
||||
|
||||
// 如果使用CMSIS DSP库,需要定义ARM_MATH_CM4
|
||||
@@ -58,22 +59,43 @@ constexpr float HOLD_PWM_DUTY = 0.95f;
|
||||
constexpr u16 ANGLESENS_OFFSET = +0;
|
||||
constexpr float KE_FACTOR = 14.0f;
|
||||
// PID配置
|
||||
constexpr float current_loop_p = 6e-2f / 100 * 12; // 电流P
|
||||
constexpr float vel_loop_p = 0.01f / 100 * 12; // 速度P
|
||||
constexpr float angle_loop_p = 20.0f / 100 * 12; // 角度P
|
||||
constexpr float vel_angloop_p = 0.12f / 100 * 12; // 速度 速度-角度P
|
||||
constexpr float ang_angloop_p = 100.0f / 100 * 12; // 角度 速度-角度P
|
||||
constexpr float DEFAULT_current_loop_p = 6e-2f / 100 * 12; // 电流P
|
||||
|
||||
constexpr float DEFAULT_vel_loop_p = 0.018f / 100 * 12; // 速度P
|
||||
constexpr float vel_loop_Ku = 3.600000e-03 * 0.7 * 100 / 12;
|
||||
constexpr float vel_loop_Tu = 17.0f * 1e-3f;
|
||||
constexpr float vel_loop_Ki = 1.2 * vel_loop_Ku / vel_loop_Tu;
|
||||
constexpr float vel_loop_Kd = 0.075 * vel_loop_Ku * vel_loop_Tu * 2;
|
||||
|
||||
constexpr float DEFAULT_vel_angloop_p = 0.22f / 100; // 速度 速度-角度P
|
||||
constexpr float vel_angloop_Ki = 12.0f; // 角度 速度-角度I
|
||||
constexpr float vel_angloop_Kd = 6e-04f; // 角度 速度-角度D
|
||||
|
||||
constexpr float DEFAULT_ang_angloop_p = 120.0f / 100 * 12; // 角度 速度-角度P
|
||||
constexpr float ang_angloop_Ki = 0.00f; // 角度 速度-角度I
|
||||
constexpr float ang_angloop_Kd = 8e-04; // 角度 速度-角度D
|
||||
|
||||
constexpr float DEFAULT_angle_loop_p = 60.0f / 100 * 12; // 角度P
|
||||
|
||||
constexpr float DEFAULT_vel_MIT_p = 25.0f / 100 * 12; // 速度 速度-角度P
|
||||
constexpr float vel_MIT_Ku = 6.72f * 100 / 12;
|
||||
constexpr float vel_MIT_Tu = 62.0f * 1e-3f;
|
||||
constexpr float vel_MIT_Ki = 3e-2f;
|
||||
constexpr float vel_MIT_Kd = 5.355000e-05f;
|
||||
// 常量定义
|
||||
constexpr u8 SIZE_FLOAT = sizeof(float);
|
||||
constexpr u8 SIZE_U32 = sizeof(uint32_t);
|
||||
constexpr float ADC_MAX = 65536.0f;
|
||||
constexpr float PI = 3.14159265358979323846f;
|
||||
constexpr float INV_PI_3 = 3.0f / PI;
|
||||
constexpr float PI_3 = PI / 3.0f;
|
||||
constexpr float _1_SQRT3 = 0.57735026919f; // 1/sqrt(3)
|
||||
constexpr float SQRT3 = 1.7320508075688772f;
|
||||
constexpr float SQRT3DV2 = 0.8660254037844386f; // sqrt(3)/2
|
||||
constexpr float COS_PI_3 = 0.5f;
|
||||
constexpr float ANGLE_FACTOR = 25.0f / 180.0f * PI;
|
||||
constexpr float DEG2RAD = 1.0f / 180.0f * PI;
|
||||
constexpr float RAD2DEG = 180.0f / PI; // 修正RAD2DEG定义,应该是180/π
|
||||
constexpr float _1_SQRT3 = 0.57735026919f; // 1/sqrt(3)
|
||||
constexpr float sqrt3dv2 = 0.86602540378f; // sqrt(3)/2的预计算值
|
||||
constexpr float RAD2DEG = 180.0f / PI; // 修正RAD2DEG定义,应该是180/π
|
||||
constexpr u8 DEFAULT_VALUE = 0;
|
||||
constexpr u8 CONFIG_SAVED_NUM = 6;
|
||||
|
||||
@@ -122,8 +144,10 @@ constexpr float ANGLESENS_FACTOR = 1.0f / ADC_MAX * 360.0f;
|
||||
|
||||
// TIMER2-任务调度
|
||||
constexpr int TIMER2_PRESCALER = 119; // 120MHz / 120 = 1MHz
|
||||
constexpr int TIMER2_PERIOD = 49; // 1MHz / 50 = 50us
|
||||
constexpr float TIMER2_FREQUENCY = 1 / 5e-5;
|
||||
constexpr int TIMER2_PERIOD = 49; // 1 / 1MHz * 50 = 50us
|
||||
constexpr float TIME_SLICE =
|
||||
(TIMER2_PERIOD + 1) * (TIMER2_PRESCALER + 1) / 120000000.0f; // 周期
|
||||
constexpr float TIMER2_FREQUENCY = 1 / TIME_SLICE; // 频率
|
||||
|
||||
// TIMER1-PWM
|
||||
constexpr int TIMER1_PRESCALER = 0; // 不分频,计数器时钟为120MHz
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
FlashEEPROM flashEEP = FlashEEPROM();
|
||||
extern angle_sensor KTH7823;
|
||||
extern CAN_transmiter CAN0_transmiter;
|
||||
extern FOC_Controlroller FOC; // FOC控制
|
||||
extern FOC_Controller FOC; // FOC控制
|
||||
|
||||
fmc_state_enum write_ADDRESS(u32 address, u32 data) {
|
||||
fmc_unlock();
|
||||
@@ -125,7 +125,7 @@ u8 FlashEEPROM::read_saved_system_config(void) {
|
||||
|
||||
FOC.control_mode = (u8)data[0];
|
||||
FOC.limit_voltage = data[1];
|
||||
FOC.limit_velocity = data[2];
|
||||
FOC.target_current = data[2];
|
||||
KTH7823.angle_set(data[3]);
|
||||
FOC.target_angle = data[4];
|
||||
FOC.target_velocity = data[5];
|
||||
@@ -389,7 +389,7 @@ FlashEepromStatus FlashEEPROM::save_system_config(bool saved) {
|
||||
u32 CRC_NUM = 0x0000;
|
||||
float data[CONFIG_SAVED_NUM] = {
|
||||
(float)FOC.control_mode, FOC.limit_voltage,
|
||||
FOC.limit_velocity, FOC.rt_angle,
|
||||
FOC.target_current, FOC.rt_angle,
|
||||
FOC.target_angle, FOC.target_velocity};
|
||||
|
||||
// 如果系统配置标记已保存,则无需再次保存
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
extern sampler sampler;
|
||||
extern CAN_transmiter CAN0_transmiter;
|
||||
extern FOC_Controlroller FOC;
|
||||
extern FOC_Controller FOC;
|
||||
extern FlashEEPROM flashEEP;
|
||||
ThermalController thermalController; // 热量控制器初始化
|
||||
|
||||
@@ -93,7 +93,7 @@ void angsens_MG_check(void) {
|
||||
void power_manage(void) {
|
||||
float last_vbus = sampler.get_vbus_voltage();
|
||||
sampler.update_vbus_voltage();
|
||||
FOC.update_power();
|
||||
FOC.update_power(last_vbus);
|
||||
float vbus = sampler.get_vbus_voltage();
|
||||
if ((vbus < 22.0f) and (last_vbus > vbus) and vbus > 8.0f) {
|
||||
FOC.shut_down();
|
||||
|
||||
Reference in New Issue
Block a user