找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10854|回復: 12
打印 上一主題 下一主題
收起左側(cè)

[原創(chuàng)]開源51單片機PID電機調(diào)速Proteus仿真與源碼

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:405708 發(fā)表于 2018-10-10 12:32 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
本代碼采用Proteus仿真,采用51單片機模擬PWM,用定時器獲取電機轉(zhuǎn)速信息,用PID算法控制轉(zhuǎn)速,轉(zhuǎn)速、P、I、D都可以用按鈕設(shè)置,LCD顯示屏顯示出電機的轉(zhuǎn)速、差值、設(shè)定值、P、I、D,并可以粗調(diào)跟微調(diào),還有閃爍提示,用來指示當前的設(shè)置項目。

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

不按設(shè)定鍵直接調(diào)整的是設(shè)定速度值因為速度值是以周期形式調(diào)整,所以速度值越小,轉(zhuǎn)速越高,2秒鐘無操作退出設(shè)置模式,非設(shè)置模式調(diào)節(jié)轉(zhuǎn)速

單片機源程序如下:
  1. //************************項目信息**************************
  2. //項目名稱:
  3. //客戶名稱:
  4. //************************文件信息**************************
  5. //文件名稱:pi.c
  6. //作    者:Lebo
  7. //文件版本:
  8. //校 驗 和:
  9. //************************硬件信息**************************
  10. //目標器件:
  11. //源 時 鐘:
  12. //UCBA型號:
  13. //************************平臺信息**************************
  14. //開發(fā)環(huán)境:
  15. //燒錄環(huán)境:
  16. //配置內(nèi)容:
  17. //************************功能信息**************************
  18. //程序功能:
  19. //函數(shù)列表:
  20. //************************修改記錄**************************
  21. // <author>  <time>   <version> <desc>
  22. //1.Lebo    15/01/11    V1.0    build this moudle
  23. //2.
  24. //**********************************************************



  25. //**********************************************************
  26. //程序名稱:頭文件
  27. //程序說明:
  28. //**********************************************************

  29. #include "pid.h"
  30. //**********************************************************
  31. //程序名稱:增量式PID初始化 函數(shù)
  32. //入口參數(shù):*ptrPID
  33. //出口參數(shù):e0, e1, e2, ka, kb, kc, kz, max_adjust, max_out, min_out
  34. //返回參數(shù):
  35. //調(diào)用函數(shù):
  36. //程序說明:
  37. //**********************************************************

  38. void PID_IncInit(PID_TypeDef *ptrPID){
  39.         (* ptrPID).e0 = 0;
  40.         (* ptrPID).e1 = 0;
  41.         (* ptrPID).e2 = 0;
  42.         
  43.         (* ptrPID).ka = 0;
  44.         (* ptrPID).kb = 0;
  45.         (* ptrPID).kc = 0;
  46.         (* ptrPID).kz = 0;
  47.         
  48.         (* ptrPID).maxAdjust = 0;
  49.         (* ptrPID).maxOut = 0;
  50.         (* ptrPID).minOut = 0;
  51. }
  52. //**********************************************************
  53. //程序名稱:增量式PID系數(shù)設(shè)置 函數(shù)
  54. //入口參數(shù):kp, ki, kd, z, *pid_ptr
  55. //出口參數(shù):ka, kb, kc, kz
  56. //返回參數(shù):
  57. //調(diào)用函數(shù):
  58. //程序說明:
  59. /*
  60.     T--------采樣周期
  61.     Ti-------積分時間
  62.     Td-------微分時間

  63.     Kp = Kp
  64.     Ki = Kp*T/Ti
  65.     Kd = Kp*Td/T

  66.     A = Kp+Ki+Kd = Kp*(1 + T/Ti + Td/T)
  67.     B = Kp+2*Kd = Kp*(1 + 2Td/T)
  68.     C = Kd = Kp*Td/T
  69. *///120,11,0,10
  70. //**********************************************************
  71. void PID_IncSetRatio(u8 kp, u8 ki, u8 kd, u8 kz, PID_TypeDef *ptrPID){
  72.         (* ptrPID).ka = kp + ki + kd;
  73.         (* ptrPID).kb = kp + (2 * kd);
  74.         (* ptrPID).kc = kd;
  75.         (* ptrPID).kz = kz;
  76. }

  77. //**********************************************************
  78. //程序名稱:PID系數(shù)極限設(shè)置 函數(shù)
  79. //入口參數(shù):max_ajst, max_outval, min_outval, *pid_ptr
  80. //出口參數(shù):max_adjust, max_out, min_out
  81. //返回參數(shù):
  82. //調(diào)用函數(shù):
  83. //程序說明:
  84. //**********************************************************
  85. void PID_IncSetRatioLimit(s8 maxAdjust, u8 maxOut, u8 minOut, PID_TypeDef *ptrPID){
  86.         (* ptrPID).maxAdjust = maxAdjust;
  87.         (* ptrPID).maxOut = maxOut;
  88.         (* ptrPID).minOut = minOut;
  89. }

  90. //**********************************************************
  91. //程序名稱:增量式PID 函數(shù)
  92. //入口參數(shù):nonce_error, pid_ptr, out_ptr
  93. //出口參數(shù):*out_ptr
  94. //返回參數(shù):
  95. //調(diào)用函數(shù):
  96. //程序說明:
  97. /*
  98. ////位置式PID控制算式
  99. ////    離散的PID表達式:
  100. ////    U(n) = Kp*{e(n) + (T/Ti)*Sum[e(0)+e(1)...+e(n)] + (Td/T)*[e(n)-e(n-1)]}
  101. ////    U(n) = Kp*e(n) + Ki*Sum[e(0)~e(n)] + Kd*[e(n)-e(n-1)]
  102. ////    說明:
  103. ////    n--------采樣序號,n=0,1,2,…… 。
  104. ////    U(n)-----第n次采樣時刻的計算輸出量
  105. ////    e(n)-----第n次采樣時刻輸入的偏差值
  106. ////    e(n-1)---第n-1次采樣時刻輸入的偏差值
  107. ////    T--------采樣周期
  108. ////    Ti-------積分時間
  109. ////    Td-------微分時間
  110. ////    Kp-------比例系數(shù)
  111. ////    Ki-------積分系數(shù),Ki = Kp*T/Ti
  112. ////    Kd-------微分系數(shù),Kd = Kp*Td/T

  113. 增量式PID控制算式(廣泛應(yīng)用)
  114.     增量式PID控制算法公式:
  115.     dU(n) = U(n)-U(n-1)
  116.     dU(n) = Kp*[e(n)-e(n-1)] + Ki*e(n) + Kd*[e(n)-2*e(n-1)+e(n-2)]
  117.     dU(n) = (Kp+Ki+Kd)*e(n) - (Kp+2*Kd)*e(n-1) + e(n-2)*Kd
  118.     dU(n) = A*e(n) - B*e(n-1) + C*e(n-2)
  119.     說明:
  120.     T--------采樣周期
  121.     Ti-------積分時間
  122.     Td-------微分時間

  123.     Kp = Kp
  124.     Ki = Kp*T/Ti
  125.     Kd = Kp*Td/T

  126.     A = Kp+Ki+Kd = Kp*(1 + T/Ti + Td/T)
  127.     B = Kp+2*Kd = Kp*(1 + 2Td/T)
  128.     C = Kd = Kp*Td/T

  129. 由于單片機的處理速度和ram 資源的限制,一般不采用浮點數(shù)運算,而將所有參數(shù)全部用整
  130. 數(shù),運算到最后再除以一個2的N次方數(shù)據(jù)(相當于移位),作類似定點數(shù)運算,可大大提高
  131. 運算速度,根據(jù)控制精度的不同要求,當精度要求很高時,注意保留移位引起的“余數(shù)”,做
  132. 好余數(shù)補償。
  133. */
  134. //**********************************************************

  135. void PID_IncCompute(s16 offset, u8 *ptrOut, PID_TypeDef *ptrPID){
  136.         s16 outResult = (s16)(* ptrOut);
  137.         s32 median;
  138.         s8 adjust;
  139.         (* ptrPID).e2 = (* ptrPID).e1;
  140.         (* ptrPID).e1 = (* ptrPID).e0;
  141.         (* ptrPID).e0 = offset;
  142.         median = (s32)(* ptrPID).ka * (* ptrPID).e0 -\
  143.                                          (s32)(* ptrPID).kb * (* ptrPID).e1 +\
  144.                                          (s32)(* ptrPID).kc * (* ptrPID).e2;
  145.         median = median >> (* ptrPID).kz;
  146.         if(median < -(* ptrPID).maxAdjust)
  147.                 adjust = -(* ptrPID).maxAdjust;
  148.         else if(median > (* ptrPID).maxAdjust)
  149.                 adjust = (* ptrPID).maxAdjust;
  150.         else
  151.                 adjust = (s8)median;

  152.         outResult += adjust;
  153.         if(outResult > (* ptrPID).maxOut)
  154.                 outResult = (* ptrPID).maxOut;
  155.         else if(outResult < (* ptrPID).minOut)
  156.                 outResult = (* ptrPID).minOut;
  157.         *ptrOut = (u8)outResult;
  158. }        
