找回密码
 立即注册
查看: 3035|回复: 13

4线风扇调速PID4线智能风扇调速散热风扇4线

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-26 08:49:01

2

主题

8

回帖

158

积分

注册会员

积分
158
发表于 2022-12-27 09:57:02 | 显示全部楼层 |阅读模式
本帖最后由 8051启蒙者 于 2022-12-27 14:19 编辑

  做风扇调速的原因是,以前同事做的风扇测试跟电脑检测误差超5%,正好我刚做水冷水泵调速跟电脑4线风扇一样需要采集FG周期来控制水泵转速,于是用水泵测试转速程式来测风扇转速结果跟以前同事做的一样测试结果,当时参考STC8H8K64U-DEMO-CODE范例05-利用定时器测量脉冲宽度,范例量测半周期,分析了好久才找到问题是采集问题,用示波器抓波发现风扇FG信号正半轴与负半周占空比有差异,把这个差异转换为RPM每分钟转速误差就大了,后来改采集整个周期问题解决。

  原本只需PWM输出0% 50% 75% 100%(显示风扇转速),后来我在原基础上增加了调速功能刚开使用的是设置上下限1%,超过了就调整,但是最近的一个新品风扇0% PWM风扇停转,而且这个风扇有点怪调速滞后很多,就是PWM定值FG也会来回抖动等很久后才稳定,如果再用原本调速方法就会出现转速慢慢高慢慢变低,一开始也研究了下PID一直没有搞定,这次没办法如果搞不定老板就要找话说了,搞了几个终于搞定了,下面分享下,(参考QQ群里别人的分享PID,修改了)


原4线风扇测试转速 与电脑测试对比

原4线风扇测试

原4线风扇测试


1.用外部中断下降沿来判定一周(原本在tim1里面)我觉得这样减少了在定时器1里面判断(因P32没加上拉电阻所以开启了内部上拉)。

风扇FG内部示意图
1170641-20171211182548274-1241157170.png
  1. //P32内部上拉  FAN FG
  2.   P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能
  3.   P3PU  |= 0x04;  //P3.2
  4.   P_SW2 &= 0x7f;
  5. //INT0
  6.   IT0   = 1;                          //使能INT0下降沿中断
  7.   EX0   = 1;                          //使能INT0中断
  8. //int0
  9. void INT0_Isr(void) interrupt 0   //INT0
  10. {
  11.   FG_Flag = 1;          //标记
  12.   Rpm0[1] = Rpm0[0];    //转存
  13.   Rpm0[0] = 0;          //清零
  14. }
复制代码
2.定时器1用500000K 0.2uS计数,这样可以100-50000 RPM范围

  1. //tim1
  2. void timer1(void) interrupt 3   //2us
  3. {
  4.   Rpm0[0]++;  //FG周期
  5. }
复制代码
3.PID调速
  1. //PID
  2.   pid_p       = 0.002;
  3.   pid_i       = 0.0008;
  4.   pid_d       = 0.0004; //PID三个参数初值
  5.   lastError   = 0;      //之前误差初始为0
  6.   sumError    = 0;      //偏差积累初始为0
  7. //pid
  8. void PID(u32  dat)
  9. {
  10. long  xdata dError;
  11. long  xdata Error;
  12. long  xdata Total_Error;
  13.   
  14.   Error       = dat - SpeedSet;     //当前误差
  15.   sumError    = Error + sumError;   //误差积累
  16.   dError      = Error - lastError;  //误差偏差
  17.   lastError   = Error;
  18.   Total_Error = pid_p*Error + pid_i*sumError + pid_d*dError;  //三个参数计算
  19.   if(Total_Error  > 600) Total_Error = 600;
  20.   if(Total_Error  <  60) Total_Error = 60;
  21.   PWM6_Duty = Total_Error;
  22.   UpdatePwm6(PWM6_Duty);
  23. }
  24. //UpdatePwm6
  25. void  UpdatePwm6(u16 pwm_tmp6)
  26. {
  27.   P_SW2 |= 0x80;
  28.   PWMB_CCR2H = (u8)(pwm_tmp6 >> 8); //设置占空比时间
  29.   PWMB_CCR2L = (u8)(pwm_tmp6);
  30.   P_SW2 &= 0x7f;
  31. }
