1、 设计任务如下:
设计并制作一个数控恒流电源,实现以下要求:
1)基本要求
(1)U2=20V,负载不变的条件下,实现I2恒流,恒流电流在1~2A 范围内步进可调,步进值不大于0.1A,电流控制精度不低于 5%;
(2)设定I1=2A,调整负载改变输出电压,使负载两端电压从3V~13V范围内变化时,要求电流I2的变化率不大于1%;
(3)测量并显示I2,测量精度不低于2%;
(4)设定 I1=1.5A,调整负载改变输出电压,使负载两端电压为10V,要求变换器2的转换率不低于90%;
2)发挥部分
(1)具有过压保护功能,设定I2=2A,当负载上电压超过阈值15V时,报警停止输出;
(2)设计变换器1连接到U2,使输入电压U1的变化范围为8~15V,输出U2保持20V不变,变换器1的转换效率不低于93%;
(3)在满足要求的前提下提高效率、减小体积,使系统整机体积不大于10X10X6cm3;
2、分析如下
(1)针对变换器1,实现升压到20V电压,而且需要实现变换器1输出电压恒定,故变换器1的方案是boost升压电路,同时加入电压的AD采集,形成电压反馈,实现稳压;
(2)针对变压器2,实现电流恒定,故需要实现电流值恒定,即电流采样,实现整体输出电流恒定。
3、电路设计
(1)BOOST升压电路
BOOST升压电路
原理,其实跟降压型也一样,还是通过调节占空比,占空比大电压就大。
(2)BUCK降压电路
电路原理,本电路为BUCK降压型DCDC变换电路,通过改变PWM占空比改变输出电压。在本题运用中,单片机输出PWM经过TLP250驱动芯片放大PWM信号足矣驱动MOS,改变输出电压,当采集到输出电压时,比较输出电压与期望电压,输出电压小了就把PWM占空比增大,然后电压就增大了,继续不断的采集比较判断调节,知道输出电压达到期望电压为止,当然,恒流也如此,电流小就增大占空比反正就减小占空比。但是这个占空比的增减算法不是简单的加加减减,本设计采用PID算法中的PD算法。
电流采样方法;电流经过电阻就有电压,然后知道电压值和电阻阻值就可以算出电流值,本电路中利用放大器将电压放大20倍,所以采集出运放输出的电压就可以算出电流。
电压采样;采用分压采样,电压电阻有这么个关系: VO/(R2+R3)=Vadc/R3;其中Vadc为单片机采集的电压,
4、软件设计
包括1602显示、AD采集、PWM波形生成,驱动MOS管工作,实现电路电压的放大,此外,还有PID调节程序设计,其主函数程序设计如下:
#include "stm32f10x.h"
#include "lcd1602.h"
#include "adc.h"
#include "Timer2_interrupt.h"
#include "pwm_output.h"
#include "control.h"
#include "bsp_key.h"
uint32_t QW_V=20000,QW_I=1100;
uint32_t jishu=0;
void pre()
{
if(ADC_ConvertedValueLocal[0]>15090)
{
jishu++;
// get_ADC();
if(jishu>5)
{
Display_Lcd1602(0, 0, " warning ");
Display_Lcd1602(1, 0, " PRETECT ");
Display_Lcd1602(1, 0, " V A ");
while(1)
{
TIM3->CCR3=0;
}
}
}
}
int main(void)
{
uint16_t i=0;
LCD_Init();
ADC1_Init();
TIM3_PWM_Init();
Key_GPIO_Config();
// TIM2_Init();
Display_Lcd1602(0, 0, " A V");
Display_Lcd1602(1, 0, " A V");
TIM3->CCR3=1200;
TIM3->CCR4=1200;
while(1)
{
i++;
get_ADC();
TIM3->CCR4=C_V(20000,ADC_ConvertedValueLocal[2]); TIM3->CCR3=C_I(QW_I,ADC_ConvertedValueLocal[1]);
pre();
if(i==20)
{
i=0;
write_bsg(0,0,QW_I);
write_bsg(1,0,ADC_ConvertedValueLocal[1]);
write_v(1,9,ADC_ConvertedValueLocal[0]);
write_v(0,9,ADC_ConvertedValueLocal[2]);
}
if( Key_Scan(GPIOB,GPIO_Pin_15,0) == KEY_ON )
{
QW_I-=500;
if(QW_I<1000)QW_I=1000;
}
if( Key_Scan(GPIOB,GPIO_Pin_14,0) == KEY_ON )
{
QW_I+=100;
if(QW_I>2000)QW_I=2000;
}
if( Key_Scan(GPIOB,GPIO_Pin_13,0) == KEY_ON )
{
QW_I-=50;
if(QW_I<1000)QW_I=1000;
}
if( Key_Scan(GPIOB,GPIO_Pin_12,0) == KEY_ON )
{
QW_I+=50;
if(QW_I>2000)QW_I=2000;
}
}
}
5、课题难度不大,读者可自行研究实现,另发现问题可深入互相学习。