什么是四线风扇?
四线风扇常用于冷却电子设备,如台式电脑的CPU和机箱。四线连接允许外部控制设备调节风扇转速并监测旋转速度。这是一种理想的节能特性,因为受控风扇能以最低必要速度运行。从人因工程角度看,低速(最佳转速)风扇更受欢迎,因其产生的噪音污染更小。
本工程简报展示如何用Arduino微控制器监控四线风扇。如图1所示,我们将使用Arduino Nano Every和台达电子AUB0912HJ-00。
图 1 :台达电子AUB0912HJ-00四线风扇由Arduino Nano Every微控制器监控。
视频 1 :风扇转速积分控制演示。注意BK Precision 1550电源通过前面板USB端口为Arduino供电。
四线风扇每条线的作用是什么?
四线风扇采用带集成驱动器的无刷直流电机。这种风扇加电机控制电路专为简易集成到更大系统(如台式电脑主板控制器)而设计。
集成电机控制器有两个电源连接点(典型12V直流)。还有转速控制输入线和转速计输出线。AUB0912HJ-00接线定义如下:
- 红色:正极12V直流
- 黑色:12V直流回路这也是控制逻辑线的公共地线
- 黄色:采用脉宽调制(PWM)驱动信号的转速控制
- 蓝色:开集电极输出的转速计
电机如何解读 PWM 信号?
台达电子AUB0912HJ-00风扇转速由脉宽调制(PWM)信号控制。需知PWM信号是固定频率的方波。其智能信息(风扇转速)编码为方波的脉宽(导通时间)。在本应用中,风扇的内置电机控制器设计用于接收频率为25 kHz的逻辑电平波形。当占空比达到约40%时,风扇将开始旋转。当占空比为100%时,风扇将达到全功率运行。
技术提示 :脉宽调制是一种通信形式。在某些方面,它类似于我们熟知的调幅(AM)或调频(FM)广播。无论哪种方式,我们都是通过将信息信号加载到高频载波上来实现通信。对于PWM而言,载波频率是固定的,我们通过调制脉冲宽度来传递信息。占空比这个术语用于描述加载在信号上的信息特征。占空比定义为信号开启时间相对于总信号周期的比例。例如,假设频率为25 kHz。一个占空比为25%的信号,其开启时间为10微秒,总信号周期为40微秒。更多信息请参阅这份Arduino技术说明。
转速计输出的本质是什么?
转速计的设计目的是响应风扇的旋转速度。例如,您的自行车可能装有速度传感器。在本应用中,一个小型永磁体被安装在轮辐上。然后安装霍尔效应传感器来检测磁体。由此产生的转速计将为轮胎每转一圈提供一个脉冲信号。
风扇的转速计电路稍显复杂。它不输出单一脉冲,而是提供方波输出。该设计将风扇旋转划分为4个象限。每转一圈方波会发生4次跳变:第1和第3象限时信号为逻辑高电平,第2和第4象限时为低电平。
如何利用转速计测量电机转速?
可通过以下几种技术确定风扇的旋转速度:
-
基于上升沿的脉冲计数,或计算每个信号跳变。请注意,变化检测能识别上升沿和下降沿。这会使检测到的事件数量翻倍。
-
测量与脉冲宽度相关的时间
例如,假设一个风扇以4200 RPM(每秒70转)的速度旋转。通过上升沿检测,我们每秒能检测到140个事件。若采用变化检测,每秒则可检测到280次变化。
若使用时间测量系统,我们可检测上升沿之间的时间差。对于同样4200 RPM的风扇,测得上升沿间隔时间为7.14毫秒。当该风扇以1000 RPM运行时,事件间隔时间将延长至30毫秒。
技术提示 :风扇标称的4600 RPM转速可能看起来很快。但从微控制器的角度来看,这其实非常缓慢。微控制器能够测量转速快两到三个数量级的转速计信号。此外,后续将展示这种迟缓的测量方式会使得直接控制风扇转速极为困难。若要更深入理解微控制器测量机械系统的能力,请参阅这篇关于正交编码器的文章。
Arduino 如何物理连接四线制电机?
风扇与Arduino的连接方式如图1所示。注意黄色PWM信号线连接至D3引脚。蓝色转速计信号线连接至D2引脚,并配有LED和内置电阻,为开集电极连接提供上拉电阻。
风扇通过红黑导线由12V直流电源供电。需注意12V直流电源的回路与Arduino共地。
Arduino 如何控制风扇电机转速?
四线制风扇的转速由PWM信号控制。根据风扇数据手册,该PWM驱动信号的频率应为25 kHz。
这与Arduino Nano Every默认的976 Hz PWM频率存在冲突。实验表明风扇仍能在此不匹配条件下运行。但这正是探索微控制器PWM技术的绝佳机会,可深入剖析硬件计时器在Arduino中的实现机制。如需了解更多信息,请参阅这篇相关文章,其中演示了如何为32 kHz 8位PWM配置Arduino Nano Every。该技术虽简单,但逆向工程过程确实需要时间理解Arduino IDE的硬件抽象层及ATmega4809内部工作机制的设计。
手动调速程序
这个简短的Arduino示例展示了如何根据电位器输入控制风扇转速。在setup()函数中可见PWM被配置为32 kHz。我们还配置了输出引脚并实例化了串行接口。
下载示例代码:fan_simplified.ino(1.8 KB)
在loop()函数中,我们从电位器读取手动设定值。将10位结果截取为8位后发送至PWM。风扇转速被测量并发送至串行监视器。
注意代码使用了带标志和邮箱同步的ISR,将变量从中断服务程序传递至主代码。同步机制说明请参阅本文。务必理解"原子性"这一术语,它涉及微控制器内存传输的不可分割单元。
技术提示 :"grok"一词意指对某个主题有深刻直觉性理解。本应用中存在基本同步问题,必须在微控制器异步部分间传输数据时解决。若未妥善处理,将遭遇与数据损坏相关的间歇性故障。本文示例代码采用的标志与邮箱同步是良好的起点。后续可尝试启用/禁用全局中断来保护代码关键段。
自动调速程序
至此我们已掌握控制风扇转速的方法及可靠的实时转速监测方案。下一步自然要实现闭环控制系统来调节转速。比例积分微分(PID)控制器是天然选择。虽然这个想法很好,但我们发现PID与风扇特性并不匹配。风扇动态特性与我们监测其转速的能力存在巨大差异。
根据经验法则,PID控制器的数字实现要求测量系统运行速度约比被控系统时间常数 \tau 快十倍。该风扇的时间常数为数百微秒。遗憾的是,我们测量转速的能力大约处于同一数量级,尤其在风扇低速运转时。尝试实施P或PI控制器导致了系统振荡。人类对音调变化的高度敏感性加剧了这一问题。风扇速度的任何不稳定或波动都会被立即察觉。
风扇控制仍可用于热力系统的PID控制。与其测量风扇转速,不如测量系统温度。随后可采用PID或单纯P系统进行温度调节。
技术提示 :时间常数(tau或 \tau )用于描述简单一阶系统(如风扇转速)的动态响应。您可能从电阻电容(RC)时间常数的学习中回忆过这个概念。需注意系统达到最终值63%需要一个时间常数。
使用纯积分控制器
在结束前需说明,该风扇采用积分控制响应良好。之所以如此断言,是因为风扇作为非关键系统需求非常简易。这是展示长尾响应的绝佳教学案例,如视频1所示。
演示代码下载地址:fan.ino(2.7 KB)。我们再次采用了带标志位和邮箱同步的中断服务程序。
完整的PID讨论将留待后续进行。但基础控制逻辑基于以下原则:
float error = setpoint - RevPerMin;
if (fabs(error) > 50) { // Lockout to prevent wandering
integral = integral + (error * KI);
integral = limit(integral, -255, 255);
}
积分变量是随时间累积增长的累加器。每个循环迭代都会向累加器添加误差的分数分量。最终项通过PWM驱动风扇运转。极性设置使累积误差推动系统趋近设定点,从而消除误差。图2展示了典型的阶跃响应。这种迟缓响应在视频1中也有体现。
图 2 :积分控制系统对阶跃变化的响应缓慢,需要超过30秒才能使测得的风扇转速(橙色)达到设定值(蓝色)。
最后的思考
Arduino微控制器可用于控制和监测四线风扇的转速。接口非常简单,仅需为转速计信号配置单个外部或内部上拉电阻。
乍看之下,这款风扇似乎是实现PID控制系统的低成本方案,因其价格低廉且与Arduino的接口简单。遗憾的是,该系统动态特性并不理想。这种表现不佳的系统只会让试图学习控制理论的学生感到困惑。但它仍可作为反例,展示时间常数的重要性以及及时测量被控参数的必要性。
请在下方留下您的评论和建议。若您成功将此四线风扇集成到项目中,请附上相关图片。此外,敬请关注我们将探讨的其他PID控制系统。我们将展示一个响应灵敏、令人满意的伺服电机系统。
请务必查看此链接以获取相关的 Arduino 教育内容。

