【计算机控制系统课程设计】基于树莓派的智能家居系统

释放双眼,带上耳机,听听看~!

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

1、 需求分析

智能家居作为一个新生产业,处于一个导入期与成长期的临界点,市场消费观念还未形成,但随着智能家居市场推广普及的进一步落实,培育起消费者的使用习惯,智能家居市场的消费潜力必然是巨大的,产业前景光明。 正因为如此,国内优秀的智能家居生产企业愈来愈重视对行业市场的研究,特别是对企业发展环境和客户需求趋势变化的深入研究,一大批国内优秀的智能家居品牌迅速崛起,逐渐成为智能家居产业中的翘楚! 智能家居至今在中国已经历了近12年的发展,从人们最初的梦想,到今天真实的走进我们的生活,经历了一个艰难的过程。

智能家居在中国的发展经历的四个阶段,分别是萌芽期、开创期、徘徊期、融合演变期

1.1萌芽期/智能小区期(1994年-1999年)  

这是智能家居在中国的第一个发展阶段,整个行业还处在一个概念熟悉、产品认知的阶段,这时没有出现专业的智能家居生产厂商,只有深圳有一两家从事美国X-10智能家居代理销售的公司从事进口零售业务,产品多销售给居住国内的欧美用户。

1.2开创期(2000年-2005年)  

国内先后成立了五十多家智能家居研发生产企业,主要集中在深圳、上海、天津、北京、杭州、厦门等地。智能家居的市场营销、技术培训体系逐渐完善起来,此阶段,国外智能家居产品基本没有进入国内市场。

1.3徘徊期(2006-2010年)

  2005年以后,由于上一阶段智能家居企业的野蛮成长和恶性竞争,给智能家居行业带来了极大的负面影响:包括过分夸大智能家居的功能而实际上无法达到这个效果、厂商只顾发展代理商却忽略了对代理商的培训和扶持导致代理商经营困难、产品不稳定导致用户高投诉率。行业用户、媒体开始质疑智能家居的实际效果,由原来的鼓吹变得谨慎,市场销售也几年出来增长减缓甚至部分区域出现了销售额下降的现象。2005年-2007年,大约有20多家智能家居生产企业退出了这一市场,各地代理商结业转行的也不在少数。许多坚持下来的智能家居企业,在这几年也经历了缩减规模的痛苦。正在这一时期,国外的智能家居品牌却暗中布局进入了中国市场,而活跃在市场上的国外主要智能家居品牌都是这一时期进入中国市场的,如罗格朗、霍尼韦尔、施耐德、Control4等。国内部分存活下来的企业也逐渐找到自己的发展方向,例如天津瑞朗,青岛爱尔豪斯,海尔,科道等,用X10,深圳索科特做了空调远程控制,成为工业智控的厂家。

1.4 融合演变期(2011-2020年)  

进入2011年以来,市场明显看到了增长的势头,而且大的行业背景是房地产受到调控。智能家居的放量增长说明智能家居行业进入了一个拐点,由徘徊期进入了新一轮的融合演变期。  接下来的三到五年,智能家居一方面进入一个相对快速的发展阶段,另一方面协议与技术标准开始主动互通和融合,行业并购现象开始出来甚至成为主流。  接下来的五到十年,将是智能家居行业发展极为快速,但也是最不可琢磨的时期,由于住宅家庭成为各行业争夺的焦点市场,智能家居作为一个承接平台成为各方力量首先争夺的目标。谁能最终胜出,我们可以作种种分析,但最终结果,也许只有到时才知。但不管如何发展,这个阶段国内将诞生多家年销售额上百亿元的智能家居企业。

1.5 爆发期

进入到2014年以来,各大厂商已开始密集布局智能家居,尽管从产业来看,业内还没有特别成功的案例显现,这预示着行业发展仍处于探索阶段,但越来越多的厂商开始介入和参与已使得外界意识到,智能家居未来已不可逆转。

目前来看,智能家居经过一年多产业磨合,已正处爆发前夜。业内人士认为,2015年随着合作企业已普遍进入到出成果时刻,智能家居新品将会层出不穷,业内涌现的新案例也会越来越多。

