SVPWM(空间矢量脉宽调制)实现
SVPWM用于三相逆变器控制,通过6个开关管合成8种基本电压矢量。在TI C2000中实现步骤如下:
1. 坐标变换
将三相电压(Ua,Ub,UcU_a, U_b, U_cUa,Ub,Uc)转换为αβ\alpha\betaαβ坐标系:
{Uα=Ua−12Ub−12UcUβ=32Ub−32Uc
\begin{cases}
U_\alpha = U_a - \frac{1}{2}U_b - \frac{1}{2}U_c \\
U_\beta = \frac{\sqrt{3}}{2}U_b - \frac{\sqrt{3}}{2}U_c
\end{cases}
{Uα=Ua−21Ub−21UcUβ=23Ub−23Uc
2. 扇区判断
根据UαU_\alphaUα和UβU_\betaUβ计算角度θ=arctan2(Uβ,Uα)\theta = \arctan2(U_\beta, U_\alpha)θ=arctan2(Uβ,Uα),确定所在扇区(1~6)。
3. 计算占空比
使用相邻两个非零矢量VxV_xVx和Vx+60°V_{x+60°}Vx+60°合成目标矢量,计算作用时间T1T_1T1和T2T_2T2:
T1=3TsUdc∣Uβcosθ−Uαsinθ∣T2=3TsUdc∣Uαsin(θ+60°)−Uβcos(θ+60°)∣
T_1 = \frac{\sqrt{3} T_s}{U_{dc}} |U_\beta \cos \theta - U_\alpha \sin \theta| \\
T_2 = \frac{\sqrt{3} T_s}{U_{dc}} |U_\alpha \sin (\theta + 60°) - U_\beta \cos (\theta + 60°)|
T1=Udc3Ts∣Uβcosθ−Uαsinθ∣T2=Udc3Ts∣Uαsin(θ+60°)−Uβcos(θ+60°)∣
其中TsT_sTs为开关周期,UdcU_{dc}Udc为直流母线电压。
C2000代码片段
// 坐标变换
U_alpha = Ua - 0.5*Ub - 0.5*Uc;
U_beta = 0.8660254*(Ub - Uc);
// 扇区判断
sector = 0;
if (U_beta > 0) sector += 1;
if (1.7320508*U_alpha - U_beta > 0) sector += 2;
if (-1.7320508*U_alpha - U_beta > 0) sector += 4;
// 计算占空比(以扇区1为例)
T1 = (sqrt3 * Ts / Udc) * (U_alpha - U_beta / sqrt3);
T2 = (sqrt3 * Ts / Udc) * (2 * U_beta / sqrt3);
T0 = Ts - T1 - T2;
// 写入EPWM寄存器
EPwm1Regs.CMPA.half.CMPA = T0/2;
EPwm1Regs.CMPB = T0/2 + T1;
PLL(锁相环)实现
PLL用于电网同步,常见于整流器或并网逆变器。
1. 基于dq变换的SRF-PLL
- 采集电网电压Ua,UbU_a, U_bUa,Ub,通过Clark变换得到Uα,UβU_\alpha, U_\betaUα,Uβ。
- Park变换到dq坐标系:
{Ud=Uαcosθ+UβsinθUq=−Uαsinθ+Uβcosθ \begin{cases} U_d = U_\alpha \cos \theta + U_\beta \sin \theta \\ U_q = -U_\alpha \sin \theta + U_\beta \cos \theta \end{cases} {Ud=Uαcosθ+UβsinθUq=−Uαsinθ+Uβcosθ - 通过PI控制器调节UqU_qUq至0,输出频率修正量Δω\Delta \omegaΔω。
2. C2000实现代码
// Clark变换
U_alpha = (2.0/3.0) * (Ua - 0.5*Ub - 0.5*Uc);
U_beta = (2.0/3.0) * (0.8660254*(Ub - Uc));
// Park变换
Ud = U_alpha * cos_theta + U_beta * sin_theta;
Uq = -U_alpha * sin_theta + U_beta * cos_theta;
// PI控制频率修正
error = 0 - Uq;
delta_omega = Kp * error + Ki * integral_error;
integral_error += error;
// 更新角度和频率
theta += (omega_nominal + delta_omega) * Ts;
if (theta > 2*PI) theta -= 2*PI;
PID控制器实现
1. 离散化公式
u(k)=Kpe(k)+Ki∑i=0ke(i)Ts+Kde(k)−e(k−1)Ts
u(k) = K_p e(k) + K_i \sum_{i=0}^{k} e(i) T_s + K_d \frac{e(k) - e(k-1)}{T_s}
u(k)=Kpe(k)+Kii=0∑ke(i)Ts+KdTse(k)−e(k−1)
其中TsT_sTs为采样时间。
2. 抗积分饱和处理
限制积分项累计范围,并加入输出限幅。
3. C2000代码
// PID计算
error = setpoint - feedback;
integral += error * Ts;
derivative = (error - prev_error) / Ts;
output = Kp * error + Ki * integral + Kd * derivative;
prev_error = error;
// 抗饱和处理
if (output > max_limit) {
output = max_limit;
integral -= error * Ts; // 反计算积分
}
else if (output < min_limit) {
output = min_limit;
integral -= error * Ts;
}
关键注意点
- 硬件配置:需初始化C2000的ADC、EPWM模块,并设置中断频率与开关周期一致。
- 浮点优化:C2000支持FPU,建议使用
float类型而非int以提高精度。 - 实时性:将SVPWM、PLL、PID代码放置在PWM中断服务例程(ISR)中执行。
以上代码需结合TI的controlSUITE库函数(如math.h中的sin/cos函数)和芯片手册配置寄存器。
SVPWM 实现原理与代码
空间矢量脉宽调制(SVPWM)是三相逆变器的核心控制技术。其实现分为以下步骤:
-
Clarke变换:将三相电压转换为静止坐标系下的α-β分量
void Clarke_Transform(float Ia, float Ib, float Ic, float *Ialpha, float *Ibeta) { *Ialpha = Ia; *Ibeta = (Ib - Ic) * ONE_BY_SQRT3; // 1/sqrt(3) } -
Park变换:转换为旋转坐标系下的d-q分量
void Park_Transform(float Ialpha, float Ibeta, float sin_theta, float cos_theta, float *Id, float *Iq) { *Id = Ialpha * cos_theta + Ibeta * sin_theta; *Iq = -Ialpha * sin_theta + Ibeta * cos_theta; } -
矢量扇区判断:
uint8_t SVM_Sector_Detection(float Ualpha, float Ubeta) { float angle = atan2f(Ubeta, Ualpha) * 180/PI; return ((uint8_t)(angle/60) % 6) + 1; } -
占空比计算:
void SVM_CalcDutyCycles(uint8_t sector, float T1, float T2, float *Ta, float *Tb, float *Tc) { switch(sector) { case 1: *Ta = T1 + T2; *Tb = T2; *Tc = 0; break; // 其他扇区计算类似... } }
PLL 锁相环实现
软件锁相环(PLL)用于电网同步,采用基于dq变换的SRF-PLL:
-
正交信号生成:
void Generate_Quadrature_Signal(float *input, float *quad, uint16_t len) { for(uint16_t i=0; i<len-1; i++) quad[i] = input[i+1] - input[i]; } -
PI控制器实现:
typedef struct { float Kp, Ki; float integral_max; float integral; } PI_Controller; float PI_Update(PI_Controller *pi, float error) { pi->integral += error * pi->Ki; if(pi->integral > pi->integral_max) pi->integral = pi->integral_max; return pi->Kp * error + pi->integral; } -
PLL主逻辑:
void SRF_PLL_Update(float grid_voltage, float *phase_angle) { static float v_q = 0; static PI_Controller pi = {0.1, 0.01, 100}; // 示例参数 v_q = -grid_voltage * sinf(*phase_angle); float freq_correction = PI_Update(&pi, v_q); *phase_angle += 2*PI * (GRID_FREQ + freq_correction) * SAMPLING_TIME; }
PID 控制器实现
增量式PID更适合嵌入式应用:
-
数据结构定义:
typedef struct { float Kp, Ki, Kd; float prev_error, prev2_error; float output_max; } PID_Controller; -
增量式PID计算:
float PID_Update(PID_Controller *pid, float error) { float delta = pid->Kp * (error - pid->prev_error) + pid->Ki * error + pid->Kd * (error - 2*pid->prev_error + pid->prev2_error); pid->prev2_error = pid->prev_error; pid->prev_error = error; return CLAMP(delta, -pid->output_max, pid->output_max); }
硬件配置要点
-
PWM定时器配置:
void TIM1_PWM_Init(void) { // 中心对齐模式配置 TIM_TimeBaseInitTypeDef TIM_BaseStruct; TIM_BaseStruct.TIM_Prescaler = 84-1; // 84MHz/84 = 1MHz TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1; TIM_BaseStruct.TIM_Period = PWM_PERIOD; TIM_TimeBaseInit(TIM1, &TIM_BaseStruct); // 互补通道配置 TIM_OCInitTypeDef TIM_OCStruct; TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCStruct.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCStruct.TIM_Pulse = 0; TIM_OC1Init(TIM1, &TIM_OCStruct); } -
ADC同步采样配置:
void ADC_Init(void) { ADC_CommonInitTypeDef ADC_CommonStruct; ADC_CommonStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonStruct.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInit(&ADC_CommonStruct); // 配置注入通道触发源为TIM1_TRGO ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO); }
关键数学公式
-
Park逆变换:
{Vα=Vdcosθ−VqsinθVβ=Vdsinθ+Vqcosθ \begin{cases} V_\alpha = V_d \cos\theta - V_q \sin\theta \\ V_\beta = V_d \sin\theta + V_q \cos\theta \end{cases} {Vα=Vdcosθ−VqsinθVβ=Vdsinθ+Vqcosθ -
SVPWM作用时间计算:
T1=3∣Vref∣TsVdcsin(60∘−θ)T2=3∣Vref∣TsVdcsin(θ) T_1 = \frac{\sqrt{3}|V_{ref}|T_s}{V_{dc}} \sin(60^\circ - \theta) \\ T_2 = \frac{\sqrt{3}|V_{ref}|T_s}{V_{dc}} \sin(\theta) T1=Vdc3∣Vref∣Tssin(60∘−θ)T2=Vdc3∣Vref∣Tssin(θ) -
PID离散化公式:
Δu(k)=Kp[e(k)−e(k−1)]+Kie(k)+Kd[e(k)−2e(k−1)+e(k−2)] \Delta u(k) = K_p[e(k)-e(k-1)] + K_i e(k) + K_d[e(k)-2e(k-1)+e(k-2)] Δu(k)=Kp[e(k)−e(k−1)]+Kie(k)+Kd[e(k)−2e(k−1)+e(k−2)]
以上代码需配合STM32标准外设库或HAL库使用,实际应用中需根据具体硬件参数调整PWM频率、ADC采样率等关键参数。建议使用STM32CubeMX生成基础配置框架,再集成上述算法模块。
3573

被折叠的 条评论
为什么被折叠?



