首页 > 其他分享 >2024河南省大学生电子设计竞赛A题:AC-AC变换电路并联运行(代码工程+原理图+PCB+设计报告)经验分享

2024河南省大学生电子设计竞赛A题:AC-AC变换电路并联运行(代码工程+原理图+PCB+设计报告)经验分享

时间:2024-08-06 08:54:29浏览次数:18  
标签:AC obj pid 原理图 spll 电路 电子设计 osg

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 滤波器设计

                公式太难打了,等我休息休息再说。

        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模块的相关资料可以参考我的另 一篇博客:

                        TLV5610在F28335芯片上的使用教程

  //判断正负半周
  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 信号有很强的滤波作用。

                当然,大家对离散化方面的知识较为陌生,可以参照下面几篇博客:

                伯德图(Bode图)分析系统性能

                比例谐振(PR)控制器的学习过程记录 

                十:使用MATLAB传递函数的绘制伯德图

                下面给出计算数字化传递函数的 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         初版  

        初次写完整的方案分享,且由于作者水平有限,本博客错漏缺点在所难免,希望读者批评指正。

        后续会更新关于并联方面的解决方案,敬请期待。

        文中提到的所有模块均有成品,有需要可以直接私信我。

7.  参考文献

   贺博.单相PWM整流器的研究[D].华中科技大学,2012.

   单相PWM整流器dq变换的控制方法研究_刘炜

标签:AC,obj,pid,原理图,spll,电路,电子设计,osg
From: https://blog.csdn.net/L2244662131__/article/details/140904070

相关文章

  • Deepface - 仅以超过阈值的置信度显示面部的情绪
    我有这段代码可以检测面部表情,但它会在没有面部表情的地方找到面部表情。所以我想知道是否可以放心地做到这一点。我尝试在谷歌上搜索如何做到这一点,但没有找到任何有用的东西。importcv2fromdeepfaceimportDeepFace#Loadfacecascadeclassifierface_cascade=......
  • 漏洞复现:Apache solr
    目录漏洞简述环境搭建漏洞复现漏洞检测漏洞修复漏洞简述ApacheSolr是一个开源的搜索服务,使用Java编写、运行在Servlet容器的一个独立的全文搜索服务器,是ApacheLucene项目的开源企业搜索平台。该漏洞是由于没有对输入的内容进行校验,攻击者可利用该漏洞在未授权的情......
  • Spring源码(六)--BeanFactory 实现与继承关系
    BeanFactory实现与继承关系这些接口和类的源码,每一个都可以看一下。ListableBeanFactory由bean工厂实现的BeanFactory接口的扩展,这些bean工厂可以枚举它们所有的bean实例,而不是按客户端请求逐个按名称进行bean查找。HierarchicalBeanFactory由bean工厂实现的子接口,可以是......
  • react 监控props的变化
    react监控props的变化在React组件中,可以使用生命周期方法componentWillReceiveProps来监控props的变化。但是,这个方法在新版React(16.3以后)中已被弃用。取而代之的是,可以使用新的生命周期方法getDerivedStateFromProps或者类的自定义方法来实现相同的功能。以下是使用get......
  • interface关键字 day09
    /*java提供了一个关键字:interface,用来定义一个接口接口的主要作用是用来描述类的额外功能的。定义一个接口的语句定义格式:interface接口名{}需求:定义一个普通的狗类,和一个会骑车的狗类使用接口的注意事项:1、接口中只能出现抽象......
  • javaCC链6
    CC6条件:commons-conlections<=3.2.1不限制jdk版本payloadpackageorg.example;importorg.apache.commons.collections.Transformer;importorg.apache.commons.collections.functors.ChainedTransformer;importorg.apache.commons.collections.functors.ConstantTrans......
  • javaCC链3
    cc3cc3区别cc6不再是使用Rutime类执行命令,而是通过类加载器动态加载恶意类然后执行类加载:ClassLoader.loadClass->ClassLoader.findClass->ClassLLoader.defineClassClassLoader.loadClass:寻找加载的类(双亲委派机制)ClassLoader.findClass:如果loadClass没找到类,就根据类名称/......
  • vite和webpack的区别
    内核区别最明显区别是及时编译和打包编译,开发编译速度上的区别。配置区别主要区别就是webpack有loader和plugins配置,vite直接是plugins为主体。viteplugins中配置编译器和插件:其他json配置大同小异。参考文章https://zxuqian.cn/difference-between-vite-and-webpac......
  • abstract关键字以及与public,final,static的关系 day09
    多态程序中,第一大前提要有继承关系。但是呢,比如上午写的动物案例,我们将狗,猫,猪这些具体的动物分别编写了一个类进行对应这都是没问题的。但是呢,动物本身应该是一个抽象的概念,我们在现实生活中其实是找到不到Animal的实例的。具体的事物,我们就可以使用java代码......
  • Signac包-2.联合10x多组学分析:scATAC-seq和scRNA-seq
    –https://stuartlab.org/signac/articles/pbmc_multiomic看文章看累了来看看代码,换换口味。本章主要涉及peakstogenes的联动。留意更多内容,欢迎关注微信公众号:组学之心数据下载:wgethttps://cf.10xgenomics.com/samples/cell-arc/1.0.0/pbmc_granulocyte_sorted_10k......