标题: 补充—数控稳压电源 PID闭环控制 带仿真 源码 51单片机制作 [打印本页]

作者: lessen_li    时间: 2017-8-20 12:25
标题: 补充—数控稳压电源 PID闭环控制 带仿真 源码 51单片机制作
本文是作为我前段时间发的作品的补充:http://www.51hei.com/bbs/dpj-85002-1.html
设计采用分档位操作,可以设置输出电压,0V-3V-6V-9V-12V,在此基础上可进行修改设计,编程Keil4或者Keil5  仿真Proteus


单片机源程序如下:
  1.   #include"reg52.h"
  2.   #include"iic.h"
  3.   #include"math.h"
  4.   #include"intrins.h"
  5.   
  6.   //#define unsigend char  uchar

  7.   sbit  pwm=P2^7;  //  定义pwm脉冲

  8.   sbit CS  = P1^2; //使能。
  9.   sbit CLK = P1^3;//时钟
  10.   sbit DIO = P1^4;

  11.   sbit button1=P3^0;
  12.   sbit button2=P3^1;
  13.   sbit button3=P3^2;
  14.   sbit button4=P3^3;
  15.   sbit button5=P3^4;


  16.   int pwm_add=0;            //pwm增量
  17.   int PWM_control=0;        //pwm占空比调节

  18.   float voltage_get=0;                        //获取电压值
  19.   float voltage_set=0;                    //设定电压值   这个地方就是你要设定的电压  修改这个值就可以获得想要的电压值  现在是36V

  20.   float voltage_kp=0.01;                //PID  KP比例系数
  21.   float voltage_ki=0.1;                        //PID  KI积分系数
  22.   float voltage_output=0;            //PID输出
  23.   float voltage_error=0;                //实际值与给定的误差
  24.   float voltage_error_last=0;        //记录上次的误差

  25.   void timer_init();
  26.   unsigned char Get_ADC(bit ch);

  27.   void main()
  28.   {
  29.       timer_init();           //初始化定时器
  30.           while(1)
  31.           {
  32.                if(!button1)                  voltage_set=0;
  33.                    else if(!button2)          voltage_set=3;
  34.                    else if(!button3)          voltage_set=6;
  35.                    else if(!button4)          voltage_set=9;
  36.                    else if(!button5)          voltage_set=12;
  37.       }          
  38.   }

  39. //定时器0  用于产生PWM波
  40.   void timer_irq() interrupt 1
  41.   {
  42.      pwm_add++;
  43.          if      (pwm_add==PWM_control)  {pwm=0;}
  44.          else if (pwm_add>=50)                         {pwm=1;pwm_add=0;}

  45.   }

  46.   void timer1_irq() interrupt 3
  47.   {
  48.       TH1=(65536-50000)>>8;
  49.           TL1= 65536-50000;

  50.           voltage_get=(Get_ADC(0)/10.2);
  51.          // voltage_get=17;
  52.           voltage_error=voltage_set-voltage_get;

  53.           voltage_output+=voltage_kp*(voltage_error-voltage_error_last)
  54.                          +voltage_ki*voltage_error;

  55.           voltage_error_last=voltage_error;

  56.           if     (voltage_output>49)          voltage_output=49;
  57.           else if(voltage_output<1)                  voltage_output=1;
  58.           
  59.           PWM_control=(int)voltage_output;       


  60.   }


  61.   //定时器初始化           具体的下面的代码已经配置好了   不用太关注
  62.   void timer_init()
  63.         {
  64.           TMOD=0X12;   
  65.           TH0=TL0=256-200;
  66.           TH1=(65536-50000)>>8;
  67.           TL1= 65536-50000;
  68.       EA=1;ET0=1;ET1=1;TR0=1;TR1=1;
  69.         }


  70. unsigned char Get_ADC(bit ch)
  71. {
  72.   unsigned char i,dat1 = 0,dat2 = 0;
  73.   //启动AD转换
  74.   CS = 0; CLK = 0;
  75.   DIO = 1; _nop_(); _nop_();
  76.   CLK = 1; _nop_(); _nop_();
  77.   CLK = 0; DIO = 1; _nop_(); _nop_();
  78.   CLK = 1;          _nop_(); _nop_();
  79.   CLK = 0; DIO = ch; _nop_(); _nop_();
  80.   CLK = 1;          _nop_(); _nop_();
  81.   CLK = 0; DIO = 1; _nop_(); _nop_();
  82.   //从高位开始读
  83.   for(i = 0; i < 8; i++)
  84.   {
  85.     CLK = 1; _nop_(); _nop_();
  86.     CLK = 0; _nop_(); _nop_();
  87.     dat1 = (dat1 << 1)|DIO;
  88.   }
  89.   //从低位开始读
  90.   for(i = 0; i < 8; i++)
  91.   {
  92.     dat2 = dat2|((unsigned char)DIO<<i);
  93.     CLK = 1; _nop_(); _nop_();
  94.     CLK = 0; _nop_(); _nop_();
  95.   }
  96.   CS = 1;
  97.   //返回读取结果
  98.   return dat1;
  99. }
复制代码

所有资料51hei提供下载:
dcdc buck 闭环.zip (87.92 KB, 下载次数: 262)



作者: wxhm2011    时间: 2018-3-21 23:03
下来看看
作者: ab560    时间: 2018-3-22 08:07
学习学习,正需要,谢谢分享
作者: eastwin    时间: 2018-3-26 23:07
if     (voltage_output>49)          voltage_output=49;
          else if(voltage_output<1)                  voltage_output=1;
大师,这个是啥意思,累计到一定程度,就发49条件下的占空比?
作者: WOFY    时间: 2018-4-12 20:50
看看,谢谢分享!
作者: aiyowei1998    时间: 2018-7-11 20:18
谢谢楼主分享,很实用

作者: 淮工王大师    时间: 2018-8-29 15:51
我下载了,不能工作,何解?
作者: 淮工王大师    时间: 2018-8-29 15:53
按3-12v 任何按键,脉冲占空比都会几乎变得满格 接近100%
作者: 淮工王大师    时间: 2018-8-29 17:30
可以用 我换了一个电感 所以才不好用 不好意思!
作者: 发烧人生    时间: 2018-10-1 12:14
现在正在学习,正需要,谢谢分享
作者: xiong731    时间: 2018-10-14 20:19
学习学习,谢谢分享!
作者: lern01    时间: 2018-11-29 20:46
能配一些文字说明就更好了,顶!
作者: MR.SHANG    时间: 2019-2-23 11:42
正好需要开关电源的例子
作者: 18239311863    时间: 2019-7-11 16:21
不错,有助于学习
作者: m182892    时间: 2019-7-12 08:26
没有原理图。
作者: 鹏博士PBs    时间: 2019-7-12 09:05
好资源顶一个
作者: ZHAOBAO511    时间: 2023-10-8 12:38
不能仿真,三极管基极没有脉冲。
作者: 量子工业    时间: 2023-10-8 13:33
精度能到多少呢?稳定性如何?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1