单片机
返回首页

基于51单片机的PID控制的DC/DC电路仿真+程序设计

2020-02-29 来源:51hei

寒假前做的课程综合设计,融合了单片机技术,模拟电子技术,电力电子技术,自动控制技术,设计了一个基于51单片机的PID控制的DC/DC电路,该设计主体电路是BUCK电路,用单片机进行控制开关管的导通关断,从而实现对DC/DC的控制要求。开关管所需的PWM由单片机进行运算后发出,采用PID算法,最终实现了DC/DC的输出功能。

仿真原理图如下
主电路

主电路

仿真

仿真 

BUCK电路

BUCK电路

单片机源程序:

#include


#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        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');

}


进入单片机查看更多内容>>
相关视频
  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 新唐 8051单片机教程

精选电路图
  • 如何从标准USB插座构建双+5V/-5V电源

  • 基于2N3055的晶体管功率放大器电路

  • 液位报警指示器电路

  • 基于两个小晶体管构建一个的功率放大器

  • 基于LH0032构建的视频放大器电路

  • 超声波运动检测器的电路图

    相关电子头条文章