PID温度控制算法实现及C语言程序示例

版权申诉
5星 · 超过95%的资源 1 下载量 32 浏览量 更新于2024-10-04 收藏 43KB RAR 举报
资源摘要信息:"PID控制算法是工业控制领域中应用最为广泛的反馈控制算法之一。PID是比例(Proportional)、积分(Integral)、微分(Derivative)三个英文单词的首字母缩写,分别代表了控制过程中三个重要的调整因素。PID控制算法通过这三个因素的组合调整,来实现对温度等物理量的精确控制。 在温度控制领域,PID控制器可以有效地将温度维持在设定的目标值附近,通过不断检测当前温度与目标温度之间的差值(偏差),并计算出一个控制量来调整加热器或冷却器的功率,以达到调节温度的目的。PID控制器的核心在于如何精确计算出这个控制量,这涉及到比例、积分、微分三个环节的细致调整。 比例环节(P)主要负责依据偏差的大小和方向进行调整,偏差越大,调整作用越强;积分环节(I)负责消除系统长时间积累的偏差,它关注的是偏差随时间的累积效应;微分环节(D)则是预测偏差的趋势,对系统可能的过冲进行提前抑制。这三者的合理结合,使得PID控制器能够迅速而准确地响应系统的动态变化,减少超调和震荡,提高系统的稳定性和控制的精确性。 该压缩包文件名“pid程序”暗示了压缩包内应该包含了实现PID温度控制功能的C语言源代码。在编写PID控制程序时,通常需要完成以下几个主要步骤: 1. 初始化PID控制器的三个参数(比例系数P、积分系数I、微分系数D)以及系统的其他相关参数,如采样时间、最大最小输出限制等。 2. 在主控循环中不断读取当前温度值,并计算出温度偏差。 3. 根据PID算法计算出控制量,这个量代表了需要对加热器或冷却器施加多少功率。 4. 将计算出的控制量施加到控制对象上,如调节加热器的功率。 5. 对PID控制参数进行调整,以适应系统特性的变化或实现更优的控制效果。 PID控制程序的编写需要具备一定的编程基础,对算法有深入理解,并能够结合具体硬件进行调试。在实际应用中,还需要对PID控制器进行调试和优化,以适应不同的工作条件和目标精度要求。通过调整PID参数,可以在不同的应用场合实现快速响应、高精度控制和良好的稳定性。 总之,PID温度控制程序是工业自动化和智能控制领域中不可或缺的部分,它能够通过精确的算法调整,确保系统的温度稳定在一个理想的范围内,对于提高产品质量、节约能源、保障设备安全等方面具有重要作用。"

