做的綜合設計,融合了單片機技術,模擬電子技術,電力電子技術,自動控制技術,設計了一個基于51單片機的PID控制的DC/DC電路,該設計主體電路是BUCK電路,用單片機進行控制開關管的導通關斷,從而實現對DC/DC的控制要求。開關管所需的PWM由單片機進行運算后發出,最終實現了DC/DC的輸出功能。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
主電路
zhu.png (29.7 KB, 下載次數: 49)
下載附件
主電路
2019-1-23 20:39 上傳
仿真
qqq.png (21.53 KB, 下載次數: 57)
下載附件
仿真
2019-1-23 20:39 上傳
BUCK電路
buck.png (11.47 KB, 下載次數: 53)
下載附件
BUCK電路
2019-1-23 19:44 上傳
單片機源程序:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit pwm=P2^7;
- sbit lcdrs=P2^2;
- sbit lcdrw=P2^1;
- sbit lcden=P2^0;
- sbit st=P1^2;
- sbit eoc=P1^1;
- sbit oe=P1^0;
- #include"timer1.c"
- #include"delay.c"
- #include"adin0.c"
- #include"write_com.c"
- #include"write_data.c"
- #include"init.c"
- #include"xianshi.c"
- void main()
- {
- int ww=0;
- uchar i0,j0,t,k;
- uint sum=0,in0,a[50];
- init();
- while(1)
- {
- for(k=0;k<50;k++) //記錄AD轉換50次
- {
- a[k]=2*adin0();
- }
- for(j0=0;j0<49;j0++) //50個數據排序
- {
- for(i0=0;i0<49-j0;i0++)
- {
- if(a[i0]>a[i0+1])
- {
- t=a[i0];
- a[i0]=a[i0+1];
- a[i0+1]=t;
- }
- }
- }
- sum=0;
- for(k=10;k<40;k++) //去除最大的10個與最小的10個
- {
- sum=sum+a[k];
- }
- in0=sum/30; //求平均值
- xianshi(in0);
- in0=in0*2-5;
- if(in0<490||in0>510)
- // if(in0!=500)
- {
- if(in0<500) ww+=(500-in0);
- if(in0>500) ww-=(in0-500);
- b=(b*10+500-in0+ww/10)/10;
- }
- }
- }
- int a=0,b=50;
- void timer1() interrupt 3 //確定pwm占空比
- {
- if(a<b)pwm=1;
- else pwm=0;
- a++;
- if(a==100)a=0;
- }
- void delay(uchar z) //延時函數
- {
- uchar i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- uchar adin0()
- {
- uchar value;
- oe=0;
- st=0; //啟動信號輸入端,上升沿清除ADC0808寄存器,下降沿啟動AD轉換
- delay(10);
- st=1;
- delay(10);
- st=0;
- while(!eoc); //等待轉換完成
- delay(10);
- oe=1; //準許輸出信號
- delay(1);
- value=P3;
- oe=0;
- value=value;
- return value;
- }
- write_com(uchar com)
- {
- lcdrs=0; //命令寄存器寫入
- P0=com;
- delay(5);
- lcden=1; //準許LCD輸入
- delay(5);
- lcden=0;
- }
- write_data(uchar date)
- {
- lcdrs=1; //數據寄存器寫入
- P0=date;
- delay(5);
- lcden=1; //準許LCD輸入
- delay(5);
- lcden=0;
- }
- void init() //初始化子程序
- {
- TMOD=0x20; //定時器1設置為方式2
- TH1=246; //定時器1初值
- TL1=246;
- TR1=1;
- ET1=1;
- EA=1;
- oe=0;
- P1=0x07;
- lcdrs=0;
- lcdrw=0;
- lcden=0;
- pwm=1;
- write_com(0x38); //顯示模式設置
- write_com(0x0c); //顯示開關及光標設置
- write_com(0x06); //輸入方式設置
- write_com(0x80); //DDRAM(數據顯示存儲器)地址設置
- }
- uchar temp0,temp1,temp2,temp3;
- void xianshi(uint num) //顯示數值子程序
- {
- write_com(0x80);
- num=2*num-3;
- temp0=num/100;
- temp1=num%100/10;
- temp2=num%100%10;
- write_data('s');
- write_data('h');
- write_data('u');
- write_data('c');
- write_data('h');
- write_data('u');
- write_data(':');
- write_data(0x30+temp0);
- write_data('.');
- write_data(0x30+temp1);
- write_data(0x30+temp2);
- write_data('v');
- }
復制代碼
0.png (6.95 KB, 下載次數: 45)
下載附件
2019-1-23 21:39 上傳
求大家指導 如何加入pid算法?
Keil代碼與Proteus7.5仿真下載::
程序.rar
(52.64 KB, 下載次數: 78)
2019-1-23 20:36 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
DCDC.rar
(99.09 KB, 下載次數: 84)
2019-1-23 20:35 上傳
點擊文件名下載附件
仿真 下載積分: 黑幣 -5
|