本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

智能PC水冷控制器

发布时间:2022-06-07
分享到:

智能PC水冷控制器

发布时间:2022-06-07
分享到:

背景

你的电脑有水冷系统吗?你喜欢把一些凌乱的东西让它们变得很整齐吗?这个项目有可能适合你。就您的水冷进行精确监测和控制而言,这是一个完美主义者的梦想。即使您没有水冷,您也可能会发现它很有用,只需使用一些代码片段来为其他东西或其他东西制作风扇控制器。

TL/DR
该项目涉及以下功能:

  • 通过调节风扇速度将水温稳定在给定水平
  • 通过泵速稳定冷热水差
  • LCD 监控 NVidia GPU 核心和 VRAM 温度
  • 自动检测是否在 PC 上运行加密挖掘应用程序以相应地设置操作模式
  • 按下按钮即可切换 LCD 背光(例如,使用 PC 重置按钮)
  • 通过在 PC 上运行程序(例如,绑定到键盘热键)来切换 LCD 背光

介绍
我有一台装有 RTX3090 的 PC,采用 EKWB 的双夹层水冷头进行水冷。我面临着一个挑战:如何控制水冷。问题是,在 BIOS 中,没有根据 GPU 温度控制风扇和泵的选项。所以我想,根据水温进行冷却应该可以解决问题。令人高兴的是,我的主板有一个用于外部 10k 热敏电阻型 NTC 温度传感器的接头,并且有这样的传感器可用于在您想要的任何地方与您的水冷回路串联 - 我选择了Alphacool Icicle 温度传感器我把它放在“冷水”位置,水从散热器流出并进入显卡,因为这决定了冷却能力。我设置了一个风扇曲线来响应水温,结果我很失望。温度读取分辨率仅为 1°C,我发现要保持水冷系统合理响应,风扇曲线必须非常陡峭。当水温读数从 40.0°C 跃升至 41.0°C 或 39.0°C 时,这导致风扇烦人地上下颠簸。我不想这样。所以我转向使用 Arduino 进行外部风扇控制和监控项目,因为无论如何我都想学习 Arduino!

有了这个,您可以根据 GPU 温度驱动水冷系统。默认情况下,它没有 GPU VRAM 温度读数(RTX3090 上的温度会变得很热,所以这对 IMO 来说非常重要),我已经致力于提出自己的硬件解决方案,所以它来了!

智能水冷理论
我从水冷的物理计算开始,所以解决这个问题对我来说很有趣。我不会用物理学的细节让你厌烦,所以只是我发现的关键信息:

  • 循环中冷热水之间的温差 ΔT 完全由 GPU 功率和水流量决定。过大的流量会使ΔT变小,而较小的ΔT并不一定能提高冷却效率。以适当的速度驱动水泵是有意义的,以最大限度地提高冷却效率并延长泵的使用寿命。诀窍是将 ΔT 保持在合理的水平。我估计大约 2°C 的 ΔT 对冷却效率最有效。这实际上意味着 GPU 上最热的 VRAM 芯片将是 72°C,而最冷的则是 70°C。
  • 根据 ΔT 设置泵速后,唯一要控制的变量就是风扇的速度,它们有效地确定了水温。给定上一步中设置的泵速,稳态下的水温基于当前 GPU 功率和风扇速度进行平衡。因此,设置风扇速度以保持水温恒定可提供一致的冷却性能!

由于我们需要 ΔT,因此需要第二个传感器,我将这个传感器安装在热水位置 - GPU 加热的水进入散热器。

I2C 配件
本段的前注:当我使用 I2C 扫描仪 Arduino 草图确定 I2C 设备的地址时,我对它们进行了硬编码。如果您遇到一些不工作的 I2C 设备,它可能有不同的地址,所以为了确保地址正确,请使用 I2C 扫描仪 Arduino 程序,如下所示:https ://create.arduino.cc/projecthub/abdularbi17 /how-to-scan-i2c-address-in-arduino-eaadda

PWM 风扇控制 25kHz

