简易PID控制算法实现及经典模拟应用

版权申诉
0 下载量 182 浏览量 更新于2024-11-08 收藏 1.81MB RAR 举报
资源摘要信息:"该文件为一个关于PID控制算法的压缩包,名称为PID.rar,它涉及到的标签是控制算法。描述中提到这个文件实现了简易的PID控制算法,这是一种非常经典的控制模拟算法。" PID控制算法是一种在工业控制领域广泛使用的反馈控制算法。它的全称是比例-积分-微分控制(Proportional-Integral-Derivative Control),由三个部分组成:比例(P)、积分(I)和微分(D),这三种控制作用共同决定了控制器的输出,以达到对一个过程变量进行控制的目的。 比例部分主要负责减少系统误差。比例控制的作用是根据当前的误差值(即设定值与实际输出值之间的差)来调整控制器的输出。如果误差大,比例作用产生的控制量也会大,反之则小。但是,仅使用比例控制通常会产生一个静态误差,即系统输出和设定值之间会存在一个固定差值,这个差值无法通过比例控制消除。 积分部分则用来消除这个静态误差。积分控制会累计过去的误差,并对这个累计值进行控制输出。积分作用能够在一定时间范围内消除静态误差,但过强的积分作用可能会导致系统响应速度变慢,甚至产生振荡。 微分部分的作用是预测误差的未来趋势,并根据误差变化的速度进行控制输出,从而提前对误差进行修正。微分控制可以增加系统的阻尼,减少或避免超调,使得系统更加稳定。但是,微分控制对噪声非常敏感,如果系统的噪声较大,可能会影响控制效果。 在实际应用中,PID控制算法往往不是简单的三者直接相加,而是需要根据具体过程的特性进行调节。调节的过程被称为PID调节或PID整定。整定的目的就是要找到合适的比例、积分和微分的参数,使得系统响应速度快、超调小、稳态误差小。 PID控制器在工业控制中的应用非常广泛,它可以用于温度、压力、流量、液位等多个物理量的控制。PID控制算法能够应用在各种不同类型的控制系统中,包括模拟控制和数字控制。 模拟PID控制器是通过电子电路或机械装置来实现PID控制的,而数字PID控制器则是通过计算机或数字信号处理器(DSP)来实现。随着计算机技术的发展,数字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 上传

class Process: def __init__(self, pid, arrival_time, burst_time): self.pid = pid self.arrival_time = arrival_time self.burst_time = burst_time self.waiting_time = 0 self.turnaround_time = 0 self.response_ratio = 0 self.start_time = 0 self.complete_time = 0 def hrrn(processes): n = len(processes) current_time = 0 completed_processes = [] while len(completed_processes) < n: # 计算每个进程的响应比 for p in processes: if p not in completed_processes: waiting_time = current_time - p.arrival_time p.response_ratio = 1 + waiting_time / p.burst_time # 选择响应比最大的进程执行 selected_process = max(processes, key=lambda x: x.response_ratio) selected_process.start_time = current_time selected_process.complete_time = current_time + selected_process.burst_time selected_process.turnaround_time = selected_process.complete_time - selected_process.arrival_time current_time = selected_process.complete_time completed_processes.append(selected_process) return completed_processes # 创建进程列表 processes = [ Process(1, 0, 10), Process(2, 1, 5), Process(3, 2, 8), Process(4, 3, 6), ] # 运行调度算法 completed_processes = hrrn(processes) # 输出结果 total_wait_time = sum([p.waiting_time for p in completed_processes]) total_turnaround_time = sum([p.turnaround_time for p in completed_processes]) total_weighted_turnaround_time = sum([p.turnaround_time / p.burst_time for p in completed_processes]) for p in completed_processes: print( f"Process {p.pid}:到达时间 {p.arrival_time},所需执行时间{p.burst_time},开始时间{p.start_time},结束时间 {p.complete_time},周转时间 {p.turnaround_time},带权周转时间 {p.turnaround_time / p.burst_time:.2f}") print(f"平均周转时间:{total_turnaround_time / len(completed_processes):.2f}") print(f"平均带权周转时间:{total_weighted_turnaround_time / len(completed_processes):.2f}") 解释这段代码的设计思路

2023-06-13 上传