void Motor_Control() { /* switch(uStateSwicth) { case StopSwitch: // 停车 { xStatus = 0; yStatus = 0; xCarParam.Speed_X = 0; xCarParam.Speed_Y = 0; xCarParam.Speed_Z = 0; xCarParam.EncoderSumY = 0; xCarParam.EncoderSumX = 0; xCarParam.CarDistanceX = 0; xCarParam.CarDistanceY = 0; break; } case CascadeSwitch: // 小车控制速度 { SpeedX_Control(); SpeedY_Control(); break; } } */ //=================EndSwitch================================= Position_PID(&IMU,xCarParam.yaw,tarYaw); xCarParam.Speed_Z = IMU.result; xCarParam.Speed_Y = 0; xCarParam.Speed_X = 0; // 三个速度限幅函数 xCarParam.Speed_X = LimitProtect(SpeedMaxX,-SpeedMaxX,xCarParam.Speed_X); xCarParam.Speed_Y = LimitProtect(SpeedMaxY,-SpeedMaxY,xCarParam.Speed_Y); xCarParam.Speed_Z = LimitProtect(SpeedMaxZ,-SpeedMaxZ,xCarParam.Speed_Z); // 计算占空比 motor[0].duty = xCarParam.Speed_Y + xCarParam.Speed_X + xCarParam.Speed_Z; motor[1].duty = xCarParam.Speed_Y - xCarParam.Speed_X + xCarParam.Speed_Z; motor[2].duty = xCarParam.Speed_Y - xCarParam.Speed_X - xCarParam.Speed_Z; motor[3].duty = xCarParam.Speed_Y + xCarParam.Speed_X - xCarParam.Speed_Z; // 增量式PID 自己有限幅函数 Increment_PID(&(motor[0].pid),encoder_data_quaddec[0],motor[0].duty); Increment_PID(&(motor[1].pid),encoder_data_quaddec[1],motor[1].duty); Increment_PID(&(motor[2].pid),encoder_data_quaddec[2],motor[2].duty); Increment_PID(&(motor[3].pid),encoder_data_quaddec[3],motor[3].duty); // 电机调速 setMotorDuty(&motor[0],motor[0].pid.result); setMotorDuty(&motor[1],motor[1].pid.result); setMotorDuty(&motor[2],motor[2].pid.result); setMotorDuty(&motor[3],motor[3].pid.result); }

2023-07-17 上传

import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import matplotlib.pyplot as plt # 定义RBF神经网络的类 class RBFNetwork(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RBFNetwork, self).__init__() # 初始化输入层,隐含层,输出层的节点数 self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重矩阵和偏置向量 self.W1 = nn.Parameter(torch.randn(input_size, hidden_size)) # 输入层到隐含层的权重矩阵 self.b1 = nn.Parameter(torch.randn(hidden_size)) # 隐含层的偏置向量 self.W2 = nn.Parameter(torch.randn(hidden_size, output_size)) # 隐含层到输出层的权重矩阵 self.b2 = nn.Parameter(torch.randn(output_size)) # 输出层的偏置向量 def forward(self,x): # 前向传播过程 x = torch.from_numpy(x).float() # 将输入向量转换为张量 x = x.view(-1, self.input_size) # 调整输入向量的形状,使其与权重矩阵相匹配 h = torch.exp(-torch.cdist(x, self.W1.t()) + self.b1) # 计算隐含层的输出值,使用高斯径向基函数作为激活函数 y = F.linear(h, self.W2.t(), self.b2) # 计算输出层的输出值,使用线性函数作为激活函数 return y #定义pid控制器 class Pid(): def __init__(self, exp_val, kp, ki, kd): self.KP = kp self.KI = ki self.KD = kd self.exp_val = exp_val self.now_val = 0 self.sum_err = 0 self.now_err = 0 self.last_err = 0 def cmd_pid(self): self.last_err = self.now_err self.now_err = self.exp_val - self.now_val self.sum_err += self.now_err self.now_val = self.KP * (self.exp_val - self.now_val) \ + self.KI * self.sum_err + self.KD * (self.now_err - self.last_err) return self.now_val def err_pid(self): self.last_err = self.now_err self.now_err = self.exp_val - self.now_val self.sum_err += self.now_err self.p_err = self.exp_val - self.now_val self.i_err = self.sum_err self.d_err = self.now_err - self.last_err self.now_val = self.KP * (self.exp_val - self.now_val) \ + self.KI * self.sum_err + self.KD * (self.now_err - self.last_err) return self.p_err, self.i_err, self.d_err rbf_net = RBFNetwork(3,10,4) pid_val = [] #对pid进行初始化,目标值是1000 ,p=0.1 ,i=0.15, d=0.1 A_Pid = Pid(1000, 0.1, 0.1, 0.1) # 然后循环100次把数存进数组中去 for i in range(0, 100): input_vector = np.array(A_Pid.err_pid()) output_vector = rbf_net(input_vector) output_vector = output_vector.reshape(4,1) A_Pid = Pid(1000, output_vector[0], output_vector[1], output_vector[2]) pid_val.append(A_Pid.cmd_pid())

2023-06-06 上传