找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8459|回复: 12
打印 上一主题 下一主题
收起左侧

[原创]开源51单片机PID电机调速Proteus仿真与源码

  [复制链接]
跳转到指定楼层
楼主
本代码采用Proteus仿真,采用51单片机模拟PWM,用定时器获取电机转速信息,用PID算法控制转速,转速、PID都可以用按钮设置,LCD显示屏显示出电机的转速、差值、设定值、PID,并可以粗调跟微调,还有闪烁提示,用来指示当前的设置项目。

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

不按设定键直接调整的是设定速度值因为速度值是以周期形式调整,所以速度值越小,转速越高,2秒钟无操作退出设置模式,非设置模式调节转速

单片机源程序如下:
  1. //************************项目信息**************************
  2. //项目名称:
  3. //客户名称:
  4. //************************文件信息**************************
  5. //文件名称:pi.c
  6. //作    者:Lebo
  7. //文件版本:
  8. //校 验 和:
  9. //************************硬件信息**************************
  10. //目标器件:
  11. //源 时 钟:
  12. //UCBA型号:
  13. //************************平台信息**************************
  14. //开发环境:
  15. //烧录环境:
  16. //配置内容:
  17. //************************功能信息**************************
  18. //程序功能:
  19. //函数列表:
  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初始化 函数
  32. //入口参数:*ptrPID
  33. //出口参数:e0, e1, e2, ka, kb, kc, kz, max_adjust, max_out, min_out
  34. //返回参数:
  35. //调用函数:
  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系数设置 函数
  54. //入口参数:kp, ki, kd, z, *pid_ptr
  55. //出口参数:ka, kb, kc, kz
  56. //返回参数:
  57. //调用函数:
  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系数极限设置 函数
  79. //入口参数:max_ajst, max_outval, min_outval, *pid_ptr
  80. //出口参数:max_adjust, max_out, min_out
  81. //返回参数:
  82. //调用函数:
  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 函数
  92. //入口参数:nonce_error, pid_ptr, out_ptr
  93. //出口参数:*out_ptr
  94. //返回参数:
  95. //调用函数:
  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-------比例系数
  111. ////    Ki-------积分系数,Ki = Kp*T/Ti
  112. ////    Kd-------微分系数,Kd = Kp*Td/T

  113. 增量式PID控制算式(广泛应用)
  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 资源的限制,一般不采用浮点数运算,而将所有参数全部用整
  130. 数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高
  131. 运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做
  132. 好余数补偿。
  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, 下载次数: 361)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:153008 发表于 2018-10-17 11:51 | 只看该作者
原理图文件和源程序文件都打不开,能不能从发一份
回复

使用道具 举报

板凳
ID:110278 发表于 2018-10-17 15:26 | 只看该作者
正是需要的材料。
回复

使用道具 举报

地板
ID:20345 发表于 2018-10-28 09:14 | 只看该作者
Proteus仿真图没有单片机,仿真不起来。
回复

使用道具 举报

5#
ID:417062 发表于 2018-10-29 13:56 | 只看该作者
楼主好厉害
回复

使用道具 举报

6#
ID:501385 发表于 2019-6-22 14:01 | 只看该作者
sdwxysc 发表于 2018-10-28 09:14
Proteus仿真图没有单片机,仿真不起来。

楼主仿真文件是多层图纸的需要切换在加载仿真程序
回复

使用道具 举报

7#
ID:653751 发表于 2019-12-15 18:14 | 只看该作者
楼主,可以发一份hex 文件吗,急需,谢谢啦
回复

使用道具 举报

8#
ID:649857 发表于 2019-12-23 20:33 | 只看该作者
malonglong33 发表于 2019-6-22 14:01
楼主仿真文件是多层图纸的需要切换在加载仿真程序

您好,这个多层图纸怎么切换?
回复

使用道具 举报

9#
ID:693716 发表于 2020-3-9 10:48 | 只看该作者
学习下,这个站长给了这么高的黑比,必须学习
回复

使用道具 举报

10#
ID:368708 发表于 2020-3-17 15:47 | 只看该作者
世界很安静 发表于 2019-12-23 20:33
您好,这个多层图纸怎么切换?

proteus界面Desig->下拉列表中会出现Rootsheet1和Rootsheet2,这两个就是来回切换图纸的。
回复

使用道具 举报

11#
ID:711846 发表于 2021-6-25 17:43 | 只看该作者
z是什么参数?duty怎么看想用示波器看一下
回复

使用道具 举报

12#
ID:65956 发表于 2021-6-26 08:13 | 只看该作者
谢谢分享,跟高手学习是一件让人长进的事
回复

使用道具 举报

13#
ID:228452 发表于 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
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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