久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3961|回復: 0
打印 上一主題 下一主題
收起左側

51單片機PID示例程序及Proteus仿真實現 TLC5615+LTC1292采集

[復制鏈接]
跳轉到指定樓層
樓主
示波器圖中,紫色線高點是3.5v,低點是1.5v
一一對應程序中的getset(350),getset(150)
仿真正確
此pid封裝成.c .h文件形式,可以直接調用

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


(1) 了解工業過程控制的一般情況;
(2)  掌握數字PID控制器程序設計方法;

2.實驗內容
設計單片機控制電路,采用TLC5615和LTC1292芯片采集電壓和輸出電壓,并編寫數字PI控制器程序,對直流電機進行控制,要求采樣周期100毫秒,對設定值轉速和實際轉速進行實時顯示。
PID采用增量式,定點計算,輸入要濾波,輸出要限幅。

3、預備知識
控制系統軟件的設計,一般必須有嚴格的時間限制,故必須基于定時中斷進行設計,在中斷中運行實時性要求的程序,如A/D采樣程序、PID控制程序、D/A輸出程序、數碼管顯示刷新程序和鍵盤掃描程序等。在主程序中進行一些實時性要求低的程序,如打印程序、數據輸入程序等。

4、實驗步驟
從D/A輸出點接一個二階慣性對象,將對象輸出接A/D輸入點。
在PC機輸入源程序并匯編,然后下載到單片機上,進行調試。
注意二階系統的電路需要與單片機共地

(1) 整理好實驗程序。
(2) 總結比例參數P積分參數I和采樣周期對控制系統性能的影響。

單片機源程序如下:
PID.C
  1. #include "pid.h"

  2. PID pid;

  3. void PIDParament_Init()  //
  4. {
  5.     pid.choose_model = MODEL_PID;
  6.     pid.T=5;                //采樣周期
  7.                 pid.set =280;            //用戶設定值
  8.     pid.Kp=20;                //比例系數
  9.     pid.Ti=100;                //積分比例常數
  10.     pid.Td=5;                //微分時間常數
  11.     pid.OUT0=0;                //一個維持的輸出

  12.     pid.pwmcycle = 280;    //PWM的周期
  13. }

  14.    
  15. void pid_calc()  //pid計算
  16. {
  17.   float dk1;float dk2;
  18.   float t1,t2,t3;   
  19. //    if(pid.Tdata < (pid.T))  //最小計算周期未到
  20. //     {
  21. //            return ;
  22. //     }
  23. //    pid.Tdata = 0;
  24.     pid.curr=LTC1292();                //A/D輸入值
  25.                  
  26.     pid.En=pid.set-pid.curr;  //本次誤差
  27.                  
  28.                  
  29.     dk1=pid.En-pid.En_1;   //本次誤差與上次誤差之差
  30.     dk2=pid.En-2*pid.En_1+pid.En_2;        //理解為第二個誤差
  31.    
  32.                 t1=pid.Kp*dk1;                            //比例
  33.    
  34.     t2=(pid.Kp*pid.T)/pid.Ti;      //積分
  35.     t2=t2*pid.En;
  36.    
  37.     t3=(pid.Kp*pid.Td)/pid.T;        //微分
  38.     t3=t3*dk2;
  39.    
  40.     switch(pid.choose_model)
  41.      {
  42.          case MODEL_P:     pid.Dout= t1;    //僅使用P計算               
  43.                         
  44.              break;
  45.          
  46.          case MODEL_PI:  pid.Dout= t1+t2;    //使用PI計算            
  47.                         
  48.              break;
  49.                  
  50.          case MODEL_PID: pid.Dout= t1+t2+t3; //使用PID計算      

  51.              break;
  52.      }
  53.          
  54.     pid.currpwm+=pid.Dout;  //本次應該輸出的PID
  55. //    if(pid.currpwm>pid.pwmcycle)            //判斷本次輸出的PID在輸出要求之間
  56. //    {
  57. //      pid.currpwm=pid.pwmcycle;
  58. //    }
  59. //    if(pid.currpwm<0)
  60. //    {
  61. //     pid.currpwm=0;
  62. //    }
  63.     if(pid.currpwm>1023*15) pid.currpwm=1023*15;//輸出擴大,使效果明顯
  64.                 if(pid.currpwm<0) pid.currpwm=0;
  65.     pid.En_2=pid.En_1;//每次更新的交換,先交換e2的值,再交換e1
  66.     pid.En_1=pid.En;
  67.     //此處輸出PWM
  68.                 TLC5615(pid.currpwm/15);
  69. }
復制代碼
  1. #include <reg52.h>
  2. #include <pid.h>
  3. #define  uchar unsigned char
  4. #define  uint unsigned int
  5. #define  ulong unsigned long
  6. //sfr AUXR =0x8E;
  7. sbit ADAT=P2^5;
  8. sbit ACLK=P2^6;
  9. sbit ACS =P2^7;
  10. sbit Set=P3^7;
  11. uint LTC1292(void)        //輸入值
  12. {
  13.         uint i,x;
  14.         ACLK=0; ADAT=1; ACS=0;
  15.         for(i=0;i<14;i++)
  16.         {
  17.                 ACLK=1;         
  18.                 x<<=1;
  19.                 if(ADAT==1) x++;
  20.                 ACLK=0;
  21.         }
  22.         ACS=1;
  23.         return (x&0xfff);
  24. }
  25. sbit DDAT  = P3^4;
  26. sbit DCS  = P3^3;
  27. sbit DCLK  = P3^2;
  28. void TLC5615(uint j) //輸出值,PID計算后輸出
  29. {
  30.   uchar i;
  31.   DCLK=0; DCS=0;
  32.   j=j<<6;
  33.   for(i=0;i<12;i++)
  34.   {
  35.     j=j<<1; DDAT=CY;
  36.     DCLK=0;  DCLK=1;
  37.   }
  38.   DCLK=0; DCS=1;
  39. }
  40. #define kp 20                //比例系數
  41. #define ki 1                //積分系數
  42. #define kd 15                //微分系數
  43. #define TIM -10000                //采樣周期
  44. int e0=0,e1=0,e2=0;                //三個時刻
  45. int s;                                        //增量式PID計算本次應該輸出的增量值
  46. uint r,y;                                //r是實際要求的輸出,Y是A/D傳過來的輸出
  47. long u;                                       
  48. void PID_in() interrupt 3
  49. {
  50. //        float dk1,dk2;
  51. //        float t1,t2,t3;//分別為比例、積分、微分
  52.   TH1=TIM>>8; TL1=TIM&0Xff;
  53. //  y=LTC1292();                //A/D輸入值
  54. //  e2=e1=e0;
  55. //        e0=r-y;        //本次誤差
  56. //        
  57. //        dk1 = e0-e1;//上一次誤差
  58. //        dk2 = e0-2*e1+e2;//上上次誤差
  59. //        
  60. //  u+=dk1*kp+e0*ki+dk2*kd;        
  61. //  if(u>1023*kd) u=1023*kd;
  62. //  if(u<0) u=0;
  63. //  s=u/kd;
  64. //  TLC5615(s);
  65.         pid_calc();
  66. }

  67. uint GetSet(ulong x)
  68. {
  69.   ulong m;
  70.   m=x*4095;
  71.   return m/500;
  72. }
  73. void main()
  74. {
  75.   IE=0x88;TMOD=0X11;
  76.   TH1=TIM>>8; TL1=TIM&0xff;TR1=1;
  77.         PIDParament_Init();
  78.   while(1)
  79.   {
  80.                
  81.     if(Set)        pid.set=GetSet(350);
  82.                 else  pid.set=GetSet(150);
  83.                
  84.   }
  85. }
復制代碼

仿真代碼資料51hei附件下載:
PID資料.7z (106.09 KB, 下載次數: 78)

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线h| 亚洲一级av毛片 | 欧美日韩久久 | 亚洲视频手机在线 | 福利精品| 天堂成人国产精品一区 | 欧区一欧区二欧区三免费 | 成人在线精品 | av永久 | 国产区第一页 | 一级片在线观看 | 日韩成年人视频在线 | 久久一区二区三区免费 | 91精品一区二区三区久久久久 | 欧美激情精品久久久久 | 亚洲一区二区在线 | 亚洲精品乱码久久久久久9色 | 国产欧美精品一区二区三区 | 仙人掌旅馆在线观看 | av一区二区在线观看 | 中文字幕不卡在线观看 | 91.com视频| 欧美精品在线免费 | 色天天综合 | 日本久久www成人免 成人久久久久 | 波多野结衣一区二区 | 中文精品视频 | 国产精品久久精品 | 日本a视频| 色婷婷国产精品综合在线观看 | 在线色网| 国产精品亚洲一区二区三区在线观看 | 成人在线视频观看 | 日韩播放 | 成人不卡在线 | 久久国产精品99久久久久久丝袜 | 久久精品国产亚洲一区二区三区 | 中文字幕一区在线 | 国产一区二区麻豆 | 麻豆久久 | 欧美在线天堂 |