您的位置 首页 编程

根据AVR ATMega16 的PID 操控算法程序

最近由于有些时间,于是想起了做一个PID设计,在网上收集了不少关于PID控制的理论,于是计划用mega16L做一个PID测试程序,发现一些意想不到…

最近因为有些时刻,所以想起了做一个PID规划,在网上收集了不少关于PID操控的理论,所以方案用mega16L做一个PID测验程序,发现一些意想不到的差错,不知各位同仁是否有遇到与我的相似的现象:我界说了一个PID结构体,在初始化的时分无法把每个元素的初始化值设置为0(见下面的仿真图),并且,PID结构体中的部分参数是应该不变的,在整个PID运算中,可是不应该改变的参数却在PID运算发生了改变,不知道是什么原因,到现在也无法查出原因。有爱好的朋友能够一同参加评论或有经历的朋友 给与相关协助,谢谢!
具体的代码和仿真状况如下:(我的硬件体系是本站的min Mega16/32 + JTAG ICE)

  1. #include “config.h”
  2. struct _PID
  3. {
  4. float PVn; //反应信号变量
  5. float SPn; //设定值
  6. float Mn; //PID运算成果
  7. float Kc; //份额系数
  8. float Ts; //采样时刻(ms)
  9. float Ti; //积分时刻(ms)
  10. float Td; //微分时刻(ms)
  11. float Mx; //积分项调整参数
  12. float PVn_1;//前一次反应变量
  13. float MPn; //份额项的成果值
  14. float MIn; //积分项的成果值
  15. float MDn; //微分项的成果值
  16. };
  17. struct _PID *myPID;
  18. void init_myPID(void);
  19. void init_ports(void);
  20. void init_device(void);
  21. float MPn_value(struct _PID *PID);
  22. float MIn_value(struct _PID *PID);
  23. float MDn_value(struct _PID *PID);
  24. float Mx_value(struct _PID *PID);
  25. float Mn_value(struct _PID *PID);
  26. void main (void)
  27. {
  28. init_device();
  29. init_myPID();
  30. myPID->SPn = 155.5;
  31. myPID->Kc = 13.2;
  32. myPID->Ts = 0.2;
  33. myPID->Ti = 600.0;
  34. myPID->Td = 0.0;
  35. myPID->PVn = 108.2;
  36. while(1)
  37. {
  38. myPID->MPn = MPn_value(myPID);
  39. myPID->MDn = MDn_value(myPID);
  40. myPID->Mx = Mx_value(myPID);
  41. myPID->MIn = MIn_value(myPID);
  42. myPID->Mn = Mn_value(myPID);
  43. myPID->PVn_1 = myPID->PVn;
  44. }
  45. }
  46. /******************************************************************************/
  47. void init_myPID(void)
  48. {
  49. myPID->PVn = 0.0;
  50. myPID->SPn = 0.0;
  51. myPID->Mn = 0.0;
  52. myPID->Kc = 0.0;
  53. myPID->Ts = 0.0;
  54. myPID->Ti = 0.0;
  55. myPID->Td = 0.0;
  56. myPID->Mx = 0.0;
  57. myPID->PVn_1 = 0.0;
  58. myPID->MPn = 0.0;
  59. myPID->MIn = 0.0;
  60. myPID->MDn = 0.0;
  61. }
  62. //——————————————————————————
  63. void init_ports(void)
  64. {
  65. PORTA = 0x00; //If ADC Function was be used,the PORTA could`t set bit 1
  66. DDRA = 0x00; //the port set input mode.
  67. PORTB = 0x00;
  68. DDRB = 0x00;
  69. PORTC = 0x00; //m103 output only
  70. DDRC = 0x00;
  71. PORTD = 0x00;
  72. DDRD = 0x00;
  73. }
  74. //——————————————————————————
  75. void init_device(void)
  76. {
  77. CLI();
  78. init_ports();
  79. MCUCR = 0x00; //Set Power control(State:Close)
  80. GICR = 0x00; //Set boot guide(State:Close).
  81. SEI(); //re-enable interrupts
  82. //all peripherals are now initialized
  83. }
  84. // 核算 份额项的值
  85. //——————————————————————————
  86. float MPn_value(struct _PID *PID)
  87. {
  88. float myMPn = 0.0;
  89. myMPn = PID->Kc *( PID->SPn – PID->PVn);
  90. return myMPn;
  91. }
  92. //核算积分项的值
  93. //——————————————————————————
  94. float MIn_value(struct _PID *PID)
  95. {
  96. float myMIn = 0.0;
  97. myMIn = PID->Kc*(PID->Ts/PID->Ti)*(PID->SPn – PID->PVn) + PID->Mx;
  98. return myMIn;
  99. }
  100. //核算微分项的值
  101. //——————————————————————————
  102. float MDn_value(struct _PID *PID)
  103. {
  104. float myMDn = 0.0;
  105. myMDn = PID->Kc * (PID->Td/PID->Ts) * (PID->PVn_1 – PID->PVn);
  106. return myMDn;
  107. }
  108. //核算PID的成果
  109. //——————————————————————————
  110. float Mn_value(struct _PID *PID)
  111. {
  112. float myMn = 0.0;
  113. myMn = PID->MPn + PID->MIn + PID->MDn;
  114. return myMn;
  115. }
  116. //核算积分项的调整值
  117. //——————————————————————————
  118. float Mx_value(struct _PID *PID)
  119. {
  120. float myMx = 0.0;
  121. if(PID->Mn > 1.0)
  122. {
  123. myMx = 1.0 – (PID->MPn + PID->MDn);
  124. }
  125. else if(PID->Mn < 0.0)
  126. {
  127. myMx = -(PID->MPn + PID->MDn);
  128. }
  129. return myMx;
  130. }

运转到PID初始化函数:void init_myPID(void)时的仿真成果如下:无法悉数初始化为0

运转到:
myPID->SPn = 155.5;
myPID->Kc = 13.2;
myPID->Ts = 0.2;
myPID->Ti = 600.0;
myPID->Td = 0.0;
myPID->PVn = 108.2;

从头赋值后,部分参数Ts并不为0.2

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/266550.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部