### 项目简介
本系统是基于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)
### 演示视频
- - -