1.6 智能家居现状:

智能家居领域在国内仍存在诸多瓶颈,如:缺乏杀手级应用;标准不统一,包括网络传输标准的不统一以及家电产品之间无法融合;仍然存在技术性问题(包括人机交互技术、云计算、大数据等)、缺乏各家电之间的互联互通;产品价格太高;企业各自为政;产品功能相对单一,产品同质化很严重,功能雷同,创新不足;产品实用性差、用户体验差;安全隐私等问题。

在中国当前的智能家居市场上,已经有一大批国内互联网公司,先后推出了机顶盒、路由器、WIFI插座、智能开关等智能家居产品。但纵观市场,无论是智能化单品,还是构筑智能家居平台和系统,大多数的所谓智能化产品,还停留在“为智能化而智能化”、“为了连接而连接”的层面,一些功能很明显是为了傍上“智能产品”之名而设计,没有找正用户真正的“痛点”,营销噱头远远大于实用性,加上智能家居产品应用场景较为固定,这也导致真正被消费者接受和使用的少之又少。要解决智能家居普及的两个问题,一个是如何让每个家电智能化,二是如何让每个家电互联互通,形成更智能的场景。

当然,不可否认的是,智能家居将成为家电企业下一个竞争的新战场。在智能家居这个新硬件领域,真正可以实现产品市场规模化发展和引领市场潮流的或许还是传统家电企业。目前传统家电行业也正在逐步深入拥抱互联网,产业的繁荣与发展最终也将为用户带来更好的体验。

2、 项目内容

本项目完全基于树莓派,Raspberry Pi 3 的硬件接口通过开发板上的 40 排针 J8 公开。功能包括:

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

2.1 超声波测距,检测是否有人

2.1.1 硬件准备

HC-SR04超声波模块

2.1.2 管脚介绍

【计算机控制系统课程设计】基于树莓派的智能家居系统

VCC,超声波模块电源脚,接5V电源即可
Trig,超声波发送脚,高电平时发送出40KHZ出超声波
Echo,超声波接收检测脚,当接收到返回的超声波时,输出高电平
GND,超声波模块GND

2.1.3 接线
  • 树莓派第2只脚为5V,给超声波模块供电,接VCC
  • 树莓派第39只脚为GND,与超声波模块共地接GND
  • 树莓派第1、3只脚分别为GPIO2和GPIO3,分别作发送和接收用,分别与Trig和Echo相连接。

【计算机控制系统课程设计】基于树莓派的智能家居系统

2.1.4 控制代码(Python2)
1.  #! /usr/bin/python
2.  # -*- coding:utf-8 -*-
3.  import RPi.GPIO as GPIO
4.  import time
5.  def checkdist():
6.          #发出触发信号
7.          GPIO.output(2,GPIO.HIGH)
8.          #保持15us的超声波发射,避免能量太低无法返回
9.          time.sleep(0.000015)
10.         #然后置位2号管脚低电平,即停止发射超声波
11.         GPIO.output(2,GPIO.LOW)
12.         while not GPIO.input(3):
13.                pass
14.         #发现高电平时开时计时
15.         t1 = time.time()
16.         #如果有检测到反射返回的超声波,那么就持续计时,否则就跳出循环,计时结束
17.         while GPIO.input(3):
18.                 pass
19.         #高电平结束停止计时
20.         t2 = time.time()
21.         #返回距离,单位为米
22.         return (t2-t1)*340/2
23. GPIO.setmode(GPIO.BCM)
24. #第3号针,GPIO2
25. GPIO.setup(2,GPIO.OUT,initial=GPIO.LOW)
26. #第5号针,GPIO3
27. GPIO.setup(3,GPIO.IN)
28. time.sleep(2)
29. try:
30.         while True:
31.                 print 'Distance: %0.2f m' %checkdist()
32.                 time.sleep(0.5)
33. except KeyboardInterrupt:
34.         GPIO.cleanup()
2.1.5 效果展示

【计算机控制系统课程设计】基于树莓派的智能家居系统

在实际应用中,我们通过将超声波模块固定于房门口顶部的墙壁上,因为顶部到底部的距离一定,所以当有人来的时候就会阻碍超声波的传输,从而使得测得的距离产生极大的变化。通过下面建立的控制模型进行开关门的执行动作。

