1引言
题目整体考察的就是DC-DC变换器的设计、使用、控制。
设计方面可以通过基本的升降压电路、DC-DC芯片完成DC-DC变换功能。而本次设计就选用了最基本的buck电路闭环控制设计。Buck电路,又称降压电路,由PWM波控制其,基本特征是DC-DC转换电路,输出电压低于输入电压。输入电流为脉动的,输出电流为连续的。实现了DC-DC变换的相对稳定输出。
控制方面,选用了国产芯片MM32SPIN27PS,MM32SPIN27PS是灵动专门为电机与电源相关应用设计的产品家族。本产品是使用高性能的Arm Cortex-M0 为内核的32 位微控制器,最高工作频率可达96MHz,内置128KB Flash、12KB SRAM,具有丰富的I/O 端口和外设。
电流检测采用ACS712模块,ACS712是基于霍尔效应的电流传感器,带 2.1 kVRMS电压绝缘及低电阻电流导体的全集成传感器IC可检测,可对0-20A的电流进行测量。
2系统方案
2.1 方案描述
根据题目的要求,确定如下方案:选择Buke电路进行DC降压;使用MM32SPIN27PS对电路进行信息处理和控制;通过控制Buke电路,从而控制电源的充放电。
2.2 方案比较
(1)最小系统板的选择
方案一:C51
方案二:M32SPIN27PS
方案三:STM32
方案四:K60
51单片机处理位数太低,数据处理和运算能力太低,显然不满足系统要求;M32SPIN27PS、STM32和K60是32位,三者都满足系统要求,不过K60的价格高,性价比不高,不建议采用;处理运算时,STM32速度略快但功耗也略高;M32SPIN27PS是专门为电机与电源相关应用设计,具有丰富的I/O口,较好满足所需,且为国产芯片。综合所做系统复杂度考虑,相对而言,M32SPIN27PS更为适合。
(2)基于DC-DC降压的选择
方案一:降压芯片SY840ABC
方案二:搭建降压电路Buke
初始选择降压芯片SY840ABC,搭建好外围电路后,进行测试后,未达到预期效果,所具有的资料太少,且所需元件也较稀有,不太适合短时间电路搭建;Buck电路是基础电路,也是最为经典的降压电路,且输入输出范围符合要求,相对更为合适。
(3)驱动芯片的选择
方案一:EG2104
方案二:IR2104
EG2104 高端的工作电压可达 600V,低端 Vcc的电源电压范围宽 2.8V~20V,静态功耗小于 1uA;IR2104工作电压可达600V,稳定性相对较好,且芯片外围电路简单,而EG2104芯片稳定性较差,综合比较选择IR2104作为驱动芯片更合适。
2.3 方案选择
综合所有选项,系统方案选定完毕。如下:
最小系统板:M32SPIN27PS
降压电路选择:Buck
驱动芯片:IR2104
3系统结构论证与电路设计
3.1 总电路系统框图及流程图
直流电源流入电路,首先电源两极接入一个滤波电容,再通过Buck电路得到输出电压,输出接入负载和电池电源,同样都需要并联电容。系统总体框图如图所示:
MM32核心板控制Buck电路,通过对电路电压电流进行采样,通过PID算法,来得到稳定的电压输出。电源的充放电同样可以通过Buke电路来控制其充放的状态。系统流程图如图所示:
3.2 Buke电路与驱动电路原理图
控制的PWM信号送入以IR2104为驱动芯片的驱动电路,用来驱动IRF540N的导通或断开,从而使得达到降压目的。原理图如图所示:
4程序设计
4.1 程序设计流程
4.2 程序介绍
程序设计采用模块化设计,各功能函数经过主函数调用,程序首先是初始化,当开关启动后,对各引脚初始化,然后主函数开始调动各函数。
对电压电流进行连续采样,通过权重滤波算法,得到较为准确的采样值,根据采样值与目标值的偏差,利用PID算法来控制PWM波的占空比,从而实现输出电压的升降。对电流电压采样值的判断,观察电路环境,与模式一模式二的条件进行匹配,从而进行模式选择。
4.2 程序介绍
见附件
5测试方案与测试结果
5.1 测试设备及方案
所用测试设备有:直流电压源,万用表,数字示波器。
测试方案描述如下:
(1)US=50V、IO=1.2A 条件下,变换器工作在模式 I,UO=30V±0.1V,IB≥0.1A。
表1 基本要求(1)的测量结果
|
1 |
2 |
3 |
4 |
5 |
分析 |
UO |
30.01 |
30.05 |
29.92 |
30.08 |
30.15 |
存在测量误差 |
IB |
0.22A |
0.23A |
0.18A |
0.20A |
0.15A |
存在测量误差 |
(2)IO=1.2A、US由 45V 增加至 55V ,电压调整率 SU ≤ 0.5% 。
表2 基本要求(2)的测量结果
|
1 |
2 |
3 |
4 |
5 |
分析 |
SU |
0.5% |
0.45% |
0.55% |
0.40% |
0.45% |
有测量误差 |
(3)US=50V、IO由 2A 减小至 0.6A,负载调整率 SI ≤ 0.5%。
表3 基本要求(3)的测量结果
|
1 |
2 |
3 |
4 |
5 |
分析 |
SI |
0.5% |
0.45% |
0.55% |
0.40% |
0.45% |
有测量误差 |
(4)US=50V、IO=1.2A 条件下,变换器效率hI ≥90%。
表4 基本要求(4)的测量结果
|
1 |
2 |
3 |
4 |
5 |
分析 |
hI |
94% |
95% |
95% |
94% |
94% |
满足 |
5.2测试结果分析
(1)基础要求(1):测量结果满足要求,有少许误差,应是测量方面存在的误差,可以忽略,相对结果而言,基本满足需求。
(2)基础要求(2):测量结果满足要求,有少许误差,应是测量方面存在的误差,可以忽略,相对结果而言,基本满足需求。
(3)基础要求(3):测量结果满足要求,有少许误差,应是测量方面存在的误差,可以忽略,相对结果而言,基本满足需求。
(4)基础要求(4):测量结果满足要求,设计方案可行。
6结论
电源类实验有一定的危险性,一定要选好正确的方案,当电路连接好时一定要检查有没有错误,最好请教老师。本次实验历时3天4夜,在这个过程中学到了很多,也深深认识到自己的不足,电源类题目考察的是我们对电路一些基本特性的理解,电路元件大小的选择,一些参数的修改,这些改动都会影响最后产品的性能。
心得:第二次做电赛,又有了不同的收获,第一次做电赛的时候我们磕磕绊绊拿了一个省三,这一次我们选择了电源题,是新的开始亦是突破,可惜,对于一些参数的选定和最终电路的搭建出现了一点问题,不过,参与对我们来说就是最大的收货,理论和实践的结合也让我们意识到知识的重要性,这一次学到了很多,也很开心有这样一次机会用这几天,用尽全身经历来做这件事情。
最后,电赛已经结束了,可我们并不认为这个作品已经完成,没完成的我们也一定会在日后的时间里来完善它。
附件代码:
#include "headfile.h"
// **************************** value group ****************************
char txt[20];
// **************************** code group ****************************
int main(void)
{
direction = 1; // Set initial direction to positive
delta = 1; // Amount by which to adjust the PWM - 7-bit resolution so duty step of 2%
pwm = 26; // Initial position of the PWM - 50% Duty Cycle with 7-bit resolution.
upperbound = 49; // Upper bound of the PWM %
lowerbound = 1; // Lower bound of the PWM %
power = 0; // Initial Value of Power
board_init(true);
// 初始化 debug 输出串口
lcd_init();
gpio_init(A9,GPO_PP,1);
gpio_init(A10,GPO_PP,1);
adc_init (ADC_1, ADC1_CH00_A00, ADC_12BIT);
adc_init (ADC_1, ADC1_CH01_A01, ADC_12BIT);
adc_init (ADC_1, ADC1_CH02_A02, ADC_12BIT);
adc_init (ADC_1, ADC1_CH03_A03, ADC_12BIT);
adc_init (ADC_1, ADC1_CH04_A04, ADC_12BIT);
adc_init (ADC_1, ADC1_CH05_A05, ADC_12BIT);
adc_init (ADC_1, ADC1_CH06_A06, ADC_12BIT);
adc_init (ADC_1, ADC1_CH07_A07, ADC_12BIT);
adc_init (ADC_1, ADC1_CH08_B00, ADC_12BIT);
adc_init (ADC_1, ADC1_CH09_B01, ADC_12BIT);
adc_init (ADC_1, ADC1_CH10_B02, ADC_12BIT);
pwm_init (TIM_2,TIM_2_CH3_C09,50*1000,6000);
pwm_init (TIM_2,TIM_2_CH4_B11,50*1000,5600);
tim_interrupt_init (TIM_3, 200, 0x00);
//此处编写用户代码(例如:外设初始化代码等)
//此处编写用户代码(例如:外设初始化代码等)
while(1)
{
systick_delay_ms(300);
lcd_clear(WHITE);
sprintf(txt,"U1:%d",ADC_Value[0]);
lcd_showstr(0,0,txt);
sprintf(txt,"error:%.2f",error);
lcd_showstr(0,1,txt);
sprintf(txt,"pwm_i:%.2f",pwm_i);
lcd_showstr(0,2,txt);
sprintf(txt,"pwm:%d",pwm);
lcd_showstr(0,3,txt);
sprintf(txt,"Us:%d",ADC_Value[1]);
lcd_showstr(0,4,txt);
//此处编写需要循环执行的代码
}
}
// **************************** code group ****************************