好的。现在我们来到 Arduino 方面。我偶然发现了一些用于控制 PWM 风扇的 Arduino 项目,但它们大多需要接管定时器来合成控制风扇或泵所需的 25kHz PWM 信号,我宁愿避免这种情况,因为我不知道那是不是会削弱我可能希望 Arduino 执行的任何其他功能。有一个库FanController ( https://github.com/GiorgioAresu/FanController ),但我不太确定它会产生 25kHz 信号,这对 PWM 风扇很重要。此外,合成 2 个独立的 PWM 信号显得更加棘手。所以,相反,我发现了风扇控制器 IC MAX31760,它通过 I2C 协议与 Arduino 连接。Microe 制造开发板Fan2Click板载这些 IC,方便在我的原型中使用!我有 2 个,一个用于泵,一个用于风扇。在同一 I2C 总线上使用多个相同设备时,您需要确保它们具有不同的地址,以便它们可以独立寻址。为了做到这一点,我拿了第二个 Fan2Click,从 0 位置拆焊了一个地址跳线,并将其焊接回 1 位置,如下图所示。此外,移除两个 Fan2Clicks 上的跳线,以启用 4pin 风扇兼容操作!

出现了一个障碍——我找不到这个芯片的开源 Arduino 库,所以我必须创建自己的函数:从基本的函数,比如从内存中的特定地址发送/读取字节,到函数,比如“set风扇速度到 X”和“读取转速表”。我对 MAX31760 的数据表很感兴趣,了解了 I2C 协议的详细工作原理,并适当地编写了我的代码。

10bitADC/DAC 和模拟温度测量

对于模拟温度读数,我找不到专用的 I2C 芯片,所以我决定创建一个简单的分压器并使用 Microe 提供的通用 10 位 ADC/DAC,它被称为ADAC Click ,它有一个AD5593R芯片在船上。

为什么我没有使用 Arduino 的内置 ADC/DAC?有一些原因:

  • DAC 在 Arduino 上以 PWM 模式工作,而不是在稳定的电压下工作。我本可以使用高 5V 输出来偏置分压器,但我发现这对于 10k 热敏电阻来说可能太多了。我不确定,但我宁愿安全起见。
  • Arduino 上的 ADC“只有”8 位。对于大多数应用程序来说可能没问题,但如果您需要 0.1°C 的精度,则最好在此应用程序中使用 10 位。

幸运的是,AD5593R有 Arduino 库 ( https://github.com/LukasJanavicius/AD5593R-Arduino-ESP32-Library ),所以它非常容易实现。只需确保在安装库之前注释AD5593R.h中显示“ #define AD5593R_DEBUG”的第 31 行。如果你不这样做,调试会不断地通过串行总线发送读取和设置电压并使其保持忙碌——除非你真的在调试,否则你不希望这样。

温度的测量相对简单。您可以将 10k 热敏电阻基本上视为电阻器,其电阻取决于它们的温度。因此,一旦您测量了电阻,您只需要将电阻转换为温度。为了测量电阻,我实现了简单的分压器(参见:后续部分的接线图)。然后,为了将电阻转换为温度,我使用了表格中的值:https ://www.yumpu.com/en/document/view/37022739/10k-2-thermistor-output-table-10k-2-thermistor-output -table-bapi

我采用了这些值并使用了热敏电阻的物理特性。热敏电阻的电阻 R 与温度成指数关系,遵循等式 1,其中 r_∞ 是无限温度下的假设电阻,E_A 是所谓的活化能,k_B 是玻尔兹曼常数。等式 1 可以转换为等式 2 - 你只需要建立 A 和 B 的值,我通过将等式 2 拟合到上面提到的表格中的数据来完成,我得到 A= 2.5490E-4 和 B = 1.0062E-3。注:“log”为自然对数。请记住,这样您就可以得到开尔文的温度 T,因此只需从结果中减去 273.15K,就可以得到以°C 为单位的温度!

I2C液晶显示器

我还想要一台 LCD 显示器,我使用了广为人知且深受喜爱的 20x4 LCD 和 I2C 背包。为了切换背光,我连接了 PC 的复位按钮,以将 Arduino 的上拉输入引脚缩短至接地。最后,这个按钮很好用,以前从未按下过!要使用 I2C LCD,请确保安装库https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

准备 Python 以与 Arduino 通信
最后但并非最不重要的一点是,我包括了 GPU CORE 和 VRAM 温度监控。这比我预期的要棘手,但我找到了方法,我将针对我的特定情况进行解释——只要你有最新的驱动程序,它应该适用于现代几代 nVidia GPU。当我使用 MS Windows 10 操作系统时,我将针对我的情况进行描述。

  • 您需要的第一件事是在您的 PC 上安装 python3:https ://www.python.org/downloads/
  • 安装 PIP,一个包安装程序:https ://phoenixnap.com/kb/install-pip-windows
  • 在命令行中输入pip install pynvraw以安装 pynvraw 包 - 这是用于以编程方式访问 GPU 的信息。
  • 当您使用它时,对我稍后将展示的 python 程序所需的其他包执行相同的操作:pip install X,其中X是serial 、time和psutil ,一一对应。Serial 用于与 Arduino 的串行通信,time 用于计时和延迟,psutil 用于检查正在运行的进程(您将在下面看到它变得重要的地方)。

我想要的另一个功能是使用键盘快捷键切换 LCD 背光,除了之前提到的重置按钮。这似乎有点障碍,因为当一个程序已经通过 USB 向 Arduino 开放 COM 端口时,另一个程序无法打开它!所以解决的办法就是以0.5s的间隔循环打开端口,将GPU数据发送给Arduino,然后马上关闭,这样LCD背光切换程序就可以等待轮到它了。这种方法产生了另一个问题:打开 Arduino 的 COM 端口通常会重置 Arduino!我不想那样。解决方案是禁用 DTR。

在禁用 DTR 的情况下,打开端口先向 Arduino 发送一些垃圾字节,然后再发送实际数据,所以我必须在 Arduino 端读取垃圾字节,直到自定义温度编码和加密矿工检测:

为了使端口尽可能短地打开以确保顺利运行,我决定对数据进行“编码”或“压缩”。数据是:GPU CORE 温度精度为 0.1°C(例如 54.1°C),VRAM 温度精度为 1°C(例如 68°C)。因此,如果您将数据作为字符串发送,如果您乘以 10 并舍入为整数(例如 541),则 CORE 至少需要 3 个字节,VRAM 需要 2 个字节(例如 68)。相反,我将数字编码为以 94 为基数的整数,并将它们作为字符串的字符发送,偏移 33(字符 33 是​​“!”)。我选择了 33 的偏移量来保持 0 到 32 之间的字符作为控制字节,我将来可能会使用这些字节来改进我的项目。我知道这很复杂,但它只允许我将 2 个字节用于 CORE temp 和 1 个字节用于 VRAM temp 信息。

在 python 代码中,有一个函数可以检测进程“挖掘机”是否正在运行,并将发送到 Arduino 的最后一个字节设置为 Y(是的,它正在运行)或 N(不,它没有运行)。如果没有从串行接收到数据,在 Arduino 中将“挖掘模式”设置为默认值是很重要的,因为最好有更强的冷却,以防 python 因某种原因崩溃。

总之,我从 python 发送的字节依次是:[空格键][CORE byte 1][CORE byte 2][VRAM byte][Is excavator open Y/N]。

LCD 背光切换是一个简单得多的 python 程序,它只发送一个空格键和一个制表符 \t (char 9)。我将程序绑定到键盘快捷键。

调整泵和风扇PWM的算法
我没有费心将 PWM 转换为百分比刻度 - 我更喜欢将其保留为从 0 到 255 的字节整数,255 表示 100% PWM。我的方法是创建一种“恒温器”——根据实际温度与设定温度目标的偏差有多大,定义在循环迭代中改变多少 PWM。这是changePWM(int num, float Temp, float TempSetPoint)我的 Arduino 代码中的函数。num是风扇控制器编号(1 - 泵,2 - 风扇),Temp是测量温度,TempSetPoint是温度设定点,不言自明。为了控制泵,如前所述,温度参数是热水和冷水之间的差异。对于球迷来说,争论的是冷水温度。

该算法是一个整数线性函数:

int deltaPWM = (Temp-TempSetPoint)*PWM_SLOPE;

然后,如果计算deltaPWM超出 +/- 的范围PWM_DELTA_MAX,则将其置于相应的范围限制。PWM_SLOPE决定了算法对温度偏差的反应程度。然后,将 PWM 更改deltaPWM为 的最大值255或降低到 的最小值0。

无缝 PWM 条形图
我想出了泵和风扇当前 PWM 的无缝条形图。挑战在于 I2C LCD 上的字符之间存在 1px 宽的间隙。所以,我决定制作一个每个字符 3 行的图表,背景为虚线,在我的 LCD 上看起来像这样:

它只需要 4 个自定义字符即可定义:0、1、2 和 3 条。该功能displayPWMChart可以解决问题。您可以弄清楚该功能的主要工作方式;需要解释的是如何计算要显示的条数。它是通过整数计算来完成的int bars = (pwm+7)*18/255;。这个数字18来自我拥有的条形总数(6 个字符宽图 x 3 个条形每个字符),255是 PWM 的最大值,7我选择模拟“舍入”的偏移量,就好像这是一个浮点计算,而不是整数 - 这只是为了计算效率。

接线图

未来可能的改进方法
我可以预见一些改进的方法。第一件事是设计和制造一个实际的 PCB 将所有东西连接在一起,而不是 3D 打印和手工连接所有东西。甚至可以使用 Atmega 328p 微控制器(Arduino 拥有的那个)和点击板上的 IC(AD5593R-theADC/DAC,和 MAX31760 - 风扇控制器),并将所有必要的无源元件整齐地连接到一个微型 PCB 上,这将是项目小型化的好方法!也可以尝试其他显示器。我还在考虑将转速信号连接到 PC 主板风扇接头,以便 PC 也可以读取泵/风扇速度,但我不确定它是否会像制作一个分离器那样简单,我没有想冒险。添加另一个热探头来监控 PC 机箱内的温度也不会造成伤害。

最终项目概要和照片
我在这个项目中获得了很多乐趣,通过做一些真正有用的事情来学习。我相信有很多方法可以改进它,也欢迎您提供所有反馈。我不是程序员大师,也不是电子专家,所以代码或接线肯定达不到最高标准。但效果在我看来是很好的!

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Seventz,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论