【计算机控制系统课程设计】基于树莓派的智能家居系统

2.2 树莓派温度控制

如果树莓派运行负载较高,那么CPU可能会存在过热的风险,为了延长设备寿命,我们需要对树莓派的CPU及其周边设备进行温度控制,方法是通过风控。即通过检测树莓派的温度,然后经由PID算法调节散热风扇电机的输出功率来调节CPU的温度至一个较“健康的”范围。

2.2.1 硬件准备

RK-380PH-4733高速微型直流电机,L298N电机驱动板模块、18650 4800mA锂电池

【计算机控制系统课程设计】基于树莓派的智能家居系统
【计算机控制系统课程设计】基于树莓派的智能家居系统

2.2.2 布线分析

【计算机控制系统课程设计】基于树莓派的智能家居系统

  • 电源部分:
    12v power : 接 7~ 12 v 直流电源,4 节干电池组就可以。接 5v (如树莓派 GPIO口 输出的5v)不知道能不能带动。
    Power GND : 接直流电源地,和树莓派的 GPIO 地。
    5v power:  这个 5v 是输出的,给树莓派供电用的。不推荐使用,因为树莓派和 L298n 最好分开供电。分开供电的话这个脚悬空就行了!

  • 输入部分
    A Enable :  接 GPIO 口 。 电机 A 使能和 PWM 调速。
    Logic Input :  接 4 个 GPIO 口。 上面两个脚 Input1 、Input2 (靠近 A Enable )控制电机 A ; 下面两个脚 Input## 3、Input4 (靠近 B Enable)控制电机 B。
    B Enable : 接 GPIO口。 电机 B 使能和 PWM 调速。

  • 输出部分:
    Output A : 接电机 A 。
    Output B :  接电机 B 。

【计算机控制系统课程设计】基于树莓派的智能家居系统

把 L289N 的直流电源接好,然后把树莓派的 GND 与 L298N 的 GND 连在一起,因为共地后 L298N 才能识别树莓派发送的 IN## 1、IN2 到底是高电平还是低电平。   树莓派的 ## 2、## 3、4 脚分别连到 A Enable、IN1 、IN2 。由控制表可知给 2 脚高电平,3 脚高电平,4 脚低电平,电机就会正转。通过电机带动风扇,用PWM来调节风速,改善树莓派的CPU温度,从而能够实现对温度的定性调节。

2.2.3 控制代码

控制代码分三种,一种改变Kp,在确定Kp的最佳参数为0.192左右之后,调至0.83倍,令Kp=0.16,然后调节Ki从0.01-0.2改变,最后调节至0.05附近最佳,最后确定Kd,

