
简介这是一份面向自动化、电气工程及测控专业学生的《计算机控制技术》复习资料PDF聚焦课程核心考点与典型习题的梳理适合期末备考、考研复习或课堂同步巩固。资源包内仅含1个PDF文件整体约44KB篇幅轻巧便于在手机或电脑上随时翻阅内容以问答与要点填空的形式覆盖数字控制方式、采样周期与量化误差、PID调节结构、A/D与D/A转换器、数字滤波、现场总线、抗干扰与接地等章节重点。目前已有805人学习下载在同类课程资料中具备一定认可度。读者可借此快速梳理采样定理、零阶保持器相频特性、离散系统稳定性判断、A/D转换精度与分辨率计算、静态误差系数等易考知识点也可对照典型题目检验对SCC计算机作用、键盘锁定技术、LCD交变电压驱动、小功率直流电机转向控制等细节的掌握程度适合作为考前查漏补缺的便携提纲。1. 为什么搜计算机控制技术.pdf 的人最后都在补闭环离散化很多人把计算机控制技术.pdf 当成一个下载目标下载完却发现真正难的是把 PID、状态反馈、滤波器塞进采样周期只有几毫秒的控制器里。计算机控制技术不是把连续域公式抄进代码而是处理连续对象、离散计算、量化误差和时序抖动之间的缝隙。温度箱、电机速度环、机械臂关节、流量阀只要执行器由 MCU、工控机或 PLC 驱动就会遇到这套问题。适合自动化、嵌入式、仪器仪表和机器人方向的从业者也适合刚学完自控原理、准备把 MATLAB 仿真搬到板子上的人。PDF 更像目录真正要做的是把模型、采样、代码、调试记录串成一条可复现路径。2. 计算机控制技术的数学底座Z 变换、零阶保持器和差分方程把控制律写成代码之前先要承认一件事计算机看到的世界是离散的。传感器在每个采样时刻给一个数执行器在下一个采样时刻之前保持上一个输出控制器在两次采样之间做有限次计算。连续域里理所当然的微分和积分到了代码里都变成差分和累加模型错一拍参数就会在现场变得很难调。2.1 连续对象进计算机前先过采样和量化这两关连续对象仍然按物理规律变化但接口把它切成了采样序列。ADC 有位数限制12 位 ADC 测 0 到 10 V最小分辨约 2.44 mV对温度慢过程可以忽略对位置环可能已经接近编码器分辨率。采样保持还会带来平均半拍延迟零阶保持器的相位滞后近似为 -ωTs/2采样周期越大闭环相位裕度越容易被吃掉。2.1.1 采样定理不是控制带宽的答案采样定理说 fs 大于信号最高频率的两倍就能避免混叠但闭环控制还要求足够的相位裕度和动态响应。工程上更常用 fs 为闭环带宽的 10 到 20 倍或者让采样周期 Ts 落在对象时间常数 τ 的 1/10 到 1/20。采样太快会放大微分噪声和 CPU 负担采样太慢会让积分和微分都失去意义。2.2 零阶保持器与 Z 变换s 域到 z 域的最小换算以一阶惯性对象 G(s)K/(τs1) 为例执行器保持一个采样周期相当于串联零阶保持器。按 Z 变换推导G(z) (1-z^-1)Z[K/(s(τs1))] K(1-a)z^-1/(1-a z^-1)其中 ae^(-Ts/τ)。换成差分方程就是 y[k]a y[k-1]b u[k-1]bK(1-a)。离散极点 a 越接近 1对象动态越慢b 同时受 K 和 Ts 影响。很多现场问题不是 PID 公式写错而是用连续 PID 参数直接套到离散循环里却没有注意采样周期和对象时间常数的比例。2.3 用 Python 把一阶惯性对象离散成可执行差分方程先在电脑上建一个最小仿真环境别急着接板子。下面命令创建虚拟环境并安装数值和绘图库Windows 下激活脚本路径不同但思路一致。python -m venv .venv source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install numpy matplotlib这段命令把依赖隔离在当前项目目录避免和系统 Python 混在一起。numpy用来做数组和指数计算matplotlib用来对比离散响应和连续响应。装完后可以运行下面的离散化脚本。import numpy as np import matplotlib.pyplot as plt K 2.0 # 对象直流增益 tau 5.0 # 时间常数单位 s Ts 0.1 # 采样周期单位 s取 tau/50 t_end 30.0 a np.exp(-Ts / tau) # 离散极点 b K * (1.0 - a) # 输入增益 n int(t_end / Ts) t np.arange(n) * Ts u np.ones(n) # 阶跃输入 y np.zeros(n) for k in range(1, n): y[k] a * y[k-1] b * u[k-1] # 一阶差分方程 y_cont K * (1.0 - np.exp(-t / tau)) # 连续解析解 plt.plot(t, y, labeldiscrete) plt.plot(t, y_cont, --, labelcontinuous) plt.xlabel(time / s) plt.ylabel(output) plt.legend() plt.grid(True) plt.show()代码里的a决定离散对象的衰减速度b决定单位输入带来的稳态增量。Tstau/50时两条曲线基本重合说明离散化精度足够如果把Ts改成tau/2离散步长会明显变粗控制器再激进也补不回丢掉的相位。u是阶跃输入y是对象输出循环从 k1 开始是因为差分方程用的是上一拍输入。2.4 采样周期、时间常数和离散化方法参数表不同对象的采样周期不能用同一个数。下面这张表适合作为选型起点实际还要看传感器噪声、执行器带宽和 CPU 余量。对象类型典型 τ推荐 Ts离散极点 a 范围备注温度30-300 s1-5 s0.99-0.95慢过程滤波可重注意积分饱和速度0.05-0.5 s1-10 ms0.99-0.90电流环通常更快速度环在其外层位置0.01-0.1 s0.5-2 ms0.975-0.90测速差分噪声大别把 Kd 开太大流量0.1-2 s20-100 ms0.98-0.90阀门死区和摩擦会带来稳态误差离散化方法也要按场景选零阶保持器适合执行器保持输出的对象Tustin 适合滤波器设计后向差分适合手写快速原型。选完方法后把 Ts、a、b 记录下来后面 C 或 PLC 里的参数要和仿真一致。3. 计算机控制技术落地选型Python、C、PLC 三条路线怎么分工同一套控制律放在工控机、MCU 和 PLC 里工程代价完全不同。Python 适合把算法跑通和做数据分析C 适合量产控制器和硬实时循环PLC 适合工业现场和已有电气柜。选型不是比谁高级而是看延迟、抖动、维护方式和现场接口。3.1 Python 原型先把控制律跑通再谈实时性Python 的强项是快速迭代能直接读 CSV、画曲线、接 Modbus 或串口。它的弱项是 GIL、垃圾回收和操作系统调度抖动硬实时控制不能只靠普通 Python 线程。做原型时可以用time.perf_counter()做单调计时用sleep补偿计算耗时把平均周期压到目标附近。import time def clamp(x, lo, hi): return max(lo, min(hi, x)) def read_sensor(): # 现场替换为 ADC、Modbus、Socket 或仿真模型 return 20.0 def write_actuator(u): # 现场替换为 DAC、PWM、PLC 写寄存器 pass sp 100.0 Kp, Ki, Kd 1.2, 0.05, 0.01 dt 0.01 integral 0.0 prev_error 0.0 for _ in range(1000): t0 time.perf_counter() pv read_sensor() error sp - pv integral error * dt derivative (error - prev_error) / dt out Kp * error Ki * integral Kd * derivative write_actuator(clamp(out, 0.0, 100.0)) prev_error error elapsed time.perf_counter() - t0 time.sleep(max(0.0, dt - elapsed)) # 补偿计算耗时降低平均周期误差这段代码里sp是设定值pv是过程值dt是名义采样周期clamp做输出限幅。perf_counter()比time.time()更适合测间隔sleep(max(0.0, dt-elapsed))让循环平均周期接近dt。参数Kp/Ki/Kd应先在仿真里整定现场只做小幅微调如果elapsed的 P99 已经超过dt说明 Python 循环不适合继续加计算量。3.2 C 语言 PID裸机和 RTOS 下的浮点、定点取舍C 语言适合 MCU、DSP 和 RTOS 任务。Cortex-M4F 这类带 FPU 的芯片用浮点更省开发时间M0 或无 FPU 场景可以用 Q 格式定点。下面是一个最小浮点 PID注意结构体状态在中断和任务之间共享时要小心原子性。#include stdint.h typedef struct { float Kp; float Ki; float Kd; float integral; float prev_error; float out_min; float out_max; } PID; float pid_update(PID *p, float sp, float pv, float dt) { float error sp - pv; float p_term p-Kp * error; float d_term p-Kd * (error - p-prev_error) / dt; p-integral p-Ki * error * dt; float out p_term p-integral d_term; if (out p-out_max) { out p-out_max; p-integral - p-Ki * error * dt; /* 简单回退防止积分继续累积 */ } else if (out p-out_min) { out p-out_min; p-integral - p-Ki * error * dt; } p-prev_error error; return out; }dt必须与调用周期一致单位是秒out_min/out_max对应 PWM、DAC 或阀门范围。积分项已经把Ki乘进去回退时也减去同样的增量逻辑简单但有效。如果这个函数在定时中断里执行PID结构体的读写要保证不会被打断多任务系统里建议加互斥或把控制环集中在一个任务中。3.2.1 增量式 PID 为什么在输出限幅时更顺手增量式 PID 不直接算绝对输出而是算 ΔuKp(e_k-e_{k-1})Ki e_k dtKd(e_k-2e_{k-1}e_{k-2})/dt再用 u_ku_{k-1}Δu。它对阀门、步进执行器更自然限幅时不会把积分项单独累到很大手动切自动也更容易做无扰切换。代价是需要保存前两拍误差而且对输出初始值敏感。3.3 PLC 结构化文本把 PID 做成可复用功能块PLC 的优势是现场接线、诊断和电气兼容性结构化文本适合把 PID 封装成功能块。下面这段 ST 代码可以在很多支持 IEC 61131-3 的环境里改写成功能块dt应使用定时中断任务周期而不是主循环的估计值。FUNCTION_BLOCK FB_PID VAR_INPUT Setpoint : REAL; ProcessValue : REAL; Kp : REAL : 1.0; Ki : REAL : 0.1; Kd : REAL : 0.0; dt : REAL : 0.01; OutMin : REAL : 0.0; OutMax : REAL : 100.0; END_VAR VAR_OUTPUT Output : REAL; END_VAR VAR integral : REAL; prev_error : REAL; error : REAL; END_VAR error : Setpoint - ProcessValue; integral : integral Ki * error * dt; Output : Kp * error integral Kd * (error - prev_error) / dt; IF Output OutMax THEN Output : OutMax; integral : integral - Ki * error * dt; ELSIF Output OutMin THEN Output : OutMin; integral : integral - Ki * error * dt; END_IF; prev_error : error;这段功能块把积分、微分和限幅都放在一个扫描周期内OutMin/OutMax对应阀门或变频器限幅。dt如果取错Ki和Kd的实际作用会跟着错。很多 PLC 项目把 PID 放在主程序 OB1 里扫描周期随程序大小变化结果低速过程还能跑快速过程就会抖常见做法是放到固定周期中断任务里。3.4 三条路线的延迟、抖动、维护成本对比路线典型实时性开发速度部署位置维护方式适用场景Python软实时毫秒级抖动快工控机、边缘网关依赖运行环境算法验证、数据采集、上位机C硬实时微秒到毫秒中MCU、DSP、RTOS固件升级量产控制器、电机环、传感器融合PLC硬实时毫秒到秒中电气柜、产线在线修改、诊断工业现场、联锁、流程控制实际项目经常混用Python 做离线辨识和参数搜索C 做板级控制PLC 做安全联锁和现场执行。把控制律放在哪一层取决于闭环带宽、接口和维护权限而不是个人偏好。4. 计算机控制技术实战采样周期、滤波、抗积分饱和的参数怎么定仿真里曲线漂亮现场却可能因为传感器噪声、阀门死区、输出限幅和调度抖动而震荡。计算机控制技术的实战部分核心是把采样周期、滤波系数、抗饱和策略和记录手段一起定下来让每次调参都有依据。4.1 采样周期从时间常数反推温度、速度、位置三档采样周期先按对象时间常数定再按闭环带宽校验。经验规则是 Tsτ/10 到 τ/20如果对象有纯滞后Ts 还要小于滞后时间的 1/5 到 1/10。温度过程慢可以用秒级周期速度环常用毫秒级位置环和电流环更快但位置差分噪声会逼着你加滤波。对象典型 τ闭环带宽参考推荐 Ts注意点温度30-300 s0.01-0.1 Hz1-5 s滤波时间常数可取 5-20 s速度0.05-0.5 s5-30 Hz1-10 ms电流环 100 μs-1 ms位置0.01-0.1 s10-100 Hz0.5-2 ms测速差分噪声大流量0.1-2 s0.5-5 Hz20-100 ms阀门死区会造成稳态误差选完 Ts 后把控制器输出、设定值和过程值带时间戳记录。没有记录就无法区分是参数问题、滤波问题还是采样周期问题现场只靠肉眼调参很容易来回过头。4.2 传感器滤波一阶低通和滑动平均的参数怎么设一阶低通适合抑制高频噪声滑动平均适合随机噪声。下面两个函数可以直接嵌到 C 控制循环里调用周期固定时参数含义稳定。float lpf(float raw, float *state, float alpha) { *state alpha * raw (1.0f - alpha) * (*state); return *state; } float moving_average(float raw, float *buf, int len, int *idx, float *sum) { *sum - buf[*idx]; buf[*idx] raw; *sum raw; *idx (*idx 1) % len; return *sum / (float)len; }一阶低通的alphaTs/(Tstau_f)tau_f是滤波时间常数。tau_f越小越跟得快但噪声大越大越平滑但相位滞后越大。滑动平均的窗口len个点等效滞后约(len-1)/2*Ts适合抗随机噪声不适合抑制周期性干扰。温度tau_f可以取 5-20 s速度取 5-20 ms位置取 1-5 ms具体还要看控制带宽。4.2.1 滤波会吃掉相位别把截止频率设得比控制带宽还低一阶低通在频率 ω 处的相位滞后是 -arctan(ω tau_f)。如果控制带宽处滞后超过 20 度PID 的相位裕度会被明显压缩表现为响应变慢或超调变大。常见做法是让滤波截止频率至少是控制带宽的 3 到 5 倍实在压不住噪声时先查布线、接地和传感器供电而不是继续加大滤波。4.3 抗积分饱和、输出限幅和死区补偿积分饱和来自输出已经到极限误差还在让积分累积。条件积分比简单截断更稳下面函数只在输出未饱和或积分方向能把输出拉回线性区时才接受新积分。def pid_anti_windup(sp, pv, state, dt, cfg): error sp - pv p_term cfg[Kp] * error d_term cfg[Kd] * (error - state[prev_error]) / dt candidate_i state[integral] cfg[Ki] * error * dt out_unsat p_term candidate_i d_term out min(max(out_unsat, cfg[out_min]), cfg[out_max]) # 只有未饱和或积分方向能把输出拉回线性区时才接受积分 if out out_unsat or (out_unsat cfg[out_max] and error 0) or (out_unsat cfg[out_min] and error 0): state[integral] candidate_i state[prev_error] error return out, statecfg里放Kp/Ki/Kd/out_min/out_maxstate保存integral和prev_error。这段逻辑避免输出限幅时积分继续累加也避免反向误差一来就长时间退饱和。死区补偿则要在执行器最小启动量附近加前馈或查表注意零附近要加小死区防止抖动。4.4 从阶跃曲线读超调、振荡和稳态误差给一个 5% 到 10% 的设定值阶跃记录设定值、过程值和输出。上升时间看响应速度超调量看阻尼调节时间看振荡收敛稳态误差看积分和死区。下面这张排查表适合现场快速定位。现象可能原因处理顺序超调大Kp 大、积分过强降 Kp加 Kd检查抗饱和低频振荡Ki 大、积分饱和降 Ki改条件积分高频抖动Kd 大、噪声大、Ts 大降 Kd加滤波减小 Ts稳态误差Ki 小、执行器死区加 Ki前馈或死区补偿响应慢Kp 小、输出限幅加 Kp查限幅和采样周期调参顺序通常是先 P 到临界振荡附近再退回再加 I 消稳态误差最后加 D 压超调。每次只改一个参数并把曲线存成 CSV否则很难判断是参数变化还是工况变化。5. 计算机控制技术进阶阶跃辨识、稳定裕度和继电器自整定到了进阶阶段重点不是继续背 PID 公式而是从现场数据里估出对象参数再用频域和时域一起验证。对象换了、负载变了、机械松了原来的参数就不一定稳能快速辨识和自整定比手调更可靠。5.1 用阶跃响应辨识 K、T、纯滞后 τ先做一次开环或闭环小幅阶跃采集过程值序列。一阶加纯滞后模型足够应付很多温度和流量对象辨识时取稳态段平均避免单点噪声。import numpy as np # y: 阶跃响应采样序列u_step: 阶跃幅值Ts: 采样周期t: 时间序列 y0 np.mean(y[:10]) y_ss np.mean(y[-20:]) K (y_ss - y0) / u_step # 一阶惯性达到 63.2% 的时间近似为时间常数 target y0 0.632 * (y_ss - y0) idx np.argmax(y target) T_est t[idx] - t[0] # 纯滞后从阶跃开始到输出明显离开基线的第一点 threshold y0 0.02 * (y_ss - y0) idx_delay np.argmax(y threshold) tau_delay t[idx_delay] - t[0] print(K, T_est, tau_delay)K是稳态增益T_est是时间常数tau_delay是纯滞后。阈值取 2% 是为了避开噪声误判稳态段取末尾平均是为了减小纹波影响。如果阶跃响应本身有振荡一阶模型不够需要二阶模型或频域辨识别硬套一阶参数。5.2 用 Python 画 Bode 和根轨迹查稳定裕度拿到模型后先看相位裕度和增益裕度再决定 PID 参数是否激进。安装control库后可以用几行代码画出开环频率响应。pip install control matplotlibimport control as ct import matplotlib.pyplot as plt # 例连续对象 K/(tau*s1)再串联 PID s ct.tf(s) G 2.0 / (5.0 * s 1) C 1.2 0.05 / s 0.01 * s L C * G gm, pm, wg, wp ct.margin(L) print(fGM{gm:.2f}, PM{pm:.2f} deg, wg{wg:.2f}, wp{wp:.2f}) ct.bode_plot(L, dBTrue, HzFalse) plt.show()gm是增益裕度pm是相位裕度wg和wp是穿越频率。工程目标常取相位裕度 45 到 60 度增益裕度大于 6 dB。要分析离散系统用ct.c2d(G, Ts, methodzoh)转成 z 域再算裕度control库不同版本 API 可能有差异遇到报错先查函数签名。5.3 继电器自整定和在线微调继电器反馈法让输出在 u0±d 之间切换观测过程值振荡。临界增益 Ku4d/(πA)A 是过程值振荡幅值Tu 是振荡周期。Ziegler-Nichols 参数表适合作为起点但现场通常先取 0.5 到 0.7 倍再根据超调和调节时间微调。控制器KpTiTdP0.5Ku--PI0.45KuTu/1.2-PID0.6KuTu/2Tu/8在线微调时盯三类曲线设定值阶跃看超调负载扰动看恢复时间输出限幅看积分回退。每次只动一个参数记录修改前后的上升时间、超调量和稳态误差避免把工况变化误判成参数问题。5.4 把计算机控制技术.pdf 变成实验台的三步第一步选一个可测对象加热片、直流电机或水箱都行把 ADC、PWM 和通信调通先采一段开环阶跃。第二步在 Python 里辨识 K、T、τ设计 PID离散化到目标采样周期对比仿真和实测曲线。第三步移到 C 或 PLC固定采样周期加滤波、抗饱和和输出限幅把每次实验的设定值、过程值、输出、Ts、滤波系数和 PID 参数存成 CSV。下一次换对象时先比对这些曲线再决定是调参、改滤波还是改采样周期。本文还有配套的精品资源点击获取