找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1490|回復(fù): 0
收起左側(cè)

參考壇友DCDC 51單片機PWM PID電源仿真程序,改了一下

[復(fù)制鏈接]
ID:899981 發(fā)表于 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占空比調(diào)節(jié)

  19.   float voltage_get=0;                        //獲取電壓值
  20.   float voltage_set=0;                    //設(shè)定電壓值   這個地方就是你要設(shè)定的電壓  修改這個值就可以獲得想要的電壓值  現(xiàn)在是36V

  21.   float voltage_kp=0.01;                //PID  KP比例系數(shù)
  22.   float voltage_ki=0.1;                        //PID  KI積分系數(shù)
  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  用于產(chǎn)生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;//當前差值=設(shè)置的減去獲取的。

  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.   //定時器初始化           具體的下面的代碼已經(jīng)配置好了   不用太關(guān)注
  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轉(zhuǎn)換
  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.   //返回讀取結(jié)果
  125.   return dat1;
  126. }
復(fù)制代碼

仿真程序51hei附件下載:
dcdc buck 閉環(huán)4.7z (283.99 KB, 下載次數(shù): 38)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表