油嘴滑舌指什么生肖| 前列腺炎吃什么药最好| 新生儿满月打什么疫苗| 手背发麻是什么原因| 颅内缺血灶是什么病症| 早上醒来嘴苦是什么原因| 石油是什么意思| 99新是什么意思| 为什么睡觉流口水很臭| 男人得了hpv有什么症状| 淋巴滤泡形成什么意思| c1能开什么车| 桃胶有什么功效| 蛋白粉吃多了有什么危害| 狗狗耳螨用什么药| 5.19是什么星座| 吃什么醒酒| 黄鳝吃什么食物| 为什么总是做梦| 1987年出生属什么| hazzys是什么牌子价格| 喜怒无常是什么意思| 嘴角边长痘痘是什么原因| 1956属什么生肖| 坐地能吸土是什么意思| 血小板减少是什么原因造成的| 蜜蜡是什么材料| 过敏了吃什么药| 春晓的晓是什么意思| 什么是眩晕症| 红颜薄命的意思是什么| 八月三号什么星座| 早泄吃什么药| 反复感冒是什么原因引起的| 卤牛肉用什么部位| 全身瘙痒是什么原因| 右腹疼是什么原因| 喉咙痛吃什么消炎药| 男性雄激素低吃什么药| 2001年是什么生肖| 蹄花是什么| 喝茶为什么睡不着觉| 恋爱脑什么意思| 百分位是什么意思| 调理脾胃吃什么药| 1988属什么| 大便有点绿色是什么原因| 水什么| 霄字五行属什么| 嗓子痒痒老想咳嗽是什么原因| 市检察长是什么级别| 什么药止痒效果最好| 尿素氮是什么| 经常放屁吃什么药| 行经是什么意思| 急性肠胃炎是什么引起的| 什么的红烧肉| 水垢是什么| 保护眼睛用什么眼药水| 什么是水印| 充电宝什么品牌好| 多囊卵巢综合症有什么症状| 腺管瘤是什么| 澍在人名中读什么| 颞颌关节炎吃什么药| 住院需要带什么东西| ab血型和o血型的孩子是什么血型| 转氨酶异常有什么症状| 高压高低压正常是什么原因| 什么是贵妇脸| 梦见自己生了个女儿是什么预兆| 陈赫开的火锅店叫什么| 中心性肥胖什么意思| 哈森鞋子属于什么档次| 手突然抖动是什么原因| 择日不如撞日什么意思| 腰两边疼是什么原因| 马蜂蛰了用什么药| 扁桃体发炎严重吃什么药好得快| 考警校需要什么条件| 白油是什么| 及时是什么意思| 耐信是什么药| 冬虫夏草补什么| 盆腔炎吃什么药效果最好| 瑜伽是什么| 小鸟站在高压线上为什么不会触电| 什么是润年| 燃烧脂肪是什么感觉| 丁丁历险记的狗是什么品种| 腊八粥是什么节日| 午时银花露有什么功效| 灿字五行属什么| 寅虎是什么意思| 不孕不育的症状是什么| 蝉的鸣叫声像什么| 金蝉吃什么| 眼花视力模糊是什么原因引起的| 1999属什么| 各生欢喜什么意思| 中药学专业学什么| 幽门螺杆菌用什么药| 萎缩性胃炎是什么原因引起的| 沃尔玛是干什么的| 长膘是什么意思| cn什么意思| 太乙是什么意思| 身不由己是什么生肖| 4月15日是什么日子| 逝去是什么意思| 心什么如什么| 尼维达手表什么档次| 河南有什么美食| 松子是什么树的果实| 感官世界讲的什么| 顶到子宫是什么感觉| her什么意思| 晚上吃什么最健康| 炭疽病用什么农药最好| 这个人就是娘是什么歌| 不想吃饭没胃口是什么原因| 耳语是什么意思| 肝火旺有什么症状| 环切手术是什么| 给老师送花送什么花合适| 洋葱什么时候种| suki是什么意思| 一面之词是什么意思| 信的拼音是什么| 乳腺癌的症状是什么| 水杯用什么材质的好| 什么是cosplay| 10月2号是什么星座| 什么时候喝蜂蜜水最好| 二重唱是什么意思| 218号是什么星座| 肠胃炎引起的发烧吃什么药| 手指头发红是什么原因| 梦见野猪是什么预兆| 湿气重挂什么科| winbond是什么品牌| 细菌性痢疾症状是什么| 孕妇晚餐吃什么比较好| 阴道里面有个肉球是什么| B2B什么意思| 乌鸡卷是什么肉做的| 为什么手指会脱皮| 孕妇梦见狗是什么意思| 睡醒咳嗽是什么原因| 猪肝不能和什么一起吃| 今天天气适合穿什么衣服| 三文鱼有什么营养| 肚子疼去医院挂什么科| 四月二十八什么星座| 前列腺肥大有什么症状| 七月六号是什么星座| 突然头晕冒虚汗什么原因| 杨八妹属什么生肖| 张国立老婆叫什么名字| 捋一捋是什么意思| 吃饭时头晕是什么原因| 前白蛋白低是什么意思| 奕五行属性是什么| 酸奶和牛奶有什么区别| 女性梅毒有什么症状| 低骨量是什么意思| 吃什么可以消除淋巴结| 维生素什么时候吃效果最好| 小腿酸软无力是什么原因| 玄关画挂什么图最好| 宝宝湿疹用什么药膏| 仙鹤代表什么生肖| 为什么嘴唇会发紫| 小受是什么意思| 不感冒是什么意思| 做宫颈筛查能查出什么| 精索静脉曲张吃什么药| 多喝柠檬水有什么好处| 小米粥和什么搭配最好| 手指关节痛是什么原因| 精子发黄是什么原因| b超跟彩超有什么区别| 什么叫淋巴结| 压差小是什么原因引起的| 程咬金是什么意思| 九二年属猴的是什么命| 叛逆是什么意思| 老汉推车是什么姿势| 声音的高低叫什么| 淋巴结转移是什么意思| 现在什么餐饮最火| 怀孕两个月出血是什么原因| 大小周休息是什么意思| 重色轻友什么意思| ojbk 是什么意思| 尿血什么原因| 浮萍是什么植物| 什么是植物神经| 奶不够吃是什么原因| 什么人容易得胆结石| 怀孕了吃什么药可以打掉| 马齿苋有什么好处| 三唑仑是什么| 什么食物含钙高| 右手麻木是什么病| 解脲脲原体阳性是什么| 7.14什么情人节| 制剂是什么意思| 早上起来眼睛肿是什么原因| 诶是什么意思| 什么花代表永恒的爱| 嘎哈是什么意思| 淋巴结是什么东西| 25属什么| 螺旋藻是什么东西| kpi是什么意思| 20是什么意思| 7月30号什么星座| 考试什么的都去死吧歌曲| 积食发烧吃什么药| 月经为什么来了一点又不来了| 血糖高有什么反应| 5201314是什么意思| 企业背书是什么意思| 什么饭不能吃| 米酒和黄酒有什么区别| 金银花和什么搭配喝好| 什么地飞| 高血压用什么药最好| roa胎位是什么意思| 割包皮看什么科| 野鸡吃什么| polo是什么意思| 大便不通吃什么药| 怀孕什么时候吃鹅蛋最好| pr是什么工作| 怀孕了不想要最好的办法是什么| a血型和o血型生出宝宝是什么血型| 女上位是什么意思| 稼穑是什么意思| hpv52阳性是什么病| 洋姜学名叫什么| 48是什么意思| 抽烟有什么好处| 梦见菊花是什么意思啊| 示数是什么意思| 脸上长斑的原因是什么引起的| ccg是什么意思| 五花肉和什么菜炒好吃| 什么叫六亲| 尿酸高挂什么科| 93年鸡五行属什么| 肌肤是什么意思| 上火吃什么药| 肋骨外翻有什么危害| 六角龙鱼吃什么| 刘强东属什么生肖| 脚脖子浮肿是什么原因引起的| 出其不意下一句是什么| 很棒是什么意思| 衣冠禽兽指什么生肖| 肥牛是什么肉| 眼睑炎用什么药| 乙肝125阳性是什么意思| 百度
打印
[学习资料]

