核心内容摘要
基于MATLAB的同步发电机突然三相短路系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
可用于实际量产项目的永磁同步电机滑模观测器的C语言实现。
代码包含了完整的工程化考虑如抗饱和、抗积分饱和、参数可配置性等。
/** * file smo_estimator.c * brief PMSM滑模观测器无传感器位置估计 - 量产级实现 * version
0 * date 2024 * * 特点 * - 抗饱和处理 * - 抗积分饱和 * - 参数可配置 * - 运行时参数校验 * - 状态机管理 */ #include smo_estimator.h #include math.h #include stdbool.h /* 数学常量定义 */ #ifndef M_PI #define M_PI
14159265358979323846f #endif #define MATH_PI_OVER_3 (
0471975511965976f) /* π/3 */ #define MATH_2PI (
283185307179586f) /* 2π */ #define MATH_PI_OVER_2 (
5707963267948966f) /* π/2 */ /* 静态函数声明 */ static float sign_function(float x); static float sat_function(float x, float boundary); static void lpf_update(LowPassFilter* lpf, float input); static void pll_update(PLL_TypeDef* pll, float error, float dt); static inline void angle_normalize(float* angle); /** * brief 滑模观测器初始化 * param estimator: 观测器实例指针 * param params: 初始化参数 * return SMO_Status: 初始化状态 */ SMO_Status SMO_Estimator_Init(SMO_Estimator* estimator, const SMO_Params* params) { /* 参数校验 */ if (estimator NULL || params NULL) { return SMO_ERROR_NULL_PTR; } if (params-rs
0f || params-ls
0f || params-psi_f
0f || params-sampling_time
0f) { return SMO_ERROR_INVALID_PARAM; } if (params-h_gain
0f || params-pll_kp
0f || params-pll_ki
0f) { return SMO_ERROR_INVALID_PARAM; } /* 初始化参数 */ estimator-params.rs params-rs; estimator-params.ls params-ls; estimator-params.psi_f params-psi_f; estimator-params.sampling_time params-sampling_time; estimator-params.h_gain params-h_gain; estimator-params.lpf_cutoff_freq params-lpf_cutoff_freq; estimator-params.pll_kp params-pll_kp; estimator-params.pll_ki params-pll_ki; estimator-params.max_estimated_speed params-max_estimated_speed; estimator-params.anti_windup_limit params-anti_windup_limit; estimator-params.saturation_boundary params-saturation_boundary; /* 初始化状态变量 */ estimator-state.i_alpha_est
0f; estimator-state.i_beta_est
0f; estimator-state.theta_est
0f; estimator-state.speed_est
0f; estimator-state.back_emf_alpha
0f; estimator-state.back_emf_beta
0f; estimator-state.pll_integral
0f; /* 初始化低通滤波器系数 */ float rc
0f / (
0f * M_PI * params-lpf_cutoff_freq); estimator-state.lpf_alpha params-sampling_time / (params-sampling_time rc); /* 初始化观测器状态 */ estimator-state.estimator_status SMO_STATUS_INITIALIZED; estimator-state.convergence_counter 0; estimator-state.fault_flags 0; /* 重置收敛标志 */ estimator-state.is_converged false; return SMO_OK; } /** * brief 滑模观测器一步更新 * param estimator: 观测器实例指针 * param inputs: 输入数据电流、电压 * return SMO_Status: 执行状态 */ SMO_Status SMO_Estimator_Update(SMO_Estimator* estimator, const SMO_Inputs* inputs) { /* 参数校验 */ if (estimator NULL || inputs NULL) { return SMO_ERROR_NULL_PTR; } if (estimator-state.estimator_status ! SMO_STATUS_INITIALIZED estimator-state.estimator_status ! SMO_STATUS_RUNNING) { return SMO_ERROR_NOT_READY; } float dt estimator-params.sampling_time; float rs estimator-params.rs; float ls estimator-params.ls; float h estimator-params.h_gain; /*
计算电流误差 */ float i_alpha_err estimator-state.i_alpha_est - inputs-i_alpha; float i_beta_err estimator-state.i_beta_est - inputs-i_beta; /*
滑模控制项计算带抗饱和 */ float v_alpha -h * sat_function(i_alpha_err, estimator-params.saturation_boundary); float v_beta -h * sat_function(i_beta_err, estimator-params.saturation_boundary); /*
电流观测器更新前向欧拉离散化 */ float di_alpha_dt (inputs-u_alpha - rs * estimator-state.i_alpha_est - v_alpha) / ls; float di_beta_dt (inputs-u_beta - rs * estimator-state.i_beta_est - v_beta) / ls; estimator-state.i_alpha_est di_alpha_dt * dt; estimator-state.i_beta_est di_beta_dt * dt; /*
低通滤波提取反电动势 */ lpf_update((estimator-state.back_emf_alpha), v_alpha); lpf_update((estimator-state.back_emf_beta), v_beta); /*
锁相环更新 - 提取角度和速度 */ float cos_theta cosf(estimator-state.theta_est); float sin_theta sinf(estimator-state.theta_est); /* PLL输入误差计算 */ float pll_error -estimator-state.back_emf_alpha * cos_theta estimator-state.back_emf_beta * sin_theta; /* 锁相环更新 */ pll_update((estimator-state), pll_error, dt); /*
角度归一化到 [0, 2π) */ angle_normalize((estimator-state.theta_est)); /*
速度限制 */ if (fabsf(estimator-state.speed_est) estimator-params.max_estimated_speed) { estimator-state.speed_est (estimator-state.speed_est
? estimator-params.max_estimated_speed : -estimator-params.max_estimated_speed; } /*
收敛性检测 */ estimator-state.convergence_counter; if (estimator-state.convergence_counter CONVERGENCE_CHECK_INTERVAL) { estimator-state.convergence_counter 0; /* 简单的收敛检测电流误差小于阈值且速度稳定 */ float current_error_magnitude sqrtf(i_alpha_err*i_alpha_err i_beta_err*i_beta_err); if (current_error_magnitude CONVERGENCE_CURRENT_THRESHOLD fabsf(estimator-state.speed_est) MIN_OPERATIONAL_SPEED) { estimator-state.is_converged true; } } estimator-state.estimator_status SMO_STATUS_RUNNING; return SMO_OK; } /** * brief 获取观测器状态 * param estimator: 观测器实例指针 * param outputs: 输出数据指针 * return SMO_Status: 执行状态 */ SMO_Status SMO_Estimator_GetOutputs(const SMO_Estimator* estimator, SMO_Outputs* outputs) { if (estimator NULL || outputs NULL) { return SMO_ERROR_NULL_PTR; } outputs-theta_est estimator-state.theta_est; outputs-speed_est estimator-state.speed_est; outputs-back_emf_alpha estimator-state.back_emf_alpha; outputs-back_emf_beta estimator-state.back_emf_beta; outputs-is_converged estimator-state.is_converged; outputs-estimator_status estimator-state.estimator_status; return SMO_OK; } /** * brief 重置观测器状态 * param estimator: 观测器实例指针 * param initial_angle: 初始角度估计弧度 * return SMO_Status: 执行状态 */ SMO_Status SMO_Estimator_Reset(SMO_Estimator* estimator, float initial_angle) { if (estimator NULL) { return SMO_ERROR_NULL_PTR; } estimator-state.i_alpha_est
0f; estimator-state.i_beta_est
0f; estimator-state.theta_est initial_angle; estimator-state.speed_est
0f; estimator-state.back_emf_alpha
0f; estimator-state.back_emf_beta
0f; estimator-state.pll_integral
0f; estimator-state.convergence_counter 0; estimator-state.is_converged false; estimator-state.fault_flags 0; angle_normalize((estimator-state.theta_est)); return SMO_OK; } /** * brief 符号函数带死区以避免高频抖动 * param x: 输入值 * return float: 符号函数输出 */ static float sign_function(float x) { const float dead_zone 1e-5f; /* 小死区避免高频切换 */ if (x dead_zone) { return
0f; } else if (x -dead_zone) { return -
0f; } else { return
0f; } } /** * brief 饱和函数用于替代符号函数减少抖振 * param x: 输入值 * param boundary: 边界值 * return float: 饱和函数输出 */ static float sat_function(float x, float boundary) { if (boundary
0f) { return sign_function(x); /* 边界无效时退回符号函数 */ } if (x boundary) { return
0f; } else if (x -boundary) { return -
0f; } else { return x / boundary; /* 线性区域 */ } } /** * brief 一阶低通滤波器更新 * param lpf: 滤波器状态指针 * param input: 输入信号 */ static void lpf_update(LowPassFilter* lpf, float input) { *lpf *lpf lpf-alpha * (input - *lpf); } /** * brief 锁相环更新 * param pll: 锁相环状态 * param error: 输入误差 * param dt: 采样时间 */ static void pll_update(PLL_TypeDef* pll, float error, float dt) { /* PI控制器 */ float proportional pll-pll_kp * error; float integral_input pll-pll_ki * error; /* 抗积分饱和 */ if (fabsf(pll-pll_integral integral_input * dt) pll-anti_windup_limit) { pll-pll_integral integral_input * dt; } float pll_output proportional pll-pll_integral; /* 更新速度和角度 */ pll-speed_est pll_output; pll-theta_est pll-speed_est * dt; } /** * brief 角度归一化到 [0, 2π) * param angle: 角度指针 */ static inline void angle_normalize(float* angle) { while (*angle MATH_2PI) { *angle - MATH_2PI; } while (*angle
0f) { *angle MATH_2PI; } } /** * brief 运行时参数校验 * param estimator: 观测器实例指针 * return SMO_Status: 校验结果 */ SMO_Status SMO_Estimator_ValidateParams(const SMO_Estimator* estimator) { if (estimator NULL) { return SMO_ERROR_NULL_PTR; } /* 检查参数合理性 */ if (estimator-params.rs
0f || estimator-params.ls
0f || estimator-params.psi_f
0f || estimator-params.sampling_time
0f) { return SMO_ERROR_INVALID_PARAM; } if (estimator-params.h_gain
0f || estimator-params.lpf_cutoff_freq
0f || estimator-params.pll_kp
0f || estimator-params.pll_ki
0f) { return SMO_ERROR_INVALID_PARAM; } /* 检查数值稳定性 */ if (estimator-params.sampling_time
001f) { /* 采样时间不能太大 */ return SMO_WARNING_LARGE_SAMPLING_TIME; } return SMO_OK; }对应的头文件smo_estimator.h/** * file smo_estimator.h * brief PMSM滑模观测器头文件 */ #ifndef SMO_ESTIMATOR_H #define SMO_ESTIMATOR_H #include stdint.h /* 常量定义 */ #define CONVERGENCE_CHECK_INTERVAL 1000 /* 收敛检测间隔 */ #define CONVERGENCE_CURRENT_THRESHOLD
01f /* 收敛电流误差阈值(A) */ #define MIN_OPERATIONAL_SPEED
0f /* 最小可运行速度(rad/s) */ /* 状态枚举 */ typedef enum { SMO_STATUS_UNINITIALIZED 0, SMO_STATUS_INITIALIZED, SMO_STATUS_RUNNING, SMO_STATUS_FAULT } SMO_StatusEnum; /* 错误码枚举 */ typedef enum { SMO_OK 0, SMO_ERROR_NULL_PTR, SMO_ERROR_INVALID_PARAM, SMO_ERROR_NOT_READY, SMO_WARNING_LARGE_SAMPLING_TIME } SMO_Status; /* 观测器参数结构体 */ typedef struct { float rs; /* 定子电阻 (Ω) */ float ls; /* 定子电感 (H) */ float psi_f; /* 永磁体磁链 (Wb) */ float sampling_time; /* 采样时间 (s) */ float h_gain; /* 滑模增益 */ float lpf_cutoff_freq; /* 低通滤波器截止频率 (Hz) */ float pll_kp; /* 锁相环比例增益 */ float pll_ki; /* 锁相环积分增益 */ float max_estimated_speed; /* 最大估计速度 (rad/s) */ float anti_windup_limit; /* 抗饱和限制 */ float saturation_boundary; /* 饱和函数边界 */ } SMO_Params; /* 观测器输入结构体 */ typedef struct { float i_alpha; /* α轴电流 (A) */ float i_beta; /* β轴电流 (A) */ float u_alpha; /* α轴电压 (V) */ float u_beta; /* β轴电压 (V) */ } SMO_Inputs; /* 观测器输出结构体 */ typedef struct { float theta_est; /* 估计角度 (rad) */ float speed_est; /* 估计速度 (rad/s) */ float back_emf_alpha; /* α轴反电动势 (V) */ float back_emf_beta; /* β轴反电动势 (V) */ bool is_converged; /* 收敛标志 */ SMO_StatusEnum estimator_status; /* 观测器状态 */ } SMO_Outputs; /* 低通滤波器类型定义 */ typedef float LowPassFilter; /* 锁相环状态结构体 */ typedef struct { float theta_est; float speed_est; float pll_integral; float pll_kp; float pll_ki; float anti_windup_limit; } PLL_TypeDef; /* 观测器状态结构体 */ typedef struct { float i_alpha_est; /* 估计的α轴电流 */ float i_beta_est; /* 估计的β轴电流 */ float theta_est; /* 估计的电角度 */ float speed_est; /* 估计的电角速度 */ float back_emf_alpha; /* 反电动势α分量 */ float back_emf_beta; /* 反电动势β分量 */ float pll_integral; /* PLL积分项 */ float lpf_alpha; /* 低通滤波器系数 */ SMO_StatusEnum estimator_status; uint32_t convergence_counter; uint16_t fault_flags; bool is_converged; } SMO_State; /* 主观测器结构体 */ typedef struct { SMO_Params params; /* 参数 */ SMO_State state; /* 状态 */ } SMO_Estimator; /* 公共API函数 */ SMO_Status SMO_Estimator_Init(SMO_Estimator* estimator, const SMO_Params* params); SMO_Status SMO_Estimator_Update(SMO_Estimator* estimator, const SMO_Inputs* inputs); SMO_Status SMO_Estimator_GetOutputs(const SMO_Estimator* estimator, SMO_Outputs* outputs); SMO_Status SMO_Estimator_Reset(SMO_Estimator* estimator, float initial_angle); SMO_Status SMO_Estimator_ValidateParams(const SMO_Estimator* estimator); #endif /* SMO_ESTIMATOR_H */使用示例/* 使用示例 */ #include smo_estimator.h int main(void) { SMO_Estimator estimator; SMO_Params params { .rs
5f, .ls
001f, .psi_f
1f, .sampling_time
0001f, /* 100us */ .h_gain
5
0f, .lpf_cutoff_freq
1
0f, .pll_kp
1
0f, .pll_ki
5
0f, .max_estimated_speed
2
0f, .anti_windup_limit
1