####    Just_Changed_Kp.py   ####
1.    #coding: UTF-8
2.  import RPi.GPIO as GPIO
3.  import time
4.  import sys
5.  
6.  GPIO.setmode(GPIO.BCM)
7.  GPIO.setup(2,GPIO.OUT)
8.  GPIO.setup(3,GPIO.OUT)
9.  GPIO.setup(4,GPIO.OUT)
10. pwm=GPIO.PWM(2,80)
11. pwm.start(20)
12. GPIO.output(3,True)
13. GPIO.output(4,False)
14. file=open("/sys/class/thermal/thermal_zone0/temp")
15. Real_T=float(file.read())/1000
16. file.close()
17. Ideal_T=float(sys.argv[2])
18. Delta=[0.6]
19. Kp=float(sys.argv[1])
20. Ti=100000
21. Td=0
22. Output_PWM=5
23. # times=0
24. def All_of_List(a):
25.     s=0
26.     for i in range(len(a)):
27.         s=s+a[i]
28.     return s
29. 
30. def Real_Temp():
31.     file=open("/sys/class/thermal/thermal_zone0/temp")
32.     global Real_T
33.     Real_T=float(file.read())/1000
34.     file.close()
35. 
36. def Init(): 
37.     Real_Temp()
38.     # global Ideal_T
39.     # Ideal_T=33
40.     global Delta
41.     Delta=[0.5]
42.     global Output_PWM
43.     Output_PWM=5
44. 
45. def update_Output(Time_Gap,Kp):
46.     global Ideal_T
47.     global Delta
48.     global Ti
49.     global Td
50.     global Output_PWM
51.     global Real_T
52.     P=Kp
53.     I=Time_Gap/Ti
54.     D=Td/Time_Gap
55.     Increase=0
56.     Real_Temp()
57.     Delta.append(Real_T-Ideal_T)
58.     # if Delta[-1]>-0.5 and Delta[-1]<0.5:
59.     Increase=P*(Delta[-1] + I * All_of_List(Delta) + D * (Delta[-1]-Delta[-2]))
60.     Output_PWM=Output_PWM+Increase
61.     if Output_PWM>100:
62.         Output_PWM=100
63.     elif Output_PWM<10:
64.         Output_PWM=10
65. 
66. Usage_time=[]
67. # times=0
68. 
69. def Find_Kp(Kp):
70.     times=0
71.     while True:
72.         times=times+1
73.         # if(times>100):
74.         # times=0
75.         # Init()
76.         Time_Gap=1
77.         time.sleep(Time_Gap)
78.         if Delta[-1]<0.4 and Delta[-1]>-0.4 and times>100:
79.             Usage_time.append(times)
80.             print times
81.             break
82.         update_Output(Time_Gap,Kp)
83.         global Output_PWM
84.         pwm.ChangeDutyCycle(Output_PWM)
85.         print "%d:Temp %0.3f,Speed %0.3f"%(times,Real_T,Output_PWM)
86.     pwm.ChangeDutyCycle(10)
87. # delay=0
88. 
89.     # pwm.ChangeDutyCycle(0)
90. #TryTime=10
91. #while TryTime>0:
92. #    Real_Temp()
93.  #   while Real_T<32:
94.   #      pass
95.     # time.sleep(1)
96. #for i in range(2,6):
97. #   Kp=float(i/10)
98. print "Now the Kp:%f0.3"%Kp
99.  #   Init()
100.    #   while True:
101.    #   Real_Temp()
102.    #   while Real_T<32:
103.    #       pass
104.    
105.    Find_Kp(Kp)
106.        #break
107.    print "/n"
108.      #  Kp=1.2*Kp
109.      #  TryTime=TryTime-1
####    Just_Changed_Ki.py   ####
1.   #coding: UTF-8
2.  import RPi.GPIO as GPIO
3.  import time
4.  import sys
5.  
6.  GPIO.setmode(GPIO.BCM)
7.  GPIO.setup(2,GPIO.OUT)
8.  GPIO.setup(3,GPIO.OUT)
9.  GPIO.setup(4,GPIO.OUT)
10. pwm=GPIO.PWM(2,80)
11. pwm.start(20)
12. GPIO.output(3,True)
13. GPIO.output(4,False)
14. file=open("/sys/class/thermal/thermal_zone0/temp")
15. Real_T=float(file.read())/1000
16. file.close()
17. Ideal_T=float(sys.argv[2])
18. Delta=[0.6]
19. Kp=0.16
20. Ti=float(sys.argv[1])
21. Td=0
22. Output_PWM=5
23. # times=0
24. def All_of_List(a):
25.     s=0
26.     for i in range(len(a)):
27.         s=s+a[i]
28.     return s
29. 
30. def Real_Temp():
31.     file=open("/sys/class/thermal/thermal_zone0/temp")
32.     global Real_T
33.     Real_T=float(file.read())/1000
34.     file.close()
35. 
36. def Init(): 
37.     Real_Temp()
38.     # global Ideal_T
39.     # Ideal_T=33
40.     global Delta
41.     Delta=[0.5]
42.     global Output_PWM
43.     Output_PWM=5
44. 
45. def update_Output(Time_Gap,Kp):
46.     global Ideal_T
47.     global Delta
48.     global Ti
49.     global Td
50.     global Output_PWM
51.     global Real_T
52.     P=Kp
53.     I=Time_Gap/Ti
54.     D=Td/Time_Gap
55.     Increase=0
56.     Real_Temp()
57.     Delta.append(Real_T-Ideal_T)
58.     # if Delta[-1]>-0.5 and Delta[-1]<0.5:
59.     Increase=P*(Delta[-1] + I * All_of_List(Delta) + D * (Delta[-1]-Delta[-2]))
60.     Output_PWM=Output_PWM+Increase
61.     if Output_PWM>100:
62.         Output_PWM=100
63.     elif Output_PWM<10:
64.         Output_PWM=10
65. 
66. Usage_time=[]
67. # times=0
68. 
69. def Find_Ki(Kp):
70.     times=0
71.     while True:
72.         times=times+1
73.         # if(times>100):
74.         # times=0
75.         # Init()
76.         Time_Gap=1
77.         time.sleep(Time_Gap)
78.         if Delta[-1]<0.4 and Delta[-1]>-0.4 and times>150:
79.             Usage_time.append(times)
80.             print times
81.             break
82.         update_Output(Time_Gap,Kp)
83.         global Output_PWM
84.         pwm.ChangeDutyCycle(Output_PWM)
85.         print "%d:Temp %0.3f,Speed %0.3f"%(times,Real_T,Output_PWM)
86.     pwm.ChangeDutyCycle(10)
87. # delay=0
88. 
89.     # pwm.ChangeDutyCycle(0)
90. #TryTime=10
91. #while TryTime>0:
92. #    Real_Temp()
93.  #   while Real_T<32:
94.   #      pass
95.     # time.sleep(1)
96. #for i in range(2,6):
97. #   Kp=float(i/10)
98. print "Now the Ki:%0.3f"%(1/Ti)
99.  #   Init()
100.    #   while True:
101.    #   Real_Temp()
102.    #   while Real_T<32:
103.    #       pass
104.    
105.    Find_Ki(Kp)
106.        #break
107.    print "/n"
108.      #  Kp=1.2*Kp
109.      #  TryTime=TryTime-1
####    Just_Changed_Kd.py   ####
1.  #coding: UTF-8
2.  import RPi.GPIO as GPIO
3.  import time
4.  import sys

