前言:单相PWM整流器应用需要采集电网电压的波形来做电流内环的参考,在传统PFC控制中是利用乘法器将电压环输出和输入电网电压瞬时值合并得到电流内环的给定。如果电网波形是非常完美的正弦波,那么电流环的给定也是非常完美的正弦波给定,系统能得到较好的控制效果。但是现实中电网波形一般都存在各种高次谐波叠加,很难有理想的正弦波。所以在电网电压THD较差的情况下,如果也想控制到较好的电流THD值,就需要另想办法不能仅靠电网瞬时值来做参考。
如果不参考电网瞬时值那就需要另外的电网电压波形表征量,通常是用锁相环跟踪电网电角度,当完全锁相后就能得到电网的波形和频率等信息。但是不同于三相电网的情况,三相电网通过坐标系变换就能得到输入电压的dq值,然后用PI去控制q值为0就能实现锁相,可见下图所示。这里单相输入仅有一个正弦波,如果要用控制q为0的方法来锁相,就还需要与输入正交的另一个正弦波。
这里大神们通过使用广义二阶积分器来得到两个正弦波,一个正弦波完全等同于电网输入电压波形,可以当成是三相中的alpha轴,另一个与其正交的正弦波即为beta轴。有了相互正交的两个正弦波后,可以进行静止坐标系到旋转坐标系变换就能得到dq信息,根据三相的锁相环控制方法来实现对单相电网的锁相。
下面是二阶积分器的实现:
其传递函数为:
上式中wn是电网频率,k是决定传递函数的带通频率范围,当K越大传递函数对高频抑制越弱,并不适合用在输入电压滤波上。
这里按经验值选择1.414,得到传递函数的bode可见下图,传递函数的通带频率仅在50Hz左右一定范围内,大于或小于50Hz都能被有效的抑制。
matlab代码
////////////////////////////////////////////////////////////////////////////
% SOGI spll% Date:2019/07/03% By:yangshuaiclc;clear all;% SOGI coefficientfline = 50;wsogi = 2 * pi * fline;wline = 2 * pi * fline;fsw = 50e3;Ts = 1/fsw;k = 1.414;% SOGI TFtf_in = tf([0 k*wsogi 0], [1 k*wsogi wsogi^2]);tf_out_dly90deg = tf([0 0 k*wsogi^2], [1 k*wsogi wsogi^2]);% C 2 Dtf_in_d = c2d(tf_in, Ts, 'tustin')tf_out_d = c2d(tf_out_dly90deg, Ts, 'tustin')[num_vd, den_vd] = tfdata(tf_in_d,'v')[num_id, den_id] = tfdata(tf_out_d,'v')% Show TF bodefigure(1)z = bodeplot(tf_in_d, tf_out_d);setoptions(z,'FreqUnits','Hz','PhaseVisible','on')grid on;
//////////////////////////////////////////////////////////////////////////////
运行后输出结果为:
tf_in_d = 0.004423 z^2 - 0.004423 ----------------------- z^2 - 1.991 z + 0.9912 Sample time: 2e-05 secondsDiscrete-time transfer function.tf_out_d = 1.389e-05 z^2 + 2.779e-05 z + 1.389e-05 --------------------------------------- z^2 - 1.991 z + 0.9912 Sample time: 2e-05 secondsDiscrete-time transfer function.
/////////////////////////////////////////////////////////////////////////
有了差分方程就能转为C代码,下面是2阶滤波器的C代码实现:
float discrete_2order_tf(const float input,
DIS_2ORDER_TF_COEF_DEF *coeff,
DIS_2ORDER_TF_DATA_DEF *data)
{
// w0 = x(0) - A1 * W1 - A2 * W2
data->w0 = input - coeff->A1 * data->w1 - coeff->A2 * data->w2;
// Y(0) = Gain * (B0 * W0 + B1 * W1 + B2 * W2)
data->output = coeff->gain * (coeff->B0 * data->w0 + coeff->B1 * data->w1 + coeff->B2 * data->w2);
data->w2 = data->w1;
data->w1 = data->w0;
return(data->output);
}
锁相环的逻辑框图实现:
当验证模型能正常运行后,根据框图编写C代码,函数包含两个2阶滤波器,坐标系变换和简易的pi控制器,详情可见:
//
// sogo spll func
//
void spll_sogi_func(SOGI_PLL_DATA_DEF *spll_obj, float grid_volt_sen)
{
// signal genertor
spll_obj->ac_u = discrete_2order_tf(grid_volt_sen, &(spll_obj->sogi_u_coeff), &(spll_obj->sogi_u_data));
spll_obj->ac_qu = discrete_2order_tf(grid_volt_sen, &(spll_obj->sogi_qu_coeff), &(spll_obj->sogi_qu_data));
// Park transfrom from alpha beta to d-q axis
spll_obj->u_d = spll_obj->ac_u * spll_obj->cos_theta + spll_obj->ac_qu * spll_obj->sin_theta;
spll_obj->u_q = -spll_obj->ac_u * spll_obj->sin_theta + spll_obj->ac_qu * spll_obj->cos_theta;
// pi ctrol q to 0
float spll_diff = 0 - spll_obj->u_q;
spll_obj->spll_integrator += spll_diff * spll_obj->spll_ki;
spll_obj->pll_freq_out = spll_diff * spll_obj->spll_kp + spll_obj->spll_integrator;
spll_obj->theta -= spll_obj->pll_freq_out * value_2pi * spll_obj->delta_t;
if(spll_obj->theta > value_2pi)
{
spll_obj->theta -= value_2pi;
}
else if (spll_obj->theta < 0)
{
spll_obj->theta += value_2pi;
}
spll_obj->cos_theta = cos(spll_obj->theta);
spll_obj->sin_theta = sin(spll_obj->theta);
}
/////////////////////////////////////////////////////////////////////////////
代码测试:
1,正常电网电压输入,可见函数工作正常,能很快实现锁相。
2,叠加3次和2次输入,可见函数工作正常,也能准确锁相。
3,叠加3次和5次输入,可见函数工作正常,也能准确锁相。
小结:可见基于广义二阶积分器的锁相确实能又快又稳的实现对单相电网的锁相,这对高功率因素整流器和并网逆变器的设计尤其有意义。感谢~