找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 730|回复: 0
收起左侧

参考坛友DCDC 51单片机PWM PID电源仿真程序,改了一下

[复制链接]
ID:899981 发表于 2023-10-11 09:32 | 显示全部楼层 |阅读模式
之前的程序下载 后不启动,不知道是不是版本问题,改后正常。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
93231.png

单片机源程序如下:
  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  P01=P0^1;  //  定义pwm脉冲
  9.   sbit CS  = P1^2; //使能。
  10.   sbit CLK = P1^3;//时钟
  11.   sbit DIO = P1^4;

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


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

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

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

  26.   void timer_init();
  27.   unsigned char Get_ADC(bit ch);
  28.         
  29.         
  30. static void Delay_ms(unsigned int ms)
  31. {
  32.         unsigned int i, j;
  33.         for(i = 0; i < ms; i++)
  34.                 for(j = 0; j < 990; j++);
  35. }
  36.   void main()
  37.   {
  38.       timer_init();           //初始化定时器
  39.                 pwm=0;
  40.                 voltage_set=12;
  41.           while(1)
  42.           {
  43.                if(!button1)        
  44.                                          voltage_set=0;
  45.                    else if(!button2)          voltage_set=3;
  46.                    else if(!button3)          voltage_set=6;
  47.                    else if(!button4)          voltage_set=9;
  48.                    else if(!button5)          voltage_set=12;
  49.                         //         voltage_set=9;
  50.                
  51.       // Delay_ms(3);
  52.                         //PWM_control=20;
  53.       }           
  54.                
  55.                         
  56.   }

  57. //定时器0  用于产生PWM波
  58.   void timer_irq() interrupt 1
  59.   {
  60.      pwm_add++;
  61.             if (pwm_add==PWM_control)
  62.      {pwm=0;}
  63.          else if (pwm_add==50)               
  64.          {
  65.          pwm=1;
  66.          pwm_add=0;
  67.          }

  68.   }

  69.   void timer1_irq() interrupt 3
  70.   {
  71.       TH1=(65536-50000)>>8;
  72.           TL1= 65536-50000;

  73.           voltage_get=(Get_ADC(0)/10.2);//获取当前电压
  74.                 //voltage_get=(Get_ADC(0));//获取当前电压
  75.          // voltage_get=17;
  76.                 //voltage_set=        voltage_set*10;
  77.           voltage_error=voltage_set-voltage_get;//当前差值=设置的减去获取的。

  78.           voltage_output+=voltage_kp*(voltage_error-voltage_error_last)
  79.                          +voltage_ki*voltage_error;

  80.           voltage_error_last=voltage_error;

  81.           if     (voltage_output>49)         
  82.                         voltage_output=49;
  83.           else if(voltage_output<1)                  
  84.                         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.   //启动AD转换
  101.   CS = 0; CLK = 0;
  102.   DIO = 1; _nop_(); _nop_();
  103.   CLK = 1; _nop_(); _nop_();
  104.   CLK = 0; DIO = 1; _nop_(); _nop_();
  105.   CLK = 1;          _nop_(); _nop_();
  106.   CLK = 0; DIO = ch; _nop_(); _nop_();
  107.   CLK = 1;          _nop_(); _nop_();
  108.   CLK = 0; DIO = 1; _nop_(); _nop_();
  109.   //从高位开始读
  110.   for(i = 0; i < 8; i++)
  111.   {
  112.     CLK = 1; _nop_(); _nop_();
  113.     CLK = 0; _nop_(); _nop_();
  114.     dat1 = (dat1 << 1)|DIO;
  115.   }
  116.   //从低位开始读
  117.   for(i = 0; i < 8; i++)
  118.   {
  119.     dat2 = dat2|((unsigned char)DIO<<i);
  120.     CLK = 1; _nop_(); _nop_();
  121.     CLK = 0; _nop_(); _nop_();
  122.   }
  123.   CS = 1;
  124.   //返回读取结果
  125.   return dat1;
  126. }
复制代码

仿真程序51hei附件下载:
dcdc buck 闭环4.7z (283.99 KB, 下载次数: 26)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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