復制代碼



所有資料51hei提供下載:
PID Proteus.rar (172.39 KB, 下載次數(shù): 392)


評分

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

查看全部評分

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

相關(guān)帖子

回復

使用道具 舉報

12#
ID:228452 發(fā)表于 2023-8-11 22:58 | 只看該作者
MotorControl.hex file included for Proteus simulation
in Proteus go to Design /go to next sheet(page-down) click on CPU/ properties and select
MotorControl.hex
回復

使用道具 舉報

11#
ID:65956 發(fā)表于 2021-6-26 08:13 | 只看該作者
謝謝分享,跟高手學習是一件讓人長進的事
回復

使用道具 舉報

10#
ID:711846 發(fā)表于 2021-6-25 17:43 | 只看該作者
z是什么參數(shù)?duty怎么看想用示波器看一下
回復

使用道具 舉報

9#
ID:368708 發(fā)表于 2020-3-17 15:47 | 只看該作者
世界很安靜 發(fā)表于 2019-12-23 20:33
您好,這個多層圖紙怎么切換?

proteus界面Desig->下拉列表中會出現(xiàn)Rootsheet1和Rootsheet2,這兩個就是來回切換圖紙的。
回復

使用道具 舉報

8#
ID:693716 發(fā)表于 2020-3-9 10:48 | 只看該作者
學習下,這個站長給了這么高的黑比,必須學習
回復

