2021年B题三相 AC-DC 变换电路 一神两坑 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 2021年B题三相 AC-DC 变换电路 一神两坑

简介:本系统是基于BOOST升压PFC的AC-DC电压同步整流电路实现设计要求。在DC-DC端使用电压锁相环和电流锁相环稳定直流输出,并使用PID技术进行稳定输出,负载调整率和电压调整率均小于0.3 %,

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2021-12-20 16:43:36
更新时间: 2022-11-21 17:26:02
描述
### 项目简介 本系统是基于BOOST升压PFC的AC-DC电压同步整流电路实现设计要求。采用TI公司单片机TM4C123G采集降压滤波后的输入三相交流电相位,利用单片机内电压调节器控制PWM波使AC-DC端输出线电压稳定在28 V。在DC-DC端使用电压锁相环和电流锁相环稳定直流输出,并使用PID技术进行稳定输出,负载调整率和电压调整率均小于0.3 %,AC-DC输入侧功率因数和变换电路效率均满足了设计要求,且功率因数误差不大于0.02。经过电压同步整流和功率因数校正提高了系统的效率,基本上完成了设计需求。 - - - ### 项目功能介绍 项目的相关功能的介绍和简介,如: * 交流输入线电压 Ui=28V,Io=2A 时,Uo=36V±0.1V。 * 当 Ui=28V,Io在 0.1A~2.0A 范围内变化时,负载调整率 SI ≤ 0.3%。 * 当 Io=2A,Ui 在 23V~33V 范围内变化时,电压调整率 SU ≤ 0.3%。 * 在 Ui=28V,Io=2A,Uo=36V 条件下,AC-DC 变换电路的效率 η 不低于 85%。 * 在 Ui=28V,Io=2A,Uo=36V 条件下,AC-DC 变换电路输入侧功率因数不低于 0.99。 * 在 Ui=28V,Io=2A,Uo=36V 条件下,AC-DC 变换电路的效率 η 不低于 95%。 * 三相 AC-DC 变换电路能根据数字设定自动调整功率因数,功率因数调整范围为 0.90~1.00,误差绝对值不大于 0.02。 - - - ### 项目属性 这里可填写项目的完成进度条,根据已完成的功能来选择复选框,也可以作为功能的完成度进度调显示 * [x] 原理图设计 * [x] PCB图设计 * [x] PCB打样 * [x] 焊接测试 * [x] 功能测试 * [x] 程序测试 - - - ### 电路讲解 将220 V交流市电接入可调自耦变压器,再接入隔离变压器,通过调节变压器实现交流电降压。在降压后交流电输入系统的电路中分别加入相同大小电感实现电路续流和滤波作用,采用卡尔曼滤波方式对输入交流电再次进行滤波,避免输入信号对系统信号采样产生干扰。通过TI公司单片机TM4C123G采集滤波后输入三相电其中的一路相位,输出三路相位相差120度的等幅度PWM波控制半桥驱动器输出幅值为9V的PWM波,控制MOS管的导通或关断,实现电压型同步整流AC-DC转换。经过π型滤波电路进行滤波,去除多余交流信号。使用电压锁相环和电流锁相环实现负载上电压和电流的稳定,改变DC-DC输入电压或电流不会对负载电压或电流产生影响。并对负载进行电压采样,起到调节功率因数作用。 - - - ### 软件 ``` C #include "parallel.h" #include "key.h" #include "KalmanFilter.h" #ifdef parallel #define I_OUT_A_MAX_CONFIG 500 #define V_OUT_A_MAX_CONFIG 1000 u8 i=0; //u32 BUFF[10]; //char datas[20]; float sin_buff=0; float integral_old[5]; float SIN = 3; static u8 MOD = 0; static u8 MOD_EN = 0; static float FAC = 1; //float config[10]; u32 T = 0; u32 *buff = NULL; u8 data[2048]; void V_LOOOP(float settemp) { PID_data[0][3]=settemp; //Ñ¡³ö×î´óÖµ¡¢×îСֵ V_IN_A_MIN_old = V_IN_A_MIN; V_IN_A_MAX = 0; V_IN_A_MIN = 5000; V_OUT_A_MAX = 0; V_OUT_A_MIN = 5000; I_OUT_A_MAX = 0; I_OUT_A_MIN = 5000; for(i=0;i<120;i++) { if(V_IN_A_MAXADC_LB_data[i][0]) { V_IN_A_MIN = ADC_LB_data[i][0]; } if(V_OUT_A_MAXADC_LB_data[i][4]) { V_OUT_A_MIN = ADC_LB_data[i][4]; } if(I_OUT_A_MAXADC_LB_data[i][6]) { I_OUT_A_MIN = ADC_LB_data[i][6]; } } /////////////////////////////////////// // //  µçѹ»·PIDµ÷½Ú // /////////////////////////////////////// if((V_IN_A_MAX - V_IN_A_MIN_old)*1000 > 20) { PID_data[0][6] = V_OUT_A_MAX - V_OUT_A_MIN;  integral_old[0] = PID_data[0][4]; PID(PID_data,0); sin_buff = PID_data[0][7]; if((float)(sin_buff * (V_IN_A_MAX - V_IN_A_MIN_old)) >= (float)0.95) { PID_data[0][4] = integral_old[0]; //GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, GPIO_PIN_6); sin_buff = (float)0.95/(V_IN_A_MAX - V_IN_A_MIN_old); } if((I_OUT_A_MAX - I_OUT_A_MIN)*1000 > I_OUT_A_MAX_CONFIG) { if(sin_1 > sin_buff) { sin_1 = sin_buff; } else { PID_data[0][4] = integral_old[0]; } } else { sin_1 = sin_buff; } //sin_1 = 5; //sin_1 = sin_buff; } else { sin_1 = 0; PID_data[0][4] = 0; PID_data[0][5] = 0; } /* //ʾ²¨Ëã·¨ OLED_Clear(); for(i=0;i<120;i++) { BUFF[0] = (u32)((float)(ADC_LB_data[i][0]-A1_MIN)*1000); OLED_DrawPoint(i+1,30-BUFF[0]/18,1); } OLED_ShowNum(50,40,A1_MAX_temp*1000,4,8,1); OLED_ShowNum(50,50,A1_MIN_old*1000,4,8,1); OLED_ShowNum(5,40,V1_MAX_temp*1000,5,8,1); OLED_ShowNum(5,50,PID_data[0][2]*1000,5,8,1); OLED_ShowNum(90,50,(A1_MAX_temp - A1_MIN_old) * sin_1*100,5,8,1); //OLED_ShowNum(90,50,sin_1*100,5,8,1);*/ } void I_LOOOP(float settemp) { PID_data[0][3]=settemp; //Ñ¡³ö×î´óÖµ¡¢×îСֵ V_IN_A_MIN_old = V_IN_A_MIN; V_IN_A_MAX = 0; V_IN_A_MIN = 5000; I_IN_A_MAX = 0; I_IN_A_MIN = 5000; V_OUT_A_MAX = 0; V_OUT_A_MIN = 5000; I_OUT_A_MAX = 0; I_OUT_A_MIN = 5000; for(i=0;i<120;i++) { if(V_IN_A_MAXADC_LB_data[i][0]) { V_IN_A_MIN = ADC_LB_data[i][0]; } if(I_IN_A_MAXADC_LB_data[i][2]) { I_IN_A_MIN = ADC_LB_data[i][2]; } if(V_OUT_A_MAXADC_LB_data[i][4]) { V_OUT_A_MIN = ADC_LB_data[i][4]; } if(I_OUT_A_MAXADC_LB_data[i][6]) { I_OUT_A_MIN = ADC_LB_data[i][6]; } } /////////////////////////////////////// // //  µçÁ÷»·PIDµ÷½Ú // /////////////////////////////////////// if(settemp*1000 > 20) { GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0); PID_data[0][6] = I_OUT_A_MAX - I_OUT_A_MIN;  integral_old[0] = PID_data[0][4]; PID(PID_data,0); sin_buff = PID_data[0][7]; if((float)(sin_buff * (I_OUT_A_MAX - I_OUT_A_MIN)) >= (float)0.95) { PID_data[0][4] = integral_old[0];  //GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, GPIO_PIN_6); sin_buff = (float)0.95/(I_OUT_A_MAX - I_OUT_A_MIN); } if((V_IN_A_MAX - V_IN_A_MIN_old)*1000 > V_OUT_A_MAX_CONFIG) { if(sin_1 > sin_buff) { sin_1 = sin_buff; } else { PID_data[0][4] = integral_old[0];  } } else { sin_1 = sin_buff; } //sin_1 = 5; //sin_1 = sin_buff; } else { sin_1 = 0; PID_data[0][4] = 0; PID_data[0][5] = 0; GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 1); } /* //ʾ²¨Ëã·¨ OLED_Clear(); for(i=0;i<120;i++) { BUFF[0] = (u32)((float)(ADC_LB_data[i][0]-A1_MIN)*1000); OLED_DrawPoint(i+1,30-BUFF[0]/18,1); } OLED_ShowNum(50,40,A1_MAX_temp*1000,4,8,1); OLED_ShowNum(50,50,A1_MIN_old*1000,4,8,1); OLED_ShowNum(5,40,V1_MAX_temp*1000,5,8,1); OLED_ShowNum(5,50,PID_data[0][2]*1000,5,8,1); OLED_ShowNum(90,50,(A1_MAX_temp - A1_MIN_old) * sin_1*100,5,8,1); //OLED_ShowNum(90,50,sin_1*100,5,8,1);*/ } /*  * SPIЭÒé byte0   > command *           byte1-2 > length * byte3-* > data */ void send_data(void) { u32 DACC = 0; static u8 time = 0; #define MAX_TIME 2 switch(time) { case 0: { //²¨ÐÎÊý¾Ý·¢ËÍ data[0] = 0; *((u16 *)(&data[1])) = 120*4*4+4; buff = (u32 *)(&data[3]); for(i=0;i<120;i++) { *buff = (u32)((float)(ADC_LB_data[i][0]-V_IN_A_MIN_old)*1000)/5; buff += 1; } for(i=0;i<120;i++) { *buff = (u32)((float)(ADC_LB_data[i][0]-V_IN_A_MIN_old)*1000)/5; buff += 1; } for(i=0;i<120;i++) { *buff = (u32)((float)(ADC_LB_data[i][0]-V_IN_A_MIN_old)*1000)/5; buff += 1; } for(i=0;i<120;i++) { *buff = (u32)((float)(ADC_LB_data[i][0]-V_IN_A_MIN_old)*1000)/5; buff += 1; } spi_write_buf(0, (uint8_t *)data, *((u16 *)(&data[1]))); } case 1: { //PIDÊý¾Ý·¢ËÍ data[0] = 1; *((u16 *)(&data[1])) = 60+4; buff = (u32 *)(&data[3]); for(i=0;i<8;i++)  { DACC = (u32)(PID_data[0][i]*1000); *buff = DACC;  //0-7 P I D buff += 1; } DACC = (u32)((V_IN_A_MAX - V_IN_A_MIN_old) * sin_1*1000); *buff = DACC;   //8 buff += 1; DACC = (u32)(SIN*1000); *buff = DACC;   //9 buff += 1; DACC = (u32)((I_OUT_A_MAX - I_OUT_A_MIN)*1000); *buff = DACC;   //10 buff += 1; DACC = (u32)Y_Y; *buff = DACC;   //11 buff += 1; DACC = (u32)MOD; *buff = DACC;   //12 buff += 1; DACC = (u32)MOD_EN; *buff = DACC;   //13 buff += 1; DACC = (u32)FAC; *buff = DACC;   //14 buff += 1; spi_write_buf(0, (uint8_t *)data, *((u16 *)(&data[1]))); } } time++; if(time >= MAX_TIME) { time = 0; } } /* 1. ½»»¥º¯Êý 2. ¸ù¾Ý°´¼üÇý¶¯Êý¾Ý 3. Ñ¡Ôñģʽ ¸Ä±ä²ÎÊý */ void Config_Data(void) { if(key_num[1] == 1) { if(FAC >= 10) FAC /= 10; key_num[1] = 0; }else if(key_num[2] == 1) { if(FAC < 1000) FAC *= 10; key_num[2] = 0; } ///////////////////////////// if(MOD_EN == 0) { if(key_num[0] == 1) { key_num[0] = 0; MOD_EN = 1; } if(MOD + Key_B == 255) { MOD = 9; Key_B = 0; } else if(MOD + Key_B == 10) { MOD = 0; Key_B = 0; } else { MOD += Key_B; Key_B = 0; } } else { switch(MOD) { case 0: { if(key_num[0] == 0) { if(Key_B != 0) { SIN += (float)0.001*(float)Key_B*FAC; Key_B = 0; } } else { Key_B = 0; key_num[0] = 0; MOD_EN = 0; } } break; case 1: { if(key_num[0] == 0) { if(Key_B != 0) { GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 1); if(Y_Y + Key_B >= 0) Y_Y += Key_B*(int)FAC; Key_B = 0; TimerDisable(TIMER2_BASE, TIMER_A); sin_timer_init(); GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0); } } else { Key_B = 0; key_num[0] = 0; MOD_EN = 0; } } break; default: MOD_EN = 0; break; } } } void parallel_start() { double KalmanFilter_Data[2][6] = { {1,600}, {1,100}, }; delay_ms(2000); sys_init(); //OLED_Init(); spi_init(); adc0_init(); get_adc(0,1); Spwm_3_120_init(); tim0_in_init(1,1); Key_init(); while(1) //803 930 {        //798 926 T++; KalmanFilter((double)((V_IN_A_MAX - V_IN_A_MIN_old)*SIN),KalmanFilter_Data[0]); V_LOOOP(KalmanFilter_Data[0][4]); //OLED_ShowNum(90,40,T,5,8,1);  //OLED_Refresh(); if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_4)) { send_data(); } Key_Scan(); Config_Data(); delay_ms(2); if(T%20 == 0) GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_PIN_6); else GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, 0); } } #endif ``` - - - ### 图片 ![image.png](//image.lceda.cn/pullimage/KK6ySdALk1NFP9KclW8CV3xCPhJGMypzMk5GF2QI.png)放置 ![image.png](//image.lceda.cn/pullimage/XoadGrPMx7xYWAjsgr7H5ncYxFySTD1uFnk9fixr.png)![image.png](//image.lceda.cn/pullimage/91pvrUnnUS1x1rF6s320OajsmEkuOgSBxKilhdV2.png) ![IMG_1399.JPG](//image.lceda.cn/pullimage/JX5hQZhotwCrsOjdhq9osYbqq9KWC1TntAHESpjm.jpeg) ### 演示视频 - - -

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
序号 文件名称 下载次数
1

DC-DC.rar

259
工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP