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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)PID示例程序及Proteus仿真實(shí)現(xiàn) TLC5615+LTC1292采集

[復(fù)制鏈接]
ID:656155 發(fā)表于 2021-7-23 16:12 | 顯示全部樓層 |閱讀模式
示波器圖中,紫色線高點(diǎn)是3.5v,低點(diǎn)是1.5v
一一對(duì)應(yīng)程序中的getset(350),getset(150)
仿真正確
此pid封裝成.c .h文件形式,可以直接調(diào)用

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
){{IP9PSZZ}XE7NL7A5T~EX.png (NH189WZLI)~ULF%R6@GYHW.png 51hei.gif

(1) 了解工業(yè)過(guò)程控制的一般情況;
(2)  掌握數(shù)字PID控制器程序設(shè)計(jì)方法;

2.實(shí)驗(yàn)內(nèi)容
設(shè)計(jì)單片機(jī)控制電路,采用TLC5615和LTC1292芯片采集電壓和輸出電壓,并編寫(xiě)數(shù)字PI控制器程序,對(duì)直流電機(jī)進(jìn)行控制,要求采樣周期100毫秒,對(duì)設(shè)定值轉(zhuǎn)速和實(shí)際轉(zhuǎn)速進(jìn)行實(shí)時(shí)顯示。
PID采用增量式,定點(diǎn)計(jì)算,輸入要濾波,輸出要限幅。

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

4、實(shí)驗(yàn)步驟
從D/A輸出點(diǎn)接一個(gè)二階慣性對(duì)象,將對(duì)象輸出接A/D輸入點(diǎn)。
在PC機(jī)輸入源程序并匯編,然后下載到單片機(jī)上,進(jìn)行調(diào)試。
注意二階系統(tǒng)的電路需要與單片機(jī)共地

(1) 整理好實(shí)驗(yàn)程序。
(2) 總結(jié)比例參數(shù)P積分參數(shù)I和采樣周期對(duì)控制系統(tǒng)性能的影響。

單片機(jī)源程序如下:
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;            //用戶設(shè)定值
  8.     pid.Kp=20;                //比例系數(shù)
  9.     pid.Ti=100;                //積分比例常數(shù)
  10.     pid.Td=5;                //微分時(shí)間常數(shù)
  11.     pid.OUT0=0;                //一個(gè)維持的輸出

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

  14.    
  15. void pid_calc()  //pid計(jì)算
  16. {
  17.   float dk1;float dk2;
  18.   float t1,t2,t3;   
  19. //    if(pid.Tdata < (pid.T))  //最小計(jì)算周期未到
  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;        //理解為第二個(gè)誤差
  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計(jì)算               
  43.                         
  44.              break;
  45.          
  46.          case MODEL_PI:  pid.Dout= t1+t2;    //使用PI計(jì)算            
  47.                         
  48.              break;
  49.                  
  50.          case MODEL_PID: pid.Dout= t1+t2+t3; //使用PID計(jì)算      

  51.              break;
  52.      }
  53.          
  54.     pid.currpwm+=pid.Dout;  //本次應(yīng)該輸出的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;//輸出擴(kuò)大,使效果明顯
  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. }
復(fù)制代碼
  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計(jì)算后輸出
  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                //比例系數(shù)
  41. #define ki 1                //積分系數(shù)
  42. #define kd 15                //微分系數(shù)
  43. #define TIM -10000                //采樣周期
  44. int e0=0,e1=0,e2=0;                //三個(gè)時(shí)刻
  45. int s;                                        //增量式PID計(jì)算本次應(yīng)該輸出的增量值
  46. uint r,y;                                //r是實(shí)際要求的輸出,Y是A/D傳過(guò)來(lái)的輸出
  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. }
復(fù)制代碼

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

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区视频在线免费观看 | 亚洲综合中文字幕在线观看 | 日韩高清一区二区 | 中文字幕在线精品 | 久久久久久国产精品 | 在线视频成人 | 99精品一区二区 | av黄色免费在线观看 | 一区二区免费在线视频 | 亚洲天天干 | 中文字幕成人免费视频 | 免费av电影网站 | 91影院 | 午夜欧美日韩 | 久久综合入口 | 免费成人在线网站 | 国产成人网 | 日韩av一区二区在线观看 | 国产在线看片 | 国产日韩欧美在线 | 99精品国产一区二区青青牛奶 | 日韩一区二区在线视频 | 成人国产精品免费观看 | 奇米超碰在线 | 日韩高清www | 久久伊人精品 | www日本在线播放 | 亚洲精品不卡 | 18av在线播放 | 婷婷一级片 | 国产精品久久久久一区二区三区 | 欧美1级 | 日韩色视频 | 欧美二区在线 | 国产毛片毛片 | 欧美一区二区三区电影 | 91网站视频在线观看 | 丝袜美腿一区 | 欧美片网站免费 | 国产精产国品一二三产区视频 | 国产成人久久 |