5.  GPIO.setmode(GPIO.BCM)
6.  GPIO.setup(2,GPIO.OUT)
7.  GPIO.setup(3,GPIO.OUT)
8.  GPIO.setup(4,GPIO.OUT)
9.  pwm=GPIO.PWM(2,80)
10. pwm.start(20)
11. GPIO.output(3,True)
12. GPIO.output(4,False)
13. file=open("/sys/class/thermal/thermal_zone0/temp")
14. Real_T=float(file.read())/1000
15. file.close()
16. Ideal_T=float(sys.argv[2])
17. Delta=[0.6]
18. Kp=0.16
19. Ti=0.05
20. Td=float(sys.argv[1])
21. Output_PWM=5
22. # times=0
23. def All_of_List(a):
24. s=0
25. for i in range(len(a)):
26. s=s+a[i]
27. return s

28. def Real_Temp():
29. file=open("/sys/class/thermal/thermal_zone0/temp")
30. global Real_T
31. Real_T=float(file.read())/1000
32. file.close()

33. def Init():
34. Real_Temp()
35. # global Ideal_T
36. # Ideal_T=33
37. global Delta
38. Delta=[0.5]
39. global Output_PWM
40. Output_PWM=5

41. def update_Output(Time_Gap,Kp):
42. global Ideal_T
43. global Delta
44. global Ti
45. global Td
46. global Output_PWM
47. global Real_T
48. P=Kp
49. I=Time_Gap/Ti
50. D=Td/Time_Gap
51. Increase=0
52. Real_Temp()
53. Delta.append(Real_T-Ideal_T)
54. # if Delta[-1]>-0.5 and Delta[-1]<0.5:
55. Increase=P*(Delta[-1] + I * All_of_List(Delta) + D * (Delta[-1]-Delta[-2]))
56. Output_PWM=Output_PWM+Increase
57. if Output_PWM>100:
58. Output_PWM=100
59. elif Output_PWM<10:
60. Output_PWM=10

61. Usage_time=[]
62. # times=0