用车准备换汽车座椅的车主们 教你鉴别复合皮

[复制链接]
17734|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 dongnanxibei 于 2025-6-24 14:14 编辑

使用PID算法控制占空比(0-100%)来实现热水恒温加热是一个非常经典且有效的应用。

系统核心组件:
  • 温度传感器: 测量当前水温(PV - Process Variable)。
  • 控制器(运行PID算法): 可以是微控制器(如Arduino, STM32, Raspberry Pi Pico)、PLC或工业控制器。
  • 执行器: 通常是固态继电器(SSR) 或功率MOSFET/IGBT模块,用于根据控制器的指令(占空比)快速开关加热元件(电热棒、PTC加热器等)。
  • 加热元件: 将电能转化为热能。
  • 设定点(SP - SetPoint): 你想要保持的目标水温(例如,45°C)。

PID控制占空比的实现步骤:
  • 读取当前温度(PV):

    • 通过ADC(模数转换器)读取温度传感器的信号(如热电偶、热敏电阻、DS18B20数字传感器)。
    • 将ADC值转换为实际的温度值(PV)。

  • 计算误差(e(t)):

    • e(t) = SP - PV
    • 这是当前目标温度与实际温度之间的差值。如果PV低于SP(水太冷),误差为正,需要加热。如果PV高于SP(水太热),误差为负,需要停止或减少加热。

  • 计算PID输出(u(t)):

    • 这是PID算法的核心。标准位置式PID公式为:
      u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
    • 比例项 (Kp * e(t)):对当前误差做出即时反应。误差越大,输出变化越大。Kp过大会导致系统震荡;过小会使响应迟钝。
    • 积分项 (Ki * ∫e(t)dt):累积历史误差。消除稳态误差(当PV稳定在接近但不等于SP时)。Ki过大容易导致超调和震荡;过小则消除稳态误差慢。
    • 微分项 (Kd * de(t)/dt):预测未来误差趋势(基于误差变化率)。有助于抑制超调、增加稳定性。Kd过大对噪声敏感;过小抑制超调效果差。
    • 离散化: 微控制器是离散系统,需将连续公式离散化。常用方法:

      • u[k] = Kp * e[k] + Ki * sum(e[j] for j=0 to k) * dt + Kd * (e[k] - e[k-1]) / dt
      • 其中:

        • u[k]:当前时刻k的PID计算输出值。
        • e[k]:当前时刻k的误差。
        • e[k-1]:上一时刻k-1的误差。
        • sum(e[j]):从起始时刻到当前时刻k的误差累积和(即积分项的近似)。
        • dt:采样时间(控制周期)。非常重要! 需要根据系统特性(热惯性)合理选择(通常1-10秒对热水系统较合适)。



  • 将PID输出映射到占空比(0-100%):

    • PID计算出的u[k]是一个理论上的控制量,需要映射到实际可用的占空比范围。
    • 输出限幅(Output Clamping): 这是关键一步!必须将u[k]限制在[0, 100](或[0, MaxOutput])范围内。

      • duty_cycle[k] = constrain(u[k], 0, 100);

    • 为什么重要?

      • 防止积分项累积过大(积分饱和),导致系统长时间饱和输出,产生严重超调。
      • 确保输出符合执行器(占空比)的物理限制。


  • 抗积分饱和(Anti-Windup):

    • 当PID输出被限幅(饱和)时(例如u[k]计算值大于100,但被限制在100),积分项仍在持续累积误差(即使输出已经最大),这称为“积分饱和”。当系统需要反向调节时(如水温接近设定点需要减小加热),积分项的巨大累积值会导致输出无法及时减小,造成严重超调和震荡。
    • 解决方法:

      • 积分分离: 当误差e(t)很大时(例如|e(t)| > Threshold),只使用P或PD控制,禁用积分项(I),防止初始升温阶段积分项过度累积。当误差减小到阈值以下时,再启用积分项消除稳态误差。
      • 积分限幅: 直接限制积分项累积值的范围(min_integral 到 max_integral)。
      • 回算(Back Calculation): 当输出饱和时,根据饱和程度按比例减小实际的积分累积值(sum(e[j]))。这是效果较好的常用方法。
      • 条件积分: 仅在满足特定条件(如误差符号不变或输出未饱和)时才累加积分项。


  • 输出占空比信号:

    • 将计算得到的duty_cycle[k](0-100)值,通过控制器的PWM(脉宽调制)输出引脚输出。
    • PWM信号驱动固态继电器(SSR)或功率开关管(MOSFET/IGBT)。
    • PWM的频率需要根据加热元件和SSR的特性选择:

      • 电阻丝加热:较低频率(如1-10 Hz)即可,热惯性大。
      • 半导体加热(PTC):可能需要稍高频率(如10-100 Hz)。
      • 避免使用过高频率(如kHz以上),SSR的开关损耗会增加,且对温度控制无明显益处(热惯性太大)。

    • PWM占空比直接决定了在一个PWM周期内,加热元件通电时间的比例(duty_cycle %),从而控制平均加热功率。

  • 等待下一个采样周期:

    • 在精确的dt时间间隔后(使用定时器中断实现最准确),回到步骤1,开始新一轮的控制循环。