使用道具 舉報

7#
ID:649857 發(fā)表于 2019-12-23 20:33 | 只看該作者
malonglong33 發(fā)表于 2019-6-22 14:01
樓主仿真文件是多層圖紙的需要切換在加載仿真程序

您好,這個多層圖紙怎么切換?
回復

使用道具 舉報

6#
ID:653751 發(fā)表于 2019-12-15 18:14 | 只看該作者
樓主,可以發(fā)一份hex 文件嗎,急需,謝謝啦
回復

使用道具 舉報

5#
ID:501385 發(fā)表于 2019-6-22 14:01 | 只看該作者
sdwxysc 發(fā)表于 2018-10-28 09:14
Proteus仿真圖沒有單片機,仿真不起來。

樓主仿真文件是多層圖紙的需要切換在加載仿真程序
回復

使用道具 舉報

地板
ID:417062 發(fā)表于 2018-10-29 13:56 | 只看該作者
樓主好厲害
回復

使用道具 舉報

板凳
ID:20345 發(fā)表于 2018-10-28 09:14 | 只看該作者
Proteus仿真圖沒有單片機,仿真不起來。
回復

使用道具 舉報

沙發(fā)
ID:110278 發(fā)表于 2018-10-17 15:26 | 只看該作者
正是需要的材料。
回復

使用道具 舉報

樓主
ID:153008 發(fā)表于 2018-10-17 11:51 | 只看該作者
原理圖文件和源程序文件都打不開,能不能從發(fā)一份
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表