做的综合设计,融合了单片机技术,模拟电子技术,电力电子技术,自动控制技术,设计了一个基于51单片机的PID控制的DC/DC电路,该设计主体电路是BUCK电路,用单片机进行控制开关管的导通关断,从而实现对DC/DC的控制要求。开关管所需的PWM由单片机进行运算后发出,最终实现了DC/DC的输出功能。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
主电路
主电路
仿真
仿真
BUCK电路
BUCK电路
单片机源程序:
- #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');
- }
复制代码
求大家指导 如何加入pid算法?
Keil代码与Proteus7.5仿真下载::
程序.rar
(52.64 KB, 下载次数: 78)
|