一、题目要求简述二、控制方法总览基础部分逆变器带阻性负载用电压有效值外环 电压瞬时值内环外环算有效值PI调节得到幅值内环用瞬时误差直接控制生成SVPWM发挥部分逆变接整流器能量回馈逆变器开环直接给固定调制比输出约32V交流整流器单电流环用PR控制器让电流与逆变器电压同相启动逻辑一键触发 → 逆变器先开 → 等2秒 → 整流器闭环自动切入二、软件整体框架HRTIM定时器中断跑所有控制算法中断里顺序做采样电压、电流判断当前工作模式基础/发挥执行对应控制策略更新PWM占空比主循环屏幕刷新、保护-普通定时器中断按键扫描、状态切换三、控制算法具体代码实现3.1 逆变器双环控制基础部分有效值外环滑动窗口计算有效值- 窗口大小配置为 5000 点对应 25kHz 采样率下约 200ms 窗口- 采用滑动平均策略避免突变保证数值稳定性// 滑动窗口RMS计算核心代码float32_tRMS_Update(rms_update_typedef*state,float32_tvalue){state-sum_sqvalue*value;// 累加平方值state-count;float32_trmsstate-sum_sq/(float32_t)state-count;// 计算平均值if(state-countstate-window_size){state-sum_sqrms*(state-window_size-1);// 滑动更新state-countstate-window_size-1;}state-rms_valuesqrtf(rms);// 开方得到RMSreturnstate-rms_value;}PI离散化与积分饱和防护防积分饱和策略 直接对PI输出进行硬限幅限制范围为 [0, 33] 单位V// PI控制器调用使用ARM CMSIS-DSP库floatv_set_oinvv.set_value*0.57735f;// 目标值转换为相电压dsp_arm_pid_function(pi_inv_a,v_set_o-invv.ao_rms_fit_value);// 积分饱和防护 - 输出限幅if(pi_inv_a.out33.0f)pi_inv_a.out33.0f;if(pi_inv_b.out33.0f)pi_inv_b.out33.0f;if(pi_inv_c.out33.0f)pi_inv_c.out33.0f;瞬时值内环给定参考ref 外环输出 * sin_table[index]// 参考值 外环输出 * sin_table[index]pr_inv_a.xipi_inv_a.out*1.4142f*arm_sin_f32(theta)-invv.ao_fit_value;pr_inv_b.xipi_inv_b.out*1.4142f*arm_sin_f32(theta-2.0944f)-invv.bo_fit_value;pr_inv_c.xipi_inv_c.out*1.4142f*arm_sin_f32(theta2.0944f)-invv.co_fit_value;pr_control(pr_inv_a);pr_control(pr_inv_b);pr_control(pr_inv_c);3.2 开环逆变 PR整流发挥部分逆变开环直接设调制波幅值无需反馈// 直接设置调制波幅值无需反馈inv_saddle_sine.amodulation_ratio_inv*arm_sin_f32(theta);inv_saddle_sine.bmodulation_ratio_inv*arm_sin_f32(theta-2.0944f);inv_saddle_sine.cmodulation_ratio_inv*arm_sin_f32(theta2.0944f);saddle_wave_modulation_function(inv_saddle_sine);整流器PR电流环PR的离散公式voidpr_control(pr_typedef*p){// 差分方程y[n] -a1*y[n-1] -a2*y[n-2] b0*x[n] b1*x[n-1] b2*x[n-2]p-yo-p-a1*p-yo_1-p-a2*p-yo_2p-b0*p-xip-b1*p-xi_1p-b2*p-xi_2;// 更新状态寄存器p-yo_2p-yo_1;p-yo_1p-yo;p-xi_2p-xi_1;p-xi_1p-xi;}voidpr_init(pr_typedef*p,floatkp,floatkr,floatfs,floatwc,floatwo){p-Ts1/fs;floattemp4/p-Ts/p-Ts4*p-wc/p-Tsp-wo*p-wo;p-b0(4*p-kp/p-Ts/p-Ts4*p-wc*(p-kpp-kr)/p-Tsp-kp*p-wo*p-wo)/temp;p-b1(-8*p-kp/p-Ts/p-Ts2*p-kp*p-wo*p-wo)/temp;p-b2(4*p-kp/p-Ts/p-Ts-4*p-wc/p-Ts*(p-kpp-kr)p-kp*p-wo*p-wo)/temp;p-a1(-8/p-Ts/p-Ts2*p-wo*p-wo)/temp;p-a2(4/p-Ts/p-Ts-4*p-wc/p-Tsp-wo*p-wo)/temp;}电流参考怎么生成floati_set_mrec.set_value*1.4142135623730950488016887242097f;pr_rec_a.xii_set_m*arm_sin_f32(theta)-rec.ao_fit_value;pr_rec_b.xii_set_m*arm_sin_f32(theta-2.094395102f)-rec.bo_fit_value;pr_rec_c.xii_set_m*arm_sin_f32(theta2.094395102f)-rec.co_fit_value;pr_control(pr_rec_a);pr_control(pr_rec_b);pr_control(pr_rec_c);rec_saddle_sine.a-pr_rec_a.yo;rec_saddle_sine.b-pr_rec_b.yo;rec_saddle_sine.c-pr_rec_c.yo;if(rec_saddle_sine.a1.15f)rec_saddle_sine.a1.15f;if(rec_saddle_sine.a-1.15f)rec_saddle_sine.a-1.15f;if(rec_saddle_sine.b1.15f)rec_saddle_sine.b1.15f;if(rec_saddle_sine.b-1.15f)rec_saddle_sine.b-1.15f;if(rec_saddle_sine.c1.15f)rec_saddle_sine.c1.15f;if(rec_saddle_sine.c-1.15f)rec_saddle_sine.c-1.15f;saddle_wave_modulation_function(rec_saddle_sine);-关键参数 -采样频率 fs25000Hz-截止频率 wc0.2*2π ≈1.256rad/s-谐振频率 wo50*2π ≈314.16rad/s 电网频率3.3 SVPWM的尝试简单提我也用了SVPWM但能量回馈时电流3次谐波没改善给新手一个结论在这个应用里SVPWM未必是灵药先跑通SPWMvoidsaddle_wave_modulation_function(adc_ab_dq_typedef*saddle_sine){// SVPWM调制计算floatmax_valMAX(saddle_sine-a,MAX(saddle_sine-b,saddle_sine-c));floatmin_valMIN(saddle_sine-a,MIN(saddle_sine-b,saddle_sine-c));floatoffset(max_valmin_val)/2.0f;// 三次谐波注入saddle_sine-a-offset;saddle_sine-b-offset;saddle_sine-c-offset;}四、给想上手的新手的几个建议先调通基础部分的双环不要一上来就SVPWM所有波形都用串口或DAC引出来看不要猜