63. def Find_Kp(Kp):
64. times=0
65. while True:
66. times=times+1
67. # if(times>100):
68. # times=0
69. # Init()
70. Time_Gap=1
71. time.sleep(Time_Gap)
72. if Delta[-1]<0.4 and Delta[-1]>-0.4 and times>150:
73. Usage_time.append(times)
74. print times
75. break
76. update_Output(Time_Gap,Kp)
77. global Output_PWM
78. pwm.ChangeDutyCycle(Output_PWM)
79. print "%d:Temp %0.3f,Speed %0.3f"%(times,Real_T,Output_PWM)
80. pwm.ChangeDutyCycle(10)
81. # delay=0

82. # pwm.ChangeDutyCycle(0)
83. #TryTime=10
84. #while TryTime>0:
85. #    Real_Temp()
86. #   while Real_T<32:
87. #      pass
88. # time.sleep(1)
89. #for i in range(2,6):
90. #   Kp=float(i/10)
91. print "Now the Ki:%0.3f"%(1/Ti)
92. #   Init()
93. #   while True:
94. #   Real_Temp()
95. #   while Real_T<32:
96. #       pass

97. Find_Kp(Kp)
98. #break
99. print "/n"
100.    #  Kp=1.2*Kp
101.    #  TryTime=TryTime-1
2.2.4 获取的数据和图像及数据处理

数据见附件,log可以直接查看,mat后缀文件为Matlab变量空间形式。下面是图片附图:

第一组:改变Kp
【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

第二组:改变Ki

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

上图为后来补测的,电池电压较低,数据不是很准确,应该丢弃!

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

第三组:改变Kd

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

【计算机控制系统课程设计】基于树莓派的智能家居系统

在实验过程中使用18650锂电池会随着时间的推移而逐渐降低电压。所以后面的数据相对前面没那么准确。因为电机同样的占空比下输出的功率是不一样的。不过我们可以大致看出一个趋势,因为相同的一组数据,基本上都是在差不多同一个时间范围内测试的。

首先我们分析Kp也就是比例系数。从上面的数据我们可以看到,其接近平稳的程度是随着从0.15到0.6的过程中先上后下的。最终稳定下的风速占空比应该是30%到40%之间。所以我们可以很清晰的看到Kp在0.2左右的时候有比较好的效果,而且其最大超调量变比较小。

而对于积分系数Ki由于其电量不是非常足。所以稍有波动。但是也大概看出在0.05左右有对静差调节的最好效果。

而对于微分系数Kd的调节,由于是第二天进行的实验,环境温度变化较大,并且电池经过一晚的充电,相同占空比的输出功率产生了变化。所以仅参考趋势,不对具体的数据做过多要求,另外由于树莓派CPU的温度变化稍有延迟,所以没法精确地读出细微的温度变化趋势。不过仍然可以看到,在Kd=0.2附近,即将形成第三个波峰,说明其稳定速度是所有的参数中最快的。所以我们简单取Kd=0.2。
最后的结果是:Kp=0.192,Ki=0.05,Kd=0.2。图像本来应该最后的输出风速趋于稳定的,但是因为电池电量有限,如果等到最后输出稳定,进行试验的时间会延长太多,所以请老师见谅了。

3、 技术难点(PID控制过程)

3.1 目的:

树莓派工作过程中温度会升高,为了保持正常的工作温度:如34℃,需要根据温度调节散热风扇的转速加强或减弱散热作用以保证恒定的温度。

3.2原理:

在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、…)。PID是比例、积分、微分的缩写,将偏差的比例(P)、积分(I)和微分(D)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器。

【计算机控制系统课程设计】基于树莓派的智能家居系统

通过PID算法进行负反馈调节,输入当前温度,通过PID算法得出所需转速,然后进行实时调控,确保温度恒定在一定值。
PID控制器的控制规律为:

【计算机控制系统课程设计】基于树莓派的智能家居系统

比例环节的作用是对偏差瞬间做出快速反应。偏差一旦产生,控制器立即产生控制作用,使控制量向减少偏差的方向变化。控制作用的强弱取决于比例系数KP, KP越大,控制越强,但过大的KP会导致系统震荡,破坏系统的稳定性。

