1. 电赛题目
2. 题目需求分析
在题目中需要注意以下几个关键点:
1. 要求电路的拓扑结构为AC-AC直接变换电路,不得使用AC-DC-AC, -------- 应该是主要针对的背靠背电路。 AC-AC电路拓扑较少见,详细可以参照《AC-AC变换技术》-----陈道练。
2. 系统的供电也从 AC 36V 输入获取,需要使用整流+滤波电路+降压电路,将交流电转化为直流,在经过降压后为系统供电。
3. 与2023年电赛A题相同的是,需要使用两个控制器,而且两个控制之间不得有连线(可以尝试用无线通信)。
3. 方案对比和论证
在方案论证中,因为我们团队选用的主要开关器件是MOSFET,所以正在讨论方案时,不对晶闸管进行分析。
3.1 方案对比
3.1.1 斩控式 AC-AC 斩波电路
从电路的拓扑中可以看到,其中两个开关管进行反串联,最合成一个开关管,可以 实现对交流正负半周的控制。
可以简单地理解为,这是一个对于AC电路的半桥BUCK电路。在交流电的正负半周 电流走不同的开关管进行降压。
在控制时,可以直接使用半桥BUCK的控制方式,注意死区的大小即可。
3.1.2 脉宽调制 AC-AC 斩波电路
单相直接PWM控制型型AC-AC变换电路拓扑
原理如下:
直接PWM控制型AC-AC变换器有两种控制方式:
(1)功率开关Q1和Q2、Q3和Q4有相 同的高频PWM控制信号,即同时导通或者截止, 由于在死区期间所有功率开关均截止,因此必 须增加一个RC缓冲电路来限制电流和电压峰值;
(2)功率开关Q1和Q2、Q3和Q4的通断时刻 由输入电源电压ui或者输出电压uo的极性确 定,输入电源电压极性为正时Q2和Q4一直导通、 Q1和Q3高频PWM调制,输入电源电压极性为负时Q1和Q3一直导通、Q2和Q4高频PWM调制 。
与控制方式(1)相比,控制方式(2)由于每个功率开关在一个输入电源电压周期内完全导 通半个周期,故此开关损耗显著减少。
直接PWM控制型AC-AC变换器控制原理:电路输出电压u0经过采样电路后与电网电压同步 的基准正弦波电压ur相比较,经过PI调节器后得到误差放大器信号ue,在与三角波uc进行比较, 得到一系列高频PWM信号,在经过输入电压极性信号选通后,最后得到功率 开关Q1、Q2、Q3、Q4的驱动信号。
脉宽调制 AC-AC 斩波器具有电路拓扑简单,网侧功率因数高,网测电流谐波含量小,变换效率高,滤波器体积和重量小,动态性能好。可靠性高等优点,可以克服晶闸管相控型 AC-AC 调压器的固有缺点。
至于其他类型的AC-AC拓扑结构,暂不予讨论,以上两种拓扑结构较为简单易行,可以在短时间内利用常用模块搭建出。
综上所述,我们团队选用脉宽调制式 AC-AC 拓扑结构。
3.2 仿真验证
根据实验原理搭建仿真如下:
实验电压单闭环,稳定输出电压有效值为30V.
输出电压电流波形
4. 硬件电路设计
4.1 主电路设计
由前文所述,主电路如下:
4.2 滤波器设计
在基本电路设计中,同样需要注意LC滤波器的参数设计。
在未加入LC滤波时,输出电压电流波形如下:
下面不作推导(公式打的太麻烦了),直接给出电压与电流的THD计算公式:
电压THD计算公式:
D:占空比 L:电感 :电容
:开关角频率
由公式可以看到,是 D , L , C 的函数,与负载电阻R无关。
电感和电容对影响很大,但负载电阻影响很小。
电流THD计算公式:
综上所述,可以得到LC滤波器参数设计公式:
至此,主电路设计完成。
详细内容可参照:《AC-AC变换技术》陈道炼
4.3 采样设计
本例中只用到电压采样,所以只需要保证采样精度和模数地隔离即可,本团队已设计完 善的电压采样,电流采样,辅助电压板。有需要可以直接买成品,链接如下:
4.4 辅助电源设计
选用TI降压芯片TPS5430和隔离电源模块 BS-1WR3 , 原理图如下:
隔离电源模块:
TPS5430降压模块:
芯片基础特性描述
应用电路:
4.5 功率板设计
功率板设计的关键是MOSFET的驱动电路设计,如果驱动电路设计不合理,开通和关断 都会受到影响,本团队基于TI的隔离半桥驱动芯片UCC21520设计驱动电路。
UCC21520芯片描述:
实际应用电路:
需要注意,本例使用的是半桥驱动,在驱动高侧管时使用了自举电容, 所以需要关注:
上管使用自举电容是否能顺利开关,即在开通和关断过程中是否能提供电流通路,以保 证电容的充放电。
当使用脉宽调制 AC-AC 斩波电路时,可以直接使用,不用考虑自举电容是否能开通和 关断的问题。而使用 斩控式 AC-AC 斩波电路时,由于没有提供合适的续流回路,所以上管开通需要特殊处理。
这也是我选择脉宽调制 AC-AC 斩波电路的原因之一。
有自举电容的相关知识可以参照:针对半桥配置的自举电路选择(UCC27710为例)
5. 程序设计
5.1 锁相环设计
锁相环的目的是获取输入电压的相位信息,在本例中,仅仅只需要获得输入电压的过零 点信息,因此锁相环可以使用以下两种方案:
5.1.1 过零比较器
纯硬件电路,不多废话,直接上原理图:
5.1.2 软件锁相 SOGI_PLL锁相环
使用TI算法库,可以参照TI官网文章:《C28x Solar Library》 现给出部分代码,感兴趣可以自行查找
//*********** Function Definition ********//
void SPLL_1ph_SOGI_F_FUNC(SPLL_1ph_SOGI_F *spll_obj)
{
// Update the spll_obj->u[0] with the grid value before calling this routine
//-------------------------------//
// Orthogonal Signal Generator //
//-------------------------------//
spll_obj->osg_u[0]=(spll_obj->osg_coeff.osg_b0*(spll_obj->u[0]-spll_obj->u[2]))
+ (spll_obj->osg_coeff.osg_a1*spll_obj->osg_u[1])
+ (spll_obj->osg_coeff.osg_a2*spll_obj->osg_u[2]);
spll_obj->osg_u[2]=spll_obj->osg_u[1];
spll_obj->osg_u[1]=spll_obj->osg_u[0];
spll_obj->osg_qu[0]=(spll_obj->osg_coeff.osg_qb0*spll_obj->u[0])
+ (spll_obj->osg_coeff.osg_qb1*spll_obj->u[1])
+ (spll_obj->osg_coeff.osg_qb2*spll_obj->u[2])
+ (spll_obj->osg_coeff.osg_a1*spll_obj->osg_qu[1])
+ (spll_obj->osg_coeff.osg_a2*spll_obj->osg_qu[2]);
spll_obj->osg_qu[2]=spll_obj->osg_qu[1];
spll_obj->osg_qu[1]=spll_obj->osg_qu[0];
spll_obj->u[2]=spll_obj->u[1];
spll_obj->u[1]=spll_obj->u[0];
//-------------------------------------------------------//
// Park Transform from alpha beta to d-q axis //
//-------------------------------------------------------//
spll_obj->u_Q[0]=(spll_obj->cos*spll_obj->osg_u[0]) + (spll_obj->sin*spll_obj->osg_qu[0]);
spll_obj->u_D[0]=(spll_obj->cos*spll_obj->osg_qu[0]) - (spll_obj->sin*spll_obj->osg_u[0]);
//---------------------------------//
// Loop Filter //
//---------------------------------//
spll_obj->ylf[0]=spll_obj->ylf[1]
+ (spll_obj->lpf_coeff.B0_lf*spll_obj->u_Q[0])
+ (spll_obj->lpf_coeff.B1_lf*spll_obj->u_Q[1]);
spll_obj->ylf[1]=spll_obj->ylf[0];
spll_obj->u_Q[1]=spll_obj->u_Q[0];
//---------------------------------//
// VCO //
//---------------------------------//
spll_obj->fo=spll_obj->fn+spll_obj->ylf[0];
spll_obj->theta[0]=spll_obj->theta[1]
+ (spll_obj->fo*spll_obj->delta_T)*(float32)(2.0*3.1415926);
if(spll_obj->theta[0]>(float32)(2.0*2.98451297))
spll_obj->theta[0]=(float32)(-0.314);
spll_obj->theta[1]=spll_obj->theta[0];
spll_obj->sin=(float32)sin(spll_obj->theta[0]);
spll_obj->cos=(float32)cos(spll_obj->theta[0]);
}
5.2 正负半周切换逻辑
本次比赛,本团队使用TMS320F28335实现。
经过锁相后,获取输入电压相位信息,可以按照前文叙述的正负半周分别进行BUCK控制的方式。在正半周,先取消PWM1A 与 PWM1B 的互补配置,将其占空比拉满。同时,开启PWM2A 和 PWM2B的互补配置。
代码中,使用示波器查看实际相位与锁相相位误差,做简单的相位补偿,确保获取的相位信息与实际不会相差太大。
这一步需要用DAC模块将锁相波形打印出来,DAC模块的相关资料可以参考我的另 一篇博客:
//判断正负半周
if((2.98 <= Phase_compensation_old) && (Phase_compensation_old <= 5.969)) //负半周,取消PWM1互补波形,开启PWM2互补波形
{
EPwm1Regs.DBCTL.bit.POLSEL = 0x00; //PWM1取消互补波形
EPwm1Regs.CMPA.half.CMPA = 1875; //PWM拉满
EPwm1Regs.CMPB = 1875;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //PWM2开启互补波形
EPwm2Regs.CMPA.half.CMPA = pwm_cnt1;
//EPwm2Regs.CMPB = pwm_cnt1;
}
if((-0.314 <= Phase_compensation_old) && (Phase_compensation_old <= 2.98)) //正半周,取消PWM2互补波形,开启PWM1互补波形
{
EPwm2Regs.DBCTL.bit.POLSEL = 0x00; //PWM1取消互补波形
EPwm2Regs.CMPA.half.CMPA = 1875; //PWM拉满
EPwm2Regs.CMPB = 1875;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //PWM1开启互补波形
EPwm1Regs.CMPA.half.CMPA = (1875 - pwm_cnt1);
//EPwm1Regs.CMPB = pwm_cnt1;
}
5.3 PID设计
PID部分无需多说,网上关于PID控制器的原理讲解已经很深入和全面,在此不在赘述。
直接上代码:
/**
* @brief PID控制函数
* @param *pid:pid结构体参数
* @param SetVoltage:PID输入给定
* @param NowVoltage:实际值
* @retval incrementVoltage:PID输出控制信号
*/
double PID_contral(PID_Struct *pid,double SetVoltage,double NowVoltage)
{
pid->ActualVoltage = NowVoltage;
pid->SetVoltage = SetVoltage;
pid->err = pid->ActualVoltage - pid->SetVoltage;//当前误差
if(pid->err>0.2) pid->err=0.2;
if(pid->err<-0.2) pid->err=-0.2;
double incrementVoltage=pid->Kp*(pid->err - pid->err_last) +
pid->Ki*(pid->err) + pid->Kd
*(pid->err - 2*pid->err_last + pid->err_prev) + pid->old_incrementVoltage;
pid->err_prev = pid->err_last;
pid->err_last = pid->err;
pid->old_incrementVoltage = incrementVoltage;
//保护
if(incrementVoltage >= 0.95)
{
incrementVoltage = 0.95;
}
if(incrementVoltage <= 0.01)
{
incrementVoltage = 0.01;
}
return incrementVoltage;
}
5.4 滤波器设计
5.4.1 中位值平均滤波(防脉冲干扰平均滤波法)
具体做法为:
方法:相当于“中位值滤波法”+“算术平均滤波法”
连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值
N值的选取:3~14
优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的
采样值偏差。对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统。
缺点:测量速度慢。
原文出处与详细可见: 常用ADC采样数字滤波算法最全汇总!!!
/**
* @brief 快速排序算法
* @Description 对采集到的数据快速排序
* @param *arr:放数据数组
* @retval 无
*/
void QuickSort(double *arr, int maxlen, int begin, int end)
{
int i, j;
if (begin < end) {
i = begin + 1;
j = end;
while (i < j) {
if(arr[i] > arr[begin]) {
swap(&arr[i], &arr[j]);
j--;
} else {
i++;
}
}
if (arr[i] >= arr[begin]) {
i--;
}
swap(&arr[begin], &arr[i]);
QuickSort(arr, maxlen, begin, i);
QuickSort(arr, maxlen, j, end);
}
}
void swap(double *a, double *b)
{
double temp;
temp = *a;
*a = *b;
*b = temp;
}
5.4.2 陷波滤波器滤波法
电网谐波主要集中在低次谐波,尤其是3次、5次、7次、9次、11次、13次等。
这些谐波通常由非线性负载产生,如电力电子设备(变频器、整流器、UPS等)、 荧光灯、节能灯等。这些设备在工作时,会向电网注入谐波电流,导致电压波形畸变。
低次谐波对电网和设备的影响较大,因为它们的频率接近电网的基波频率,容易与 电网的其他部分发生共振,从而放大谐波的影响。此外,低次谐波还可能导致设备过 热、误动作、寿命缩短等问题。
所以滤波器设计的关键是滤除 150HZ 的奇次谐波信号。
可以考虑使用频率为 150HZ的陷波滤波器 来实现。
已知,模拟陷波滤波器的传递函数为:
Ω0 为需要滤除的角频率
B= Ω2 − Ω1为3dB带宽
Ω2 , Ω1、分别为在陷波频 率的上边频和下边频幅度增益为-3dB的频率
采用双线性变换法,将
带入传递函数,可得到二阶数字陷波滤波器的传递函数。
其中 Ts 为采样频率。
当采样频率为 20KHz , 模拟陷波频率为150Hz,3dB带宽为10Hz,
按此参数设计的二阶数字 陷波滤波器的传递函数为:
下面给出伯德图:
可以看到,该陷波滤波器对150HZ 信号有很强的滤波作用。
当然,大家对离散化方面的知识较为陌生,可以参照下面几篇博客:
下面给出计算数字化传递函数的 Matlab 的程序:
%100Hz陷波滤波器,采样频率20KHz
w = logspace(2,3,300);
ou = 150.0 * 2 * pi;
fanwei = 10 * 2 * pi;
fenzi = [1 0 ou*ou];
fenmu = [1 fanwei ou*ou];
fff = [1];
bbb = conv(fenzi,fff);
ccc = conv(fenmu,fff);
lvbo = tf(fenzi,fenmu)
LOz = c2d(lvbo,5e-5,'tustin')
bode(lvbo,w)
margin(lvbo)
有一个公式需要认识:
离散化后为 :
y_k = 0.9984*u_k - 1.995*u_k1 +0.9984*u_k2 + 1.995*y_k1 - 0.9969*y_k2 ;
5.5 F28335程序烧录问题
在使用中,可能会遇见程序在 RAM 和 FLASH 中运行速度不同,导致程序实时性降 低,从而导致程序烧入 FLASH 中后 SOGI_PLL锁相环失败问题。
读者在复刻时,可以先选择过零检测的方案,此方案较为稳妥。
解决方案可以参照:[第一讲]DSP28335将Flash中的代码拷贝到RAM中运行
6. 写在最后
2024.8.5 初版
初次写完整的方案分享,且由于作者水平有限,本博客错漏缺点在所难免,希望读者批评指正。
后续会更新关于并联方面的解决方案,敬请期待。
文中提到的所有模块均有成品,有需要可以直接私信我。
2024.8.8 第一次修改
补充了LC滤波器相关设计内容。
7. 参考文献
贺博.单相PWM整流器的研究[D].华中科技大学,2012.
单相PWM整流器dq变换的控制方法研究_刘炜