12伏风扇PWM控制与转速反馈

在现代电子设备中,风扇是散热的关键部件之一。随着技术的发展,风扇的控制变得越来越精细。本文将介绍如何使用ESP32等微控制器控制12伏风扇,并实现5伏PWM输入和5伏转速计输出。将探讨硬件差异、环境因素对风扇响应曲线的影响,以及如何通过PID控制算法实现精确的转速控制。

理解风扇控制的复杂性

主要讨论的是带有转速计的4针风扇。市面上广泛使用的PC机箱风扇通常具备这一特性,本文的代码测试就是基于Noctua NF-A14风扇进行的。硬件设备在不同设备之间,甚至在不同时间点上,其特性可能会有所不同。此外,环境因素也会影响设备的性能。例如,如果阻塞了风扇的气流,即使信号保持不变,风扇的转速也会发生变化。

因此,需要一种自适应的控制方式来达到目标转速。同时,它需要足够平滑,避免在无法精确达到目标时在最近较低值和最近较高值之间循环切换,这种现象称为抖动。

控制算法的基本原理

代码的基本工作原理是持续采样转速,然后向上或向下调整占空比,直到达到目标转速,或者接近目标转速到足够接近,以至于尝试更接近会导致抖动。

需要注意的是,这种代码在某些情况下仍然可能导致抖动,尤其是当设置的转速远低于最小操作转速时。更准确地说,它在大多数情况下显著减少了抖动,消除了抖动。

它还需要针对不同的风扇进行一些调整。为算法提供了一些默认值,这些默认值基本上应该可以工作。使用所谓的PID来实现对目标转速的精确控制。

硬件连接

需要一个能够提供大约0.2安培电流的12伏电源,以确保安全。要运行这个项目,需要一个ESP32,但如果修改代码,也可以使用Teensy或其他设备。

需要一个电平转换器,因为风扇的PWM和转速计工作在5伏,而ESP32工作在3.3伏。

在连接4针风扇时要小心,确保插头与引脚布局正确对齐。在通电之前,请务必检查所有连接。如果连接不当,可能会损坏设备。

需要将PWM和转速计引脚连接到电平转换器的高侧。将转换器上的5伏Vin连接到ESP32开发板的5伏上。将转换器上的3.3伏Vin连接到ESP32的3.3伏输出。将所有的地线连接在一起。这意味着ESP32的地线、风扇的地线和电平转换器的地线。

将ESP32的GPIO 22连接到风扇的转速计低电平转换侧。将ESP32的GPIO 23连接到风扇的PWM低电平转换侧。将风扇的电源连接到12伏电源。

将ESP32插入电脑。

编写代码

使用代码通常比创建它要简单。首先,需要在Platform IO INI文件中添加一个条目,或者下载代码并将其包含在项目的库中(对于Arduino IDE等)。

lib_deps = codewitch-honey-crisis/htcw_fan_controller ; PIO ini entry for lib

接下来,在项目中包含文件,并可选地导入arduino命名空间:

#include using namespace arduino;

现在应该声明风扇。这取决于平台:

// four pin fan: fan_controller fan(pwm_set, nullptr, TACH_PIN, MAX_RPM); // three pin fan: fan_controller fan(pwm_set, nullptr, MAX_RPM);

上述假设已声明void pwm_set(uint8_t duty, void*),并将为设置占空比。使用内置的PWM通道,8位分辨率可能看起来像这样:

static void pwm_set(uint16_t duty, void *state) { // input is 16-bit // write a 8-bit duty ledcWrite(0, duty >> 8); }

在setup()中,必须在使用风扇控制器之前调用initialize()。在loop()中,将想要调用update()。

只需使用rpm() get/set访问器来检索和设置目标RPM。如果没有可用的读数 - 或者从未有过 - 它将返回NAN。

可以使用pwm_duty()访问器来设置或检索16位值空间中的PWM占空比。这样做将放弃任何自适应RPM定位,并将设备设置为指定的占空比。

在初始化之前,可以使用find_min_rpm()和find_max_rpm()检测最小和最大RPM。如果将NAN作为max_rpm参数传递给构造函数,最大RPM将在initialize()上检测。当然,这只适用于4针构造函数。请注意,最小RPM是自适应定位的最小有效RPM。通常可以通过手动设置pwm_duty()来降低。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485