沙发
dongnanxibei|  楼主 | 2025-6-24 14:14 | 只看该作者
关键考虑点和优化:

PID参数整定(Tuning): 这是最具挑战性也最重要的步骤。Kp, Ki, Kd的值需要根据你的具体系统(水箱大小、加热功率、保温性能、散热情况、传感器位置)进行调整。

方法:

手动试凑法: 先设Ki=0, Kd=0,增大Kp直到系统开始等幅振荡。记录此时的临界增益Kc和振荡周期Pc。然后根据经验公式(如Ziegler-Nichols法)设置初始Kp, Ki, Kd(例如 Kp = 0.6*Kc, Ki = Kp / (0.5*Pc), Kd = Kp * 0.125*Pc),再微调。

软件自整定: 一些高级控制器或库提供自动整定功能(如阶跃响应分析)。

经验值: 对于热水系统,通常Kp在1-20范围内,Ki在0.001-0.1范围内(取决于dt),Kd在0-5范围内是比较常见的起点。务必从较小的值开始逐步增加!

目标: 响应快速、超调小、稳态误差小、抗干扰能力强。

采样时间(dt):

必须远小于系统的主要时间常数(热惯性)。对于家用热水器,1-10秒通常是合适的。

太短:计算开销大,对噪声更敏感,微分项可能不稳定。