积分环节的作用是把偏差的积累作为输出。在控制过程中,只要有偏差存在,积分环节的输出就会不断增大。直到偏差e(t)=0,输出的u(t)才可能维持在某一常量,使系统在给定值r(t)不变的条件下趋于稳态。积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数T I 越大,积分的积累作用越弱。增大积分常数T I 会减慢静态误差的消除过程,但可以减少超调量,提高系统的稳定性。所以,必须根据实际控制的具体要求来确定TI 。

微分环节的作用是阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化得越快,微分控制器的输出越大,并能在偏差值变大之前进行修正。微分作用的引入,将有助于减小超调量,克服震荡,使系统趋于稳定。但微分的作用对输入信号的噪声很敏感,对那些噪声大的系统一般不用微分,或在微分起作用之前先对输入信号进行滤波。适当地选择微分常数TD ,可以使微分的作用达到最优。

由于计算机的出现,计算机进入了控制领域。人们将模拟PID 控制规律引入到计算机中来。由于计算机控制是一种采样控制,它只能根据采样许可的偏差计算控制量,而不能象模拟控制那样连续输出控制量,进行连续控制。由于这一特点,公式中的积分和微分项不能直接使用,必须进行离散化处理。离散化处理的方法为:以T 作为采样周期,k 作为采样序号,则离散采样时间kT 对应着连续时间 t,用求和的形式代替积分,用增量的形式代替微分,可将其写成如下形式:

【计算机控制系统课程设计】基于树莓派的智能家居系统

如果采样周期取得足够小,则以上近似计算可获得足够精确的结果,离散控制过程与连续控制过程十分接近。三个参数要综合考虑,一般先将K I, KD设为0,调好KP,达到基本的响应速度和误差,再加上K I,,使误差为0,这时再加入KD,三个参数要反复调试,最终达到较好的结果。

在实际的应用中,更多的是通过凑试法来确定PID的参数。增大比例系数KP,一般将加快系统的响应,在有静差的情况下有利于减小静差,但是过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。增大积分时间K I,有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。增大微分时间KD有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。

PID参数的设定可按如下确定:
参数整定找最佳,从小到大顺序查;先是比例后积分,最后再把微分加;曲线振荡很频繁,比例度盘要放大;曲线漂浮绕大湾,比例度盘往小扳;曲线偏离回复慢,积分时间往下降;曲线波动周期长,积分时间再加长;曲线振荡频率快,先把微分降下来;动差大来波动慢。微分时间应加长;理想曲线两个波,前高后低;一看二调多分析,调节质量不会低。
具体该温度控制系统的参数确定方法如下:

  • ⑴ 让调节器参数积分系数S0=0,实际微分系数k=0,控制系统投入闭环运行,由小到大改变比例系数S1,让扰动信号作阶跃变化,观察控制过程,直到获得满意的控制过程为止。
  • ⑵ 取比例系数S1为当前的值乘以0.83,由小到大增加积分系数S0,同样让扰动信号作阶跃变化,直至求得满意的控制过程。
  • (3) 积分系数S0保持不变,改变比例系数S1,观察控制过程有无改善,如有改善则继续调整,直到满意为止。否则,将原比例系数S1增大一些,再调整积分系数S0,力求改善控制过程。如此反复试凑,直到找到满意的比例系数S1和积分系数S0为止。
  • ⑷ 引入适当的实际微分系数k和实际微分时间TD,此时可适当增大比例系数S1和积分系数S0。和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止

注意:仿真系统所采用的PID调节器与传统的工业 PID调节器有所不同,各个参数之间相互隔离,互不影响,因而用其观察调节规律十分方便。

PID参数是根据控制对象的惯量来确定的。大惯量如:大烘房的温度控制,一般P可在10以上,I=3-10,D=1左右。小惯量如:一个小电机带 一水泵进行压力闭环控制,一般只用PI控制。P=1-10,I=0.1-1,D=0,这些要在现场调试时进行修正的。 本控制对象属于小惯量,故选择时根据小惯量的参数选择开始选择调试。

【转自慕课】https://www.imooc.com

Python

异常:存储MYSQL转义数据保证数据存储的准确性...

2022-3-3 4:56:03

Python

Python 的多进程编程(二)

2022-3-3 5:00:49

搜索