复制代码

测试效果600RPM
1.jpg
  
测试效果1200RPM
2.jpg

测试效果1800RPM
3.jpg

测试效果8000RPM
4.jpg

测试效果12000RPM
5.jpg

完整代码
FG-PID.rar (36.98 KB, 下载次数: 271)









回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15648
发表于 2022-12-27 11:52:20 | 显示全部楼层
感谢分享,一起成长
  • 打卡等级:常住居民III
  • 打卡总天数:184
  • 最近打卡:2025-05-03 00:56:34
已绑定手机

0

主题

42

回帖

1326

积分

金牌会员

积分
1326
发表于 2022-12-27 12:16:04 | 显示全部楼层

感谢楼主分享:lol
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-03-27 11:14:39

0

主题

16

回帖

678

积分

高级会员

积分
678
发表于 2024-3-13 15:50:09 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:504
  • 最近打卡:2025-05-03 07:29:10
已绑定手机

1

主题

836

回帖

1455

积分

金牌会员

积分
1455
发表于 2024-7-11 16:31:44 | 显示全部楼层
微信截图_20240711162326.png
由于积分太少无法兑换试验箱,最近自己在弄开发板,打算把4线温控风扇加到开发板上,因此又来回顾这个问题,以上是INTEL对4线PWM风扇的FG信号及PWM信号的描述。

靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:504
  • 最近打卡:2025-05-03 07:29:10
已绑定手机

1

主题

836

回帖

1455

积分

金牌会员

积分
1455
发表于 2024-7-11 16:46:36 | 显示全部楼层
01.png
FG信号是由风扇输出,风扇每旋转一周输出两个脉冲信号,手册明确写了是开漏输出,单片机接收信号需要加上拉电阻,当然也可以用单片机内置的上拉电阻。

靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-05-03 23:41:15

73

主题

5884

回帖

1万

积分

超级版主

积分
12085
发表于 2024-7-11 17:17:56 | 显示全部楼层
使用外中断+定时器测周期误差还是很小的,因为外中断响应很快的,使用下降沿中断,信号的占空比可以有抖动,但是同一边沿的抖动很小的。
如果风扇响应慢,则减慢采样处理速度,PID能适应很慢的控制,比如温度控制,几个小时的响应都可以,更别说风扇了。如果FG信号本身抖动比较大,则通过平均值滤波就能抑制抖动。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:504
  • 最近打卡:2025-05-03 07:29:10
已绑定手机

1

主题

836

回帖

1455

积分

金牌会员

积分
1455
发表于 2024-7-12 10:47:48 | 显示全部楼层
本帖最后由 小涵子爸爸 于 2024-7-12 17:45 编辑

01.png
麻烦梁工帮忙看下这样设计是否可行,8H8K64U使用5V供电,普通电脑4线风扇(供电是12V)。由于INTEL手册说风扇内部已经上拉了5V,PWM端口需要使用开漏输出,但是PWM会自动改变端口状态为强推挽,因此又加了一个NMOS。这样设计是否可行呢,是否还有改进的空间,麻烦帮忙看下,谢谢!



靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-03 12:19:08

2

主题

36

回帖

856

积分

高级会员

积分
856
发表于 2024-7-31 09:08:27 | 显示全部楼层
每次外部中断中读定时器的计数值不行吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:196
  • 最近打卡:2025-04-30 14:16:27

5

主题

24

回帖

415

积分

中级会员

积分
415
发表于 2024-7-31 10:14:42 | 显示全部楼层
研究一下
挟飞仙以遨游,抱明月而长终!
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 05:54 , Processed in 0.176833 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表