太长:控制不及时,可能导致超调或振荡。

保持恒定! 使用硬件定时器中断来保证精确的采样间隔。

传感器精度、位置和滤波:

使用精度和响应速度合适的温度传感器。

传感器安装位置要能代表水体的平均温度(避免靠近加热器或出水口)。

对传感器读数进行适当滤波(如移动平均、低通滤波)以减少噪声对微分项的影响(噪声会被微分放大)。

执行器特性:

SSR或MOSFET的开关速度要足够快,确保能精确实现要求的占空比。

考虑最小导通时间限制。

设定点变化处理:

当设定点SP大幅改变(如从25°C调到50°C)时,积分项可能需要复位或限幅,防止初始阶段过度积分导致严重超调。积分分离法对此很有帮助。

安全机制:

温度上限保护: 绝对限制最高水温(如硬件或软件限制SP最大值,或在PV超过安全值时强制duty_cycle=0)。

传感器故障检测: 检测传感器是否开路、短路或读数超出合理范围,并采取安全措施(如关闭加热)。

看门狗定时器: 防止控制器程序跑飞导致持续加热。

板凳
dongnanxibei|  楼主 | 2025-6-24 14:16 | 只看该作者

代码示例框架
// 定义PID参数和变量
float Kp = 10.0;   // 比例系数 - 需调整
float Ki = 0.05;   // 积分系数 - 需调整
float Kd = 2.0;    // 微分系数 - 需调整
float dt = 1.0;    // 采样时间 (秒) - 需调整

float setpoint = 45.0;  // 目标水温 (°C)
float prev_error = 0.0;
float integral = 0.0;
float max_integral = 100.0; // 积分限幅值 - 需调整
float min_integral = -100.0; // 积分限幅值 - 需调整

// 主循环 (由定时器中断触发,间隔 dt 秒)
void controlLoop() {
    // 1. 读取当前温度 PV
    float pv = readTemperatureSensor(); // 实现此函数

    // 2. 计算误差
    float error = setpoint - pv;

    // 3. 计算积分项 (带限幅)
    integral += error * dt;
    // 抗积分饱和 - 方法1: 积分限幅
    if (integral > max_integral) integral = max_integral;
    if (integral < min_integral) integral = min_integral;
    // 可选:方法2 - 积分分离 (当|error|很大时,integral保持不变)

    // 4. 计算微分项 (近似)
    float derivative = (error - prev_error) / dt;
    prev_error = error; // 保存本次误差用于下次微分

    // 5. 计算PID输出
    float output = Kp * error + Ki * integral + Kd * derivative;

    // 6. 输出限幅 (0 - 100)
    float duty_cycle = output;
    if (duty_cycle > 100.0) duty_cycle = 100.0;
    if (duty_cycle < 0.0) duty_cycle = 0.0;

    // 7. 设置PWM占空比 (假设有 setPWM(duty) 函数)
    setPWM(duty_cycle); // 实现此函数,将duty_cycle(0-100)映射到实际的PWM寄存器值

    // (可选:更高级的抗饱和 - 回算法,当输出饱和时修正integral)
}
开始实施建议:

搭建好硬件(传感器、控制器、SSR、加热器、电源)。

实现基本的数据读取(PV)和PWM输出功能。

先实现简单的P控制(Ki=0, Kd=0)。调整Kp,观察系统响应(上升速度、是否有稳态误差、是否震荡)。

加入积分控制I(Ki > 0)。务必同时加入积分限幅(max_integral, min_integral)。调整Ki消除稳态误差,注意观察是否会引入超调和震荡。

如果需要抑制超调或增加稳定性,再加入微分控制D(Kd > 0)。调整Kd,注意传感器噪声会被放大,可能需要滤波。

在整个过程中,密切关注安全保护机制!

地板
zcyxh12345| | 2025-7-8 10:21 | 只看该作者
good  
5
dongnanxibei|  楼主 | 2025-7-8 11:35 | 只看该作者
感谢认可。这贴是我总结的,都是实际操作获得的经验。
6
GIVN| | 2025-7-8 17:43 | 只看该作者
感谢分享,学习了
7
zjsx8192| | 2025-7-9 09:11 | 只看该作者
感谢分享pid
8
kissdb| | 2025-7-9 11:02 | 只看该作者
感谢分享pid
9
似清风| | 2025-7-15 16:28 | 只看该作者
去年自己DIY加热台,也是用PID调温,不过没调好PID
10
时光迷宫| | 2025-7-20 20:12 | 只看该作者
问下这个PID算法是开源的吗
11
R2D2| | 2025-7-22 14:57 | 只看该作者
时光迷宫 发表于 2025-7-20 20:12
问下这个PID算法是开源的吗

PID算法超级简单,网上随便一搜就大把,几行程序的事儿,用模拟电路实现也不到20个元件。

PID的难度在于如何确定P、I、D三个参数的值,楼主显然还没有入门,这种没营养的口水贴也能推荐真是B了狗了。建议你搜“Ziegler-Nichols method”,有first和second两种。
12
leoeric| | 2025-7-23 13:51 | 只看该作者
感谢分享,学习了
13
cooldog123pp| | 2025-7-24 17:28 | 只看该作者
R2D2 发表于 2025-7-22 14:57
PID算法超级简单,网上随便一搜就大把,几行程序的事儿,用模拟电路实现也不到20个元件。

PID的难度在于 ...

也不能这么说吧,还是需要实际调试的,几个参数调优的话还是需要时间的。
14
GlenX| | 2025-7-25 18:25 | 只看该作者
本帖最后由 GlenX 于 2025-7-28 09:17 编辑

方法、过程都不错!感谢楼主的细心和分享!
---------------------------------------   带好安全帽,安全第一预防为主,可能有板砖飞过来  -----------------------------------------
但我反对很多对PID的“理解”,包括楼主对“积分增益”“微分增益”的理解和应用,当然不是你个人的错误,毕竟很多这么复制粘贴的。
积分和微分是有实际“单位”和“意义”的,不是一个用“增益系数”描述的“参数”,
我有员工也是这么理解,被我“纠正”了一番,希望大家正确理解积分和微分的实际意义,
也就是你提到的“采样周期”,和这个是有直接关系的,这个关系:采样周期和“一秒”之间的比例关系才叫系数。
自从没有电子管的时候就有了“气动仪表”的PID,到了现在的微处理器时代,
PID有微妙级的快速应用,也有常规的秒级应用,但始终都是和“时间”紧密相连的,积分、微分就是时间的概念,
在控制原理中有准确的定义和定量,不是一个没有单位的“系数”。
希望控制行业的同行不要延续这样的概念COPY。

15
幸福小强| | 2025-7-29 19:28 | 只看该作者
采用阈值法更合适。
16
zhuotuzi| | 2025-7-29 22:55 | 只看该作者
真不错,看看如何用的。
17
破晓战神| | 2025-7-30 17:10 | 只看该作者
这个帖子非常详细,提供了PID算法在水温控制中的应用步骤,对于学习PID控制很有帮助。
18
cmyldd| | 2025-7-30 19:20 | 只看该作者
实际调整的,
19
暖茶轻语| | 2025-7-31 12:53 | 只看该作者
这个PID控制流程描述得很详细,对于实现恒温加热系统来说非常有帮助。你提到了离散化处理和输出限幅,这些都是实际应用中的关键点。
20
暖茶轻语| | 2025-7-31 22:34 | 只看该作者
这个方法很实用,我之前用Arduino做过类似的项目,PID算法确实能够很好地控制水温。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3842

帖子

18

粉丝
百度