找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10735|回复: 11
打印 上一主题 下一主题
收起左侧

dcdc buck闭环数控型稳压电源仿真+单片机程序及实验报告

  [复制链接]
跳转到指定楼层
楼主
电子信息系统综合设计实验报告
专业:电子信息
班级:电子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单片机源程序如下:
  1. #include"reg52.h"
  2.   #include"iic.h"
  3.   #include"math.h"
  4.   #include"intrins.h"
  5.               #include<absacc.h>                                                         
  6.   //#define unsigend char  uchar
  7. unsigned
  8. char code shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};            
  9. char code sho[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};
  10. sbit SHCP=P2^2;                           
  11. sbit DS=P2^3;                           
  12. sbit STCP=P2^4;                           
  13. sbit P11=P3^5;
  14. sbit P12=P3^7;
  15.   sbit  pwm=P2^7;

  16.   sbit CS  = P1^2;
  17.   sbit CLK = P1^3;
  18.   sbit DIO = P1^4;

  19.   sbit button1=P3^0;
  20.   sbit button2=P3^1;
  21.   sbit button3=P3^2;
  22.   sbit button4=P3^3;
  23.   sbit button5=P3^4;
  24. unsigned char j,k,m,n,i,a,l;               
  25. unsigned int b;

  26.   int pwm_add=0;               
  27.   int PWM_control=0;            

  28.   float voltage_get=0;                           
  29.   float voltage_set=0;                             

  30.   float voltage_kp=0.01;                           
  31.   float voltage_ki=0.12;                                         
  32.   float voltage_output=0;               
  33.   float voltage_error=0;                           
  34.   float voltage_error_last=0;            

  35.   void timer_init();
  36.               void display();
  37.   unsigned char Get_ADC(bit ch);

  38.   void main()
  39.   {

  40.                             float x1=0.5,x2=1.5,x3=2,x4=2.5,x5=3;
  41.       timer_init();               
  42.                            
  43.                                          
  44.                            
  45.                 while(1)
  46.                 {
  47.                             if(button1==0)                      {voltage_set=1;}
  48.                                if(button2==0)                {voltage_set=2;}
  49.                                             if(button3==0)                  {voltage_set=3; }
  50.                                   if(button4==0)     {voltage_set=4;}
  51.                                                             if(button5==0)    {voltage_set=5;}
  52.                                          
  53.                                          
  54.                                           a=Get_ADC();                                         
  55.    b=a*9;                           
  56.    m=b%1000/100;            
  57.    n=b%100/10;            
  58.    //l=b%1000/100/10            
  59.                                           display();
  60.                                              }               
  61.                            
  62.   }
  63.               void delay(unsigned char t)      //?óê±3ìDò   
  64.   {
  65.    while(t--);
  66.    }
  67.   void timer_irq() interrupt 1
  68.   {
  69.      pwm_add++;
  70.               if      (pwm_add==PWM_control)  {pwm=0;}
  71.               else if (pwm_add>=50)                                          {pwm=1;pwm_add=0;}

  72.   }

  73.   void timer1_irq() interrupt 3
  74.   {
  75.       TH1=(65536-50000)>>8;
  76.                 TL1= 65536-50000;

  77.                 voltage_get=(Get_ADC(0)/10.2);
  78.               // voltage_get=17;
  79.                 voltage_error=voltage_set-voltage_get;

  80.                 voltage_output+=voltage_kp*(voltage_error-voltage_error_last)
  81.                                +voltage_ki*voltage_error;

  82.                 voltage_error_last=voltage_error;

  83.                 if     (voltage_output>49)                voltage_output=49;
  84.                 else if(voltage_output<1)                              voltage_output=1;
  85.                
  86.                 PWM_control=(int)voltage_output;            


  87.   }
  88.                
  89.   void timer_init()
  90.               {
  91.                 TMOD=0X12;  
  92.                 TH0=TL0=256-200;
  93.                 TH1=(65536-50000)>>8;
  94.                 TL1= 65536-50000;
  95.       EA=1;ET0=1;ET1=1;TR0=1;TR1=1;
  96.               }


  97. unsigned char Get_ADC(bit ch)
  98. {
  99.   unsigned char i,dat1 = 0,dat2 = 0;
  100.   CS = 0; CLK = 0;
  101.   DIO = 1; _nop_(); _nop_();
  102.   CLK = 1; _nop_(); _nop_();
  103.   CLK = 0; DIO = 1; _nop_(); _nop_();
  104.   CLK = 1;          _nop_(); _nop_();
  105.   CLK = 0; DIO = ch; _nop_(); _nop_();
  106.   CLK = 1;          _nop_(); _nop_();
  107.   CLK = 0; DIO = 1; _nop_(); _nop_();
  108.   for(i = 0; i < 8; i++)
  109.   {
  110.     CLK = 1; _nop_(); _nop_();
  111.     CLK = 0; _nop_(); _nop_();
  112.     dat1 = (dat1 << 1)|DIO;
  113.   }
  114.   for(i = 0; i < 8; i++)
  115.   {
  116.     dat2 = dat2|((unsigned char)DIO<<i);
  117.     CLK = 1; _nop_(); _nop_();
  118.     CLK = 0; _nop_(); _nop_();
  119.   }
  120.   CS = 1;
  121.   return dat1;
  122. }
  123. void display()                                                         
  124. {

  125.             

  126.   j=0x01;                                                                       
  127.   for(i=0;i<8;i++)
  128.   {
  129.       if((sho[m]&j)==0)                             
  130.        {
  131.                    DS=0;                                         
  132.                  }
  133.       else
  134.                  {
  135.                    DS=1;            
  136.                  }
  137.     SHCP=1;
  138.     SHCP=0;
  139.       j<<=1;            
  140.    }            
  141.               P12=0;                           
  142.     P11=1;                           
  143.     STCP=0;                                          
  144.     STCP=1;

  145.     delay(200);

  146. ……………………

  147. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:

稳压电源.zip (468.82 KB, 下载次数: 289)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:304545 发表于 2018-4-17 09:43 | 只看该作者
看了很有帮助
回复

使用道具 举报

板凳
ID:20672 发表于 2018-12-23 14:41 | 只看该作者
谢谢分享~~!!!
回复

使用道具 举报

地板
ID:318489 发表于 2019-2-26 11:00 | 只看该作者
谢谢分享。。。
回复

使用道具 举报

5#
ID:728172 发表于 2020-4-24 10:40 | 只看该作者
感谢分享,很好的资料
回复

使用道具 举报

6#
ID:590748 发表于 2020-4-27 15:08 | 只看该作者
东西下载来看看,学习学习
回复

使用道具 举报

7#
ID:837828 发表于 2021-4-30 10:11 | 只看该作者
真的谢谢,你的文章刚好提供了思路
回复

使用道具 举报

8#
ID:837828 发表于 2021-4-30 20:33 | 只看该作者
??标题是BUCK,内容用的是BOOST电路,说的是输出12345V,实际仿真图里是其他的....
回复

使用道具 举报

9#
ID:586915 发表于 2021-6-29 16:11 | 只看该作者
代码都不备注新手怎么看
回复

使用道具 举报

10#
ID:156220 发表于 2021-6-29 16:32 | 只看该作者
参考参考,谢谢楼主的分享
回复

使用道具 举报

11#
ID:586915 发表于 2021-6-29 16:45 | 只看该作者
下载后测试输出电压误差大的一逼 选2V 的时候电压从1.5-2.0在跳
回复

使用道具 举报

12#
ID:899981 发表于 2023-10-10 18:05 | 只看该作者
lsx116 发表于 2021-6-29 16:45
下载后测试输出电压误差大的一逼 选2V 的时候电压从1.5-2.0在跳

我的压根就没电压
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表