电子信息系统综合设计实验报告 专业:电子信息 班级:电子141班 学号:14072001784 姓名:刘成成 一、实验目的 设计并制作一台数控型DCDC稳压电源。 二、实验要求 1、输出电压范围 :0.5v~4.5v。可以通过按键实现电压调整 2、必须使用PID闭环控制算法 3、发挥部分: PID控制的三个系数,可以通过遗传算法来确定。 三、实验内容 1、原理框图
2、实验原理 PID( Proportional Integral Derivative)控制是 最早发展起来的控制策略之一,由于其算法 简单、鲁棒性好和可靠性高,被广泛应用于 工业过程控制,尤其适用于可建立精确数学 模型的确定性控制系统。 如图一, 图一 该实验使用PID算法,通过按键控制单片机PWM波形的占空比。PWM波形通过74HC595驱动电路之后进入BOOST电路控制输出电压。 即,通过改变占空比来改变输出电压。 该实验实现的结果为,设计了五个按键,每个按键按下之后会输出不同的电压值,输出电压值在依次为1,、2、3、4、5V。 如图二为BOOST电路部分,实现升压功能。 图二 图三为驱动电路部分,有了驱动电路,才能让PWM波形在BOOST电路上工作。 图三 图四为单片机部分 图四 图五为AD转换部分 图五 图六为显示部分: 图六 总的原理框图如图七: 图七 3、程序如下:(见附件)
该实验最后基本实现了实验要求,图为按下输出电压为2V相应的按键后的示波器和数码管显示的状态。示波器黄线为PWM波形,蓝线为电压波形。数码管显示为1.9V,误差为0.1V。 通过本次设计,对稳压电源和PID算法原理有了一定的理解。初步掌握了Proteus程序的基本用法。并且在进行模拟仿真的时候,对Proteus运用很陌生,在网上大量搜索之后完成了仿真设计,总体来说还需要不断地练习。
buck型DCDC稳压电源的51单片机源程序如下:
- #include"reg52.h"
- #include"iic.h"
- #include"math.h"
- #include"intrins.h"
- #include<absacc.h>
- //#define unsigend char uchar
- unsigned
- char code shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
- char code sho[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};
- sbit SHCP=P2^2;
- sbit DS=P2^3;
- sbit STCP=P2^4;
- sbit P11=P3^5;
- sbit P12=P3^7;
- sbit pwm=P2^7;
-
- sbit CS = P1^2;
- sbit CLK = P1^3;
- sbit DIO = P1^4;
-
- sbit button1=P3^0;
- sbit button2=P3^1;
- sbit button3=P3^2;
- sbit button4=P3^3;
- sbit button5=P3^4;
- unsigned char j,k,m,n,i,a,l;
- unsigned int b;
-
- int pwm_add=0;
- int PWM_control=0;
-
- float voltage_get=0;
- float voltage_set=0;
-
- float voltage_kp=0.01;
- float voltage_ki=0.12;
- float voltage_output=0;
- float voltage_error=0;
- float voltage_error_last=0;
-
- void timer_init();
- void display();
- unsigned char Get_ADC(bit ch);
-
- void main()
- {
-
- float x1=0.5,x2=1.5,x3=2,x4=2.5,x5=3;
- timer_init();
-
-
-
- while(1)
- {
- if(button1==0) {voltage_set=1;}
- if(button2==0) {voltage_set=2;}
- if(button3==0) {voltage_set=3; }
- if(button4==0) {voltage_set=4;}
- if(button5==0) {voltage_set=5;}
-
-
- a=Get_ADC();
- b=a*9;
- m=b%1000/100;
- n=b%100/10;
- //l=b%1000/100/10
- display();
- }
-
- }
- void delay(unsigned char t) //?óê±3ìDò
- {
- while(t--);
- }
- void timer_irq() interrupt 1
- {
- pwm_add++;
- if (pwm_add==PWM_control) {pwm=0;}
- else if (pwm_add>=50) {pwm=1;pwm_add=0;}
-
- }
-
- void timer1_irq() interrupt 3
- {
- TH1=(65536-50000)>>8;
- TL1= 65536-50000;
-
- voltage_get=(Get_ADC(0)/10.2);
- // voltage_get=17;
- voltage_error=voltage_set-voltage_get;
-
- voltage_output+=voltage_kp*(voltage_error-voltage_error_last)
- +voltage_ki*voltage_error;
-
- voltage_error_last=voltage_error;
-
- if (voltage_output>49) voltage_output=49;
- else if(voltage_output<1) voltage_output=1;
-
- PWM_control=(int)voltage_output;
-
-
- }
-
- void timer_init()
- {
- TMOD=0X12;
- TH0=TL0=256-200;
- TH1=(65536-50000)>>8;
- TL1= 65536-50000;
- EA=1;ET0=1;ET1=1;TR0=1;TR1=1;
- }
-
-
- unsigned char Get_ADC(bit ch)
- {
- unsigned char i,dat1 = 0,dat2 = 0;
- CS = 0; CLK = 0;
- DIO = 1; _nop_(); _nop_();
- CLK = 1; _nop_(); _nop_();
- CLK = 0; DIO = 1; _nop_(); _nop_();
- CLK = 1; _nop_(); _nop_();
- CLK = 0; DIO = ch; _nop_(); _nop_();
- CLK = 1; _nop_(); _nop_();
- CLK = 0; DIO = 1; _nop_(); _nop_();
- for(i = 0; i < 8; i++)
- {
- CLK = 1; _nop_(); _nop_();
- CLK = 0; _nop_(); _nop_();
- dat1 = (dat1 << 1)|DIO;
- }
- for(i = 0; i < 8; i++)
- {
- dat2 = dat2|((unsigned char)DIO<<i);
- CLK = 1; _nop_(); _nop_();
- CLK = 0; _nop_(); _nop_();
- }
- CS = 1;
- return dat1;
- }
- void display()
- {
-
-
-
- j=0x01;
- for(i=0;i<8;i++)
- {
- if((sho[m]&j)==0)
- {
- DS=0;
- }
- else
- {
- DS=1;
- }
- SHCP=1;
- SHCP=0;
- j<<=1;
- }
- P12=0;
- P11=1;
- STCP=0;
- STCP=1;
-
- delay(200);
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
稳压电源.zip
(468.82 KB, 下载次数: 292)
|