×

使用此双风扇控制器静音运行

消耗积分:0 | 格式:zip | 大小:0.03 MB | 2023-02-02

郭中

分享资料个

描述

简介

我更喜欢安静和平静的环境。这就是为什么我更喜欢从 BBC Radio 4 或 Classic FM 收听更柔和的广播。这就是为什么我喜欢 Elecraft 和 Ten-Tec 的 PIN 二极管装置上的完全磨合 CW。这就是为什么我为 macOS 运行 Mac Mini 和为 Windows 运行无风扇工业 PC 的原因。

通常情况下,设备冷却和设备噪音齐头并进。需要的冷却越多,需要的气流就越多,产生的风扇噪音就越大。但是,风扇选择和安装选项将有助于减轻这种噪音。智能风扇冷却系统也将控制风扇速度。

该项目是一个单元的分支,该单元的目的是在炎热气候下冷却通信套件。需要监控和冷却设备,同时将噪音水平保持在低水平。它适用于冷却假负载、电源、计算机、照明……

计划

寻找解决方案后发现,廉价的中国单板控制器仅提供了一种简单的风扇曲线解决方案。这些控制器只是根据风扇速度跟踪温差。可以修改的参数不多。在天平的另一端,有复杂的冷却控制器系统可用于游戏电脑,使用 PC 软件。这些是完全可配置的系统,能够平衡所需的冷却性能与产生的声级。

很难找到中间解决方案。介于简单的独立板和 PC 使用的复杂系统之间的一种。因此,设计了一个嵌入式系统来满足我的要求。从简单开始,然后根据特定需求构建设计。该项目很快就包含了一些易于定制的功能,这些功能可以根据个人温度和风扇速度要求进行设置。

特点

两个风扇控制器。

从 0% 到 100% PWM 的全风扇速度控制。

温度感应范围为 0 至 +120degC(32degF 至 248degF)。

风扇转速计读数为每分钟 9999 转。

显示风扇和温度信息的 OLED 显示屏。

风扇 PWM 命令条形图(10% 间隔)。

旋转编码器操纵配置菜单。

定义温度范围,从最小值到最大值。

定义风扇速度范围,最小到最大。

三个辅助 Fan-B 工作选项:

a) 主风扇 A 与辅助风扇 B 串联运行(对称)。

b) 主风扇 A,次级风扇 B 在对面运行(不对称)。

c) 主风扇 A 和辅助风扇 B 配置为热备用。

声音风扇 A 故障或停止警报。

夜光风扇-A 停机报警。

发光的 DS18B20S 传感器总线指示灯 LED。

发光的 +12V 和 +5V 电源 LED。

配置设置保存在 EEPROM 中,用于断电恢复。

用于设置温度单位(摄氏度或华氏度)的配置标头

用于设置对称、非对称或热备用模式的配置标头。

隔离的外部 P 输入,用于启用/禁用辅助设备的操作。

主风扇 A 故障检测,用于在热备模式下切换到风扇 B。

用于调试和固件上传的串口。

用于直接刻录到内存的威廉希尔官方网站 串行编程端口。

KF2510 3+1P,风扇连接器插座。

易于访问的板载复位开关。

两个版本

设计了两个版本。两者功能相同。但是,每个版本的创建都是为了满足个人需求和构建技能。

屏蔽版本:这是最容易构建的,因为 Arduino 板已经处理了一半的功能。防护罩就像任何标准防护罩一样连接到 Uno R3 板上。它以惊人的紧凑封装提供了运行所需的其余威廉希尔官方网站 。构建屏蔽版本更简单,但您仍然应该能够处理它使用的 15 个 0805 SMD。代码上传更易于管理,并且像往常一样通过 USB 串行端口使用 Arduino IDE 执行。

嵌入式版本:这是围绕 Atmega 328P-AU 微控制器构建的,具有独立独立单元所需的所有威廉希尔官方网站 。构建复杂性更大。您应该具备并精通SMD项目建设。请注意,您还需要熟悉 ICSP 端口。将代码上传到微控制器内存,至少在开始时,如果你愿意,直到你刻录引导加载程序。

手术

此代码是根据需要即时构建的。它从一个简单的温度跟踪风扇速度实用程序迅速发展为这个可定制的版本。毫无疑问,还有其他编程方法可以实现所需的功能。就是这样。无论如何,我的代码可以很容易地纠正、修改和改进,以使每个人都满意。

启动顺序

在通电或重置时,该装置会等待几秒钟,让仍在旋转的风扇停下来。所需的延迟可能取决于风扇旋转的难易程度及其动量。可以通过修改变量 spinDownDelay 在代码中定义延迟。

然后代码运行一个启动序列,该序列将首先测试风扇以找到其最小速度值。这个会用在运行过程中的停机检测fanJamCheck()函数中。此序列向风扇发送递增的 PWM 值,比例高达 20:100 (20%)。到那时大多数粉丝都会开始。在最终启动主代码和其中一种工作模式之前,它的进度会显示在 OLED 上。下面列出并解释了这些可选择的工作模式中的每一个。

两种基本的风扇模式是可能的:

首先,被动上下扫描模式仅遵循由 Fan Minimum 和 Fan Maximum 定义的定义曲线斜率。可以配置此扫描的速率,但不使用温度传感器数据来控制风扇速度。

其次,主动触发模式可激活风扇并根据温度最小值、温度最大值、风扇最小值和风扇最大值定义的曲线斜率控制其速度。有两种类型的主动触发模式。第一个子模式仅采用传感器温度输入来控制冷却风扇。第二种子模式采用传感器温度输入,但也需要输入电压 (P-IN) 来启用冷却风扇。这可以与辅助设备一起使用,仅在辅助设备认为有必要时才触发风扇控制器。

滚动浏览下面的图形,例如配置的斜率:

sweeping_sEXToD32iM.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 5 •三次扫描。每个被动地增加/减少风扇速度。不使用温度读数。

总之:

一种被动清扫模式:

此处,风扇速度将在之前由 Fan Minimum 和 Fan Maximum 定义的风扇速度斜率上上下扫动。不使用温度读数,但可以更改扫描速率。

两种主动触发模式:

此处风扇将在达到最低温度时触发,并且仅当启用 P-IN 输入时。

在最低温度下触发:

a) 从零风扇速度开始(风扇关闭直到被触发)。

b) 从风扇最小速度开始(风扇以风扇最小速度旋转直到被触发)。

在最低温度时触发,但仅当 P-IN 输入也启用时才触发。

a) 从零风扇速度开始。(风扇关闭直到触发)。

b) 从风扇最小速度开始(风扇以风扇最小速度旋转直到被触发)。

通过滚动显示的示例温度/风扇速度图表,可以最轻松地看到这些风扇模式以及它们与速度和温度的关系。

配置

定义装置的工作方式以及所需的冷却斜率是在配置模式下完成的。本质上是通过在图表上定义点来获得我们想要的斜率。我们可以通过按下旋转编码器按钮进入此模式。然后滚动浏览配置菜单,连续按下同一个按钮。在每个参数处转动旋转编码器以修改其值,从而定义新的操作模式或温度斜率。

配置菜单:

FAN MIN
设置最小风扇速度值(5% 步幅)。

FAN MAX
设置最大风扇速度值(5% 步幅)。

TEMP MIN
设置最低温度值,这将触发风扇至 Fan Min。

TEMP MAX
设置最高温度值,此时风扇将以 Fan Max 旋转。

MODE
扫描或触发

要设置一个被动的上下扫风扇速度。或者主动跟踪来自 DS18B20 传感器的温度数据的触发风扇速度。

SWEEP RATE
(如果之前选择了 Sweeping 则可用)1/Slow 到 10/Fast。选择风扇速度从风扇最小值扫到最大值的速度。

TRIGGER
(如果之前选择了 Triggered 则可用)

1 温度/零。温度从零开始。将在 Temp Min 触发并开始以 Fan Min 速度旋转。未触发时,风扇速度将等待为零。

2 温度/F最小值。风扇最低温度触发。将在 Temp Min 触发并开始以 Fan Min 速度旋转。未触发时,风扇速度将在风扇敏处等待。

3 针/零。温度从零触发,但需要外部 P 输入启用。将在 Temp Min 触发并开始以 Fan Min 速度旋转,但仅当由 P 输入启用时。未触发时,风扇速度将等待为零。

4 针/F 最小值。最低风扇触发温度,但需要外部 P 输入使能。将在 Temp Min 触发并开始以 Fan Min 速度旋转,但仅当由 P 输入启用时。未触发时,风扇速度将在风扇敏处等待。

TEMP OFFSET
-9 至 +9 度。要校正 DS18B20 传感器的任何温度误差,可以添加此补偿值。默认为 0 度,表示不进行校正。

SAVE & EXIT
Yes/No.Yes,将退出配置模式并伴有相应的莫尔斯“R”音和简短的“配置已保存”消息。您的设置将保存到 EEPROM。否,将再次循环配置选项。

由于 FAN MIN 和 FAN MAX 的值是相互依赖的。不可能将 FAN MAX 值设置为低于 FAN MIN 值或将 FAN MIN 值设置为高于 FAN MAX 值。同样,TEMP MIN 和 TEMP MAX 的值是相互依赖的。无法将 TMP MAX 值设置为低于 TEMP MIN 值或将 TEMP MIN 值设置为高于 TEMP MAX 值。

该代码限制了您可以设置的允许范围。例如,如果您不能选择较低的 FAN MAX 值,可能是因为您试图将其设置为低于 FAN MIN 值。

初始设置

安装单元后,以下选项应该很少需要更改。它们通过使用两个插头引脚跳线进行配置,其设置在打开或重置时读取。

1. 使用跳线 J1/U2 的辅助 FAN-B 设置:

ASYMetric:辅助风扇 B 将以主风扇 A 的相反速度旋转。因此,当风扇 A 处于最大速度时,风扇 B 将处于最小速度。这些风扇速度将动态地遵循 Fan Min 和 Fan Max 定义的温度斜率。

SYMMetric:辅助风扇 B 将与主风扇 A 同步旋转。因此,当风扇 A 处于最大速度时,风扇 B 也将处于最大速度。这些风扇速度将动态地遵循 Fan Min 和 Fan Max 定义的温度斜率。

STandBY:辅助风扇 B 作为主风扇 A 的备用风扇,处于热备用状态。因此,风扇 B 通常会保持关闭状态,直到风扇 A 卡住或发生故障。在 Fan-A 故障时,Fan-B 将接管。

2. 使用跳线 J2/U1 设置温度单位:

degF:华氏温度。在美国、利比里亚和开曼群岛使用。

degC:摄氏温度。与世界其他地方使用的一样。

积木

单片机:

我们不需要 ESP8266 或 ESP32 中的处理能力或附加功能。Arduino 平台及其 ATmega 328P 芯片具有足够的速度、内存空间和 GPIO 引脚。

当然,和原来的Arduino UNO R3一样,嵌入式威廉希尔官方网站 中使用了一个ATmega328P微控制器。该微控制器提供32K的闪存、2K的SRAM和1K的EEPROM存储。它的 16Mhz 时钟速度足以运行我们的中等任务,并且它有足够的输入/输出引脚来满足我们的需要。

选择了AU芯片封装。与大型 PU DIP 版本相比,它更小、更便宜且更容易采购。它是小型嵌入式板应用的理想选择。然而,在构建或测试时也不会太小而无法处理。在原型制作过程中,使用 QFP/TQFP32 芯片适配器将此 Atmega 328P 安装在面包板上。无腿 MU 版本虽然更小,但更难处理。

温度感应器:

Dallas Semiconductor DS18B20 可能不是最精确的温度测量仪器,但足以满足我们的使用需求。它测量的温度范围为 -55degC 至 +125degC(-67degF 至 +257degF),-10°C 至 +85°C 的精度为 +/-0.5degC。

出于我们的目的,代码将温度范围限制在 0degC 到 120degC(32degF 到 248degF)。超出此范围,它将在温度值旁边显示一个超出范围 (OOR)“感叹号”图标。该值将在 0degC 和 120degC(32degF 和 248degF)处触底。

明智地使用热风枪可用于测试较高的温度,一些电子元件冷冻喷雾可用于测试较低的温度。虽然我用的是迪卡侬运动员肌肉喷雾,这是我手头上的东西。它同样有效,而且闻起来更香。

ds18b20_R43JCA5Bkd.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 2 • DS18B20 引出线。

DS18B20 的三引脚 TO-92 版本可能是最容易使用的封装类型。带有 LED 的上拉电阻通过传感器的数据线连接到 Vdd 可改善数据传输并提供传感器与微控制器通信的一些视觉反馈。在这里,一个 2K 的电阻器可以很好地使 LED 闪烁。一些套件模块在这里使用 4.7K 值。这取决于特定 LED 上的电压降和所需的亮度。

有机发光显示:

使用小型 0.91" OLED。它具有 128 x 64 像素的可用分辨率,当与 Bill Greiman 的 SSD1306 库和“fixed_bold10x15”字体一起使用时,提供两行,每行约 12 个文本字符。这些 OLED 显示器有一个I2C 总线,完美适配我们的微控制器。所需的+5V 供电电压与板的其余部分相同,很方便。一些 OLED 板指定+3.3V 供电电压要求,这可以通过查看是否有来检查或者还不是+3.3V稳压器。我的板上有一个微型662K低压差+3.3V稳压器,确认它接受+5V,然后它自己转换为+3.3V。至于I2C逻辑电平输入,他们可以承受 +5V,我不需要电平转换器。

SSD1306Ascii 是 Bill Greiman 编写的用于小型单色 OLED 显示器的无缓冲字符库。我经常在使用带有 fixed_bold10x15 字体的 OLED 的项目中使用它。它为我在这些小显示器上疲惫的眼睛提供了可读的字符大小。对于这个特定项目,FAN_fixed_bold10x15 文件是字体的修改版本,我在其中添加了一些用于风扇控制器的额外图标。这个字体文件可以包含在同一个草图目录中,并添加到 Arduino IDE 中以便于编辑。

ide_1_KUUIUX76vi.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 2 • IDE 中的 FAN_fixed_bold10x15

FAN_fixed_bold10x15 是 fixed_bold10x15.h 字体,已通过添加风扇控制器的 OLED 显示屏使用的额外字符进行了修改。对这种字体进行逆向工程以创建自定义字符和图标将在后面详细介绍。

光耦:

PC817C 是一种通用光耦合器,在许多威廉希尔官方网站 中大量使用,以提供与辅助设备的电气隔离。此组件存在几个版本。这里使用了“C”后缀版本。不同的版本有不同的收获。光耦合器的增益表示为电流传输比 (CTR),即输出的集电极电流 (IC) 除以输入的正向电流 (IF),然后乘以 100%。您可以通过计算和更改电阻器 R3 的值以适应不同的增益来使用其他版本和测试功能。

在此版本中,计算出的 1K 电阻值运行良好。一些测量测试证实了理论:5V、9V、12V 和 13.8V 的 P-IN 电压分别产生 3.8mA、7.8mA、10.8mA 和 12.6mA 的电流。这些被认为是最有可能使用的辅助输入电压。由于该光耦合器的内部 LED 电压下降约 1.2V,因此它们各自产生相应的功率值,约为 4.5mW、9.4mW、13mW 和 15mW。查看数据表,我们允许的最大输入值为 If=50mA、Vr=6V 和 Pin=70mW。放置在输入 LED 两端的 1N4148 用于防止 Vr 高于 6V。允许的最大输出值为 Vce=35V、Vec=6V、Ic=50mA 和 Pc=150mW。MCU 的内部上拉似乎是 50k 左右,因为这里测量了 0.1mA。对于此光耦合器,Ptot=200mW 最大值(输入和输出功率的总和不得超过 200mW)。

可以按照类似的数据表建议使用其他光隔离器。或者,您可以通过取消光耦合器隔离并仅将使能 P-IN 拉低来简化威廉希尔官方网站 。MCU 的端口 B0 在代码中激活了其内部上拉电阻。

串行端口:

UNO R3 板上已经安装了串行端口。这用于以经典的 Arduino 方式上传和调试。

我还在独立版本中包含了一个串行端口。这 6 个接头引脚与大多数 FTDI FT232RL USB 转串口适配器模块完美对齐。如果有可用的引导加载程序,它还允许使用 Arduino IDE 进行调试,甚至可以上传草图。不要忘记将 FTDI USB 串行板切换为使用 +5V(而不是 +3.3V)。对于 USB 到串行编程和调试,风扇控制器当然应该打开。引导加载程序包含在 ATmega 数据表的第 26.6 节中。

serialsmall_HwRkTz5CAK.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

安装了 FTDI FT232RL USB 转串口适配器。

ICSP 端口:

UNO R3 板上已经安装了一个 ICSP 端口。这是直接将代码直接烧录到其微控制器内存所必需的,我们很少使用。这可能是制造商将 Arduino 引导加载程序烧录到 UNO 的方式。

我还在嵌入式版本中包含了一个 ICSP 端口。这是最初将引导加载程序刻录到独立版本的唯一方法。这些 3x2 接头引脚与大多数常见的 ICSP 编程器(如 USBasp)完美对齐。它允许直接加载 ATmega 328P。对于 ICSP USBasp 编程,风扇控制器应该断电,因为像 USBasp 这样的大多数编程器会为其目标本身供电。

usbaspsmall_H2YtUe3Za8.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

安装了 ICSP USBasp 编程器。

请注意,一些较旧的 ICSP 编程器需要来自其目标的电源才能运行,在这种情况下,风扇控制器单元应该通电。有些可能只需要查看 ICSP 引脚 2 上的电压即可运行。你的旅费可能会改变。始终最好检查您的特定程序员。

不要忘记将此板切换为使用 +5V(而不是 +3.3V)。ATmega 数据表的第 27.8 节介绍了芯片的在线串行编程。

转速计噪声滤波器:

来自风扇的 RPM 引脚 3 的转速计线路上的任何噪音都可能是一个问题并给出错误的读数。这种噪声可能是像脉冲一样的额外开关弹跳。尽管通常使用采用霍尔传感器或光耦合器的转速计威廉希尔官方网站 而不是机械开关。

以低 RPM 运行且存在这些噪声脉冲的风扇在评估实际 RPM 值时会产生更大的差异。

例如,在低速时,风扇可能会在 1 秒内发出大约 8 个脉冲。这 8 个脉冲等于 4 转/秒,因为风扇每转发送两个脉冲。因此,4 转/秒是每分钟 240 转(4 转 x 60 秒)。由于反弹而产生的噪声脉冲可能会产生额外的第 9 个脉冲,错误地等同于 270rpm(4.5revs x 60secs)。误差约为总实际值的 12%。

在较高的转速下,波形中的这些额外噪声脉冲对计算正确的 RPM 值的影响较小。例如,在更高的速度下,我们可能会得到 266 个脉冲,这实际上意味着 133 转/秒或每分钟 7980 转(133 转 x 60 秒)。这里的额外噪声脉冲总共提供 267 个脉冲,相当于 133.5 转/秒或每分钟 8010 转(133.5 转/秒 x 60 秒),这与总值的差异较小。误差低于总实际值的 4%。这只是一个例子,因为大多数风扇以最高速度运行在该值以下。

为了减轻任何噪声对风扇 RPM 输出的影响,使用由 R2 和 C1(屏蔽威廉希尔官方网站 )或 R7 和 C14(嵌入式版本)形成的积分器滤波器。通过一些计算和实验,找到了合适的时间常数。1K 和 1nF 的值提供了一个合适的时间常数,以滤除风扇转速计信号中出现的任何更高频率的噪声脉冲。

AMS1117 LDO稳压器:

这已经构成了 Arduino 电源子系统的一部分。它提供稳定的 +5V,也用于为风扇控制器屏蔽供电。就其尺寸而言,它是久经考验的坚固调节器。由不同的公司制造,很容易获得。不同的制造商发布不同的数据表,最大输入电压和功耗标准略有不同。我也在独立的嵌入式板上使用过它。

粉丝

我们需要四针、完全可控的 PWM 风扇。其他三个引脚承载电源、接地和 RPM 转速计脉冲波形。我已经决定在包含此风扇控制器的项目中使用 Noctua 风扇。他们以沉默寡言着称,但这并不是对他们有利的唯一特征。因为并非所有粉丝都是平等的。

当您将风扇命令为 0% PWM 时,它应该停止旋转。并非所有粉丝都这样做。即使在 0% PWM 下,很多也会继续旋转。为了完全阻止它们旋转,需要额外的威廉希尔官方网站 方法。

同样,在 1% PWM 下,风扇应该刚好开始旋转。事实上它不需要,因为大多数需要最小 PWM 才能开始旋转。根据风扇型号,所测试的 Noctua 风扇开始以 6% 或 10% PWM 旋转。下面的任何东西,它们都会完全停止。这是一个初始死区,其中风扇没有响应并保持静止。

不同制造商的不同风扇型号表现不同。没有遵守的标准化。Noctua、Arctic、Xilence 和 Cooler Master 的粉丝表现各不相同。生活艰难。

在风扇 A 开始响应之前,风扇控制器将首先尝试测量所需的最小 PMW。该代码使用函数 findFanStopLimit() 中的变量 fanStopLimit 来在开机或重启时查找此值。稍后它会在检测主风扇 A 因堵塞或故障而异常停止时使用此信息。

当然,只要考虑到一些注意事项,也可以使用其他风扇品牌和型号。一些风扇永远不会停止旋转,即使在使用 0% PWM 信号发出命令时也是如此。有些会以 100RPM 或更高的速度旋转,但永远不会停止。因此,它们在启动时检测到的 fanStopLimit 值将始终为 0%。

我喜欢风扇在 PWM 接近 0% 时停止,所以坚持使用 Noctua。这些在我所在的地区很容易找到和订购。可能存在其他品牌和型号,只要它们是完整的四针和 +12V 品种,它们就可以工作。

风扇有多种尺寸可供选择。常用直径有40mm、80mm、120mm、140mm。选择适合您任务的风机。如果只需要一个风扇,只需将其作为主风扇 A 插入即可。

代码

随着时间的推移和我觉得有需要,这段代码被构建并添加了特性和功能。我不是程序员,毫无疑问,程序流程中存在一些不必要的复杂性,类似于沙特尔的迷宫。整个代码中散落的全局变量也必然会增加效率。就是这样。它符合我的目的,并且不会明显减慢操作速度。

#define DEBUG 1或0用于开启或关闭串口输出调试信息。您的选择将在编译时设置。启用后,首先显示的是串行端口调试 OK 消息。然后是带有编译日期和时间的草图文件名。

#include "FAN_fixed_bold10x15.h"以允许使用我改编的 fixed_bold10x15.h 字体。它具有风扇控制器用来显示模式和状态的特殊图标字符。它应该与风扇控制器草图位于同一文件夹中。

需要使用 IDE 的库管理器安装的一些特定库是:

OneWire.h和DallasTemperature.h用于与 Dallas Semiconductor DS18B20 温度传感器通信。

EEPROM.h有助于访问微控制器的非易失性 EEPROM 存储空间。

SSD1306Ascii.h和SSD1306AsciiWire.h使用 OLED 显示器并访问其 I2C 总线。

需要TimedAction.h才能在代码中对不同的任务进行原型线程化。三个线程将伪同步运行。这些用于读取旋转编码器、读取 Fan-A 的 RPM 速度以及从传感器读取温度信息。

职能:

writeConfig()和readConfig()将配置数据读写到芯片的 EEPROM 存储器中。EEPROM 地址可以无限次读取,但平均只能写入约 100000 次。如果您每天更改配置 10 次,则相当于大约 27 年的写入周期寿命。函数firstRunCheck()查找 key1 和 key2 的值 73 和 42。两个任意数字。向各地的无线电爱好者和银河系漫游指南致敬。如果未找到,则该芯片以前从未配置过,函数firstLoadOfEeprom()将使用有效的 EEPROM 值填充新的微控制器芯片。

开机或重启时,函数findFanStopLimit()运行。这会找到主风扇 A 开始旋转时的 PWM 值。它将此值作为 minLimit 返回给变量 fanStopLimit。此 PWM 百分比值稍后用于检测主风扇 A 的停止或故障。

函数oneDit()和oneDah() 与oneRoger()一起使用以发出 Roger 确认“R”。它们还会产生 Fan-A 故障警报声。这两个函数从蜂鸣器中产生莫尔斯点和破折号的声音。这是我直接通过位操作端口 C 寄存器完成的,无源蜂鸣器连接到 PC0 和 PC1。驱动每个输出异相我们增加音量级别,因为我们实际上在无源蜂鸣器的压电板上有 10V 的电位差。

这类似于出色的 ToneAC 库的工作方式。但是,对于这个简单的应用程序,通过直接编写此函数的代码,我避免了使用该库。我们不需要它的音量和频率控制选项,也不需要它的定时器要求。

函数encoderRead()是一个原线程,每 50 毫秒触发一次以读取旋转编码器。

使用功能menuClicked()我们检测旋转编码器瞬时开关按钮的按下。

函数valueChanged()和delimitValue()用于选择每个配置参数的单独值。

函数oledDisplay()用于使用自定义字体打印到 SSD1306 OLED 的两行显示屏。

当达到并触发 TEMP MIN 的温度时,函数showTempTrigIcon()会显示一个温度计类型的图标。

函数tachCounter()是一个原线程,每 1 秒触发一次以读取来自主风扇 A 的 RPM 转速计波形。

函数getTemperature()是一个原线程,每 3 秒触发一次以查询和读取来自 DS18B20 传感器的温度数据。

函数triggerCheck()检查温度触发器,并考虑我们是否使用 P 输入模式以及 P-IN 接头处是否有启用信号。

函数fanBsetup()读取相关跳线位置以设置次级 Fan-B 在 switch ON 时的非对称、对称或待机工作模式。

函数fanBconversion()计算风扇 B 相对于风扇 A 的运行速度,同时考虑非对称、对称或待机的当前运行模式。

函数percentToPWM()将百分比速度值转换为适合直接馈送到定时器寄存器以进行 PWM 控制的值。这用于命令 Fan-A 的速度。

函数percentToBars()将向 Fan-A 命令的 PWM 显示为 OLED 显示屏上一行的移动条形图。

函数fanJamCheck()检查 Fan-A 的停止并在四次违规后发出信号。然后它会发出警报并闪烁红色警告 LED。

函数stepedIncrement()和stepedDecrement()在被动清扫模式下增加和减少风扇的速度。

函数pwm25kHzSet()将 PWM 频率设置为 25khz。需要进行此更改,因为风扇需要以 25KHz 运行的 PWM 信号,而可用的默认 Arduino PWM 频率仅为 490Hz 或 980Hz,具体取决于所使用的引脚。

ATmega328P 有三个定时器,我们可以随意使用。定时器是一个寄存器,它为每个时钟脉冲递增(或递减)。328P 有三个,它们的使用在 delay()、millis()、micros()、Servo()、Tone() 和其他库等函数之间兼顾。时钟频率取自 16MHz 晶振时钟。该时钟频率可以在馈送到定时器之前由预分频器分频。当定时器递增到其最大寄存器大小时,定时器将溢出。对于 8 位定时器的 timer0 和 timer2,这是 255(16 位定时器 1 为 65535)。也可以设置发生此溢出的值。我们不需要等到定时器寄存器达到 255(或 65535)时标记溢出。控制寄存器将定时器 1 配置为模式 10,无预分频,计数为 320。我们的 16Mhz 晶体时钟的值为 320 将为我们提供 25KHz PWM 信号。该代码使用函数 percentToPWM() 从用户友好的百分比风扇 PWM 值转换它。

中断服务程序encoderISR()用于读取旋转编码器。

中断服务程序tachISR()用于计算主风扇 A 发送的转速计 RPM 波形发出的脉冲。

EEPROM存储器

显示首次开机时加载的默认值的详细信息。

地址 0 key1 73d Dahdahdiddley...Diddleydahdah。

地址 1 key2 42d 生命、宇宙和一切。

地址 2 fanMin 10d 最小风扇速度 = 10%。

地址 3 fanMax 90d 最大风扇速度 = 90%。

地址 4 tempMin(°C) 40d 温度最低 40degC。

地址 5 tempMax(°C) 70d 最高温度 70degC。

地址 6 tempMin(°F) 100d 最低温度 100degF。

地址 7 tempMax(°F) 160d 最高温度 160degF。

地址 8 模式 1d 扫描。

地址 9 扫描速率 5d 5(中速)。

地址 10 从 0% 风扇速度开始按温度触发 1d。

地址11 tempOffset 0d 0度温度校正。

地址 12 保存并退出 0d 0。

代码的读写功能将跳过地址 4 和 5 或 6 和 7,具体取决于使用硬件跳线(屏蔽上的 U1 或独立 PCB 上的 J2)选择的温度单位。

自定义角色

SSD1306Ascii 库中包含的 fixed_bold10x15 字体是我的首选字体。它清晰易读。然而,它只给我们两行,每行大约 11 或 12 个字符来显示任何信息。我使用自定义图标字符在 0.91" OLED 小显示屏上获取更多信息。我修改了 SSD1306Ascii 库中包含的原始 fixed_bold10x15 字体。此修改后的字体是 FAN_fixed_bold10x15。它由代码调用,应该位于相同的位置草图文件夹。

额外的字符会将风扇控制器代码使用的特定图标打印到 OLED 上。它们包括生成风扇速度条形图、OOR 警告、摄氏度和华氏度符号、RPM 风扇旋转符号、RPM 风扇堵塞警告、使用中的触发模式、使用中的扫描速度和 P 输入启用图标的字符。

滚动浏览一些显示信息示例:

s5small_2vFPeAXw4G.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 6 • S5:以速度 5、28degC、210RPM、20%PWM 扫频。

条形图显示我们命令主风扇 A 的速度,精确到 10%。这个 PWM 条形图左边的两个字母显示了我们的工作模式。底线以 RPM 为单位显示温度和风扇 A 转速。超出范围的 OOR 温度会以“感叹号”图标表示。Fan-A 的任何长时间风扇停止也会在 RPM 图标内以“感叹号”表示。当风扇在达到最低温度值时被触发时,会显示“温度计”图标。在 P 输入模式下,“箭头”图标指示何时存在启用信号。

failsmall_deesSmavUA.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 3 •风扇 A 停止:红色警告 LED 闪烁。带有警告图标的零转速。

这些都是用笔和纸设计的,然后对原始字体文件进行逆向工程和修改。每个新字符的十六进制值都是通过编辑添加到原始文件中的。

font2small_PhNrUP2kBN.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 2

双板版本尽管运行相同的代码并且本质上相同,但下面描述的两个板版本是完全不同的。

pcb1small_rf0zl3inpk.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

屏蔽上面的PCB。下面的嵌入式PCB。

屏蔽板版本

背负式防护罩版本:这款 Arduino 兼容防护罩搭载在 UNO R3 上,构成了一个非常紧凑的单元。它比嵌入式版本更容易构建和编程。如果您想轻松修改我的代码并针对您的特定需求进行测试,这也是完美的选择。它只有 15 个表面贴装元件,如果您非常小心,只需用热风枪或热床和一些低温焊料即可焊接。

shieldversionsmall_0ZTfrQRTty.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

Arduino 屏蔽板。

主要成分:

Arduino UNO R3(已有 ATmega 328P 微控制器、时钟振荡器、电源输入和电压管理、复位系统、USB 串行连接、ICSP 连接等元素)。

DS18B20温度传感器。

光耦PC817C。

OLED SSD1306 0、91" 显示屏。

LED指示灯和无源蜂鸣器报警

用于菜单输入的旋转编码器。

板载复位按钮。

初始设置跳线头。

屏蔽版威廉希尔官方网站 原理:

该防护罩可整齐地连接到 Uno R3 板的顶部。它提供了一种将风扇控制器的特定威廉希尔官方网站 连接到 Uno 板上已有的微控制器和子系统的简单方法。参考屏蔽版原理图。

Fan-A 和 Fan-B 具有独立控制的 PWM 输出信号,这些信号取自引脚 D9 和 D10。RPM 测速波形取自 Fan-A,通过 RC 噪声滤波器并馈送到引脚 D2。用于计算和显示主风扇-A 的旋转速度。

引脚 D11 上的高电平将通过其 1K 限流电阻 R4 点亮红色 LED4。当代码确定主风扇 A 已卡住时,代码会执行此操作,以发出异常信号。同样,它将通过跨接在 A0 和 A1 上的无源蜂鸣器 SG3 发出警报。每个输出彼此异相,从而增加了表观音量水平。尽管如此,我还是有一个 220 欧姆的小电阻 R1 来将此处的电流降低到可接受的水平。此压电蜂鸣器也会在开机时发出声音,以确认配置设置已保存。

SSD1306 OLED 使用 I2C 总线。它的数据和时钟线连接到 Uno 的引脚 A4/SDA 和 A5/SCL。可能需要也可能不需要两个值为 5.1K 的上拉电阻 R5 和 R6。一些 OLED 板将在没有这些的情况下运行,因为它们已经内置了这些。

旋转编码器 SW1 提供了一种滚动和设置我们所需配置的方法。DT 和 CLK 线由引脚输入 D3 和 D4 读取。按下时,瞬时开关接地。微控制器在引脚 D6 读取该低电平以循环浏览菜单项。

PC817C 光耦合器 U3 在其引脚 4 上的输出被输入 D8。它用于将启用信号与我们可能选择连接到接头 P-IN 的任何辅助设备进行光学隔离。如果光耦合器输出侧由其输入端的内部 LED 照亮,则该值会很低。电阻器 R3 将通过输入电平的电流限制在规格范围内。1K 的值适用于我们期望在火腿小屋中拥有的最常见电压。一个 1N4148 二极管可保护同一输入二极管免受意外反极性连接的影响。如果没有这个保护二极管,光耦合器的 LED 将无法承受超过 6V 的反向电压。

请注意:P-IN 接头连接与嵌入式版本不同。外部设备的使能电压应连接到插头的引脚 2。它的负极线,通常是辅助设备的地,连接到 P-IN 插头的引脚 1。这在丝印上标有“1 G”。

P5 是我们连接 DS18B20 温度传感器的地方,确保我们尊重它的引出线。其数据线 DQ 接至引脚 D7,用作与传感器通信的单线总线。当我们询问和接收来自传感器的温度数据时,白色 LED2 将闪烁。我发现需要一个上拉电阻来确保良好的总线对话。

2K 的值给了我稳定的数据流以及我使用的 0805 表面贴装 LED 的充足照明。可以使用更高的值,如 4.7K,但这最终取决于您选择使用的 LED 上的压降。这可能因制造商、型号和颜色而异。你的旅费可能会改变。

标头 U1 在引脚 D5 的开关打开期间被读取。如果此接头的引脚 1 和 2 通过跳线桥接,则 D5 为低电平,代码将使用华氏度。如果引脚 2 和 3 桥接,威廉希尔官方网站 中实际上没有任何东西。D5 的内部上拉电阻将保持高电平并使用摄氏度单位。

使用接头 U2,我们可以选择两个风扇之间的工作模式。外部引脚连接到 Uno 引脚 A2 和 A3。读取这些输入的状态将定义次级 Fan-B 如何与 Fan-A 一起工作。对称(串联)或不对称(相反)。跳线会将一个或另一个引脚连接到中央接地引脚。如果未安装跳线,则两侧均为高电平,输入引脚 A2 和 A3 上均显示为逻辑 1。然后Fan-B将在热备模式下等待,以防Fan-A出现故障。

我在防护罩上包含了一个小型触觉开关 SW2。这连接到 Uno 的 RESET 引脚。实际上,它与 Uno 自己的复位开关并联,但现在被防护罩覆盖,几乎无法触及。像这样,仍然可以轻松执行重置。

为了给风扇供电,我们需要 +12V。在通过 AMS1117 将电压调节到 +5V 为其他 UNO 威廉希尔官方网站 供电之前,该电压在桶形连接器处输入。对于风扇,我们必须始终在这个桶形连接器上为 UNO 供电大约 +12V。风扇的直流输入取自Vin,Vin是输入电压通过Arduino上标有M7的反向电压保护二极管后恢复的引脚连接。这是一个标准的 1N4007 整流二极管,可将 12V 电压降低约 0.7V。UNO 的 AMS7111 +5v LDO 稳压器额定值为乐观的 800mA。理想情况下,我们需要低于此值,因为我们已经处于他推荐的输入电压的顶端(尽管最大输入更高)。因此,小型线性稳压器需要从用于为风扇供电的 12V 主电源中转储约 6V。例如,两个风扇均以 100% 转速运转时的总电流测得约为 270mA。每个风扇大约100mA(与风扇制造商指定的指定电流消耗一致)和Arduino板70mA。我们可以看到我们与引用的 800mA 相去甚远,而且非常符合 AMS1117 功耗规格。

虽然我经常看到引用的最大 +20V,但 Arduino 建议不要超过 +12V 输入为其 UNO 板供电。这完全取决于板载 LDO 稳压器必须处理的电流量和功率。在桶形连接器输入端使用 +12V,在二极管压降后,我们仍然有大约 11.3V,这对于驱动风扇来说是可以接受的。这可以在风扇数据表上进行检查。通常 12V 风扇可承受 10V 至 13.2V(有些甚至 7v 至 13.8V)。使用任何棚屋电源中常见的 13.8V,我们得到 13.1V。仍在风扇规格范围内。这种轻微的增加不会给 AMS1117 +5V 稳压器带来更多的耗散负担,因为我们没有让大电流流过它。

绿色 LED 1 和 3 让我们放心,我们的威廉希尔官方网站 板上有 +5V 和 +12V。LED1用1K限流电阻R7表示+5V,LED3用2K限流电阻R8表示+12V。电阻值差异是由于指示的电压不同所致。像这样,亮度水平将非常相似。

盾版建筑:

该板混合使用通孔和表面贴装元件。紧要关头,只要眼力好、神态冷静、手稳,什么都可以用手焊。然而,理想情况下,回流焊炉、电炉或热风站是最好的。我更喜欢使用 0805 封装尺寸,因为它们很小但仍然相对容易看到和使用。十五个 SMD R1 到 R9、LED1 到 LED4、C1 和 D1 可以先回流。然后可以手工焊接通孔元件。无需配置微控制器保险丝或上传引导加载程序,因为 UNO 已经解决了这些问题。这两个 PCB 的成品堆叠提供了一个非常紧凑的单元,具有经典 Arduino 已经提供的所有便利设施。

提个醒:并非所有 Arduino UNO R3 都是平等的。一些使用 USB B 型连接器与 USB 进行串行通信。USB B 型插座高度可能会接触并短路某些屏蔽连接。小心。一点绝缘胶带在这里可能会有用。有时 ATmega 16U2 也用作 USB 转串口转换器。这实际上是一个单独的微控制器,它被编程为 FTDI 角色。它通常在 Arduino UNO 板的左上角有自己的 ICSP 编程引脚。这些也可能会物理接触某些屏蔽元件引脚的底部并造成破坏。我只能假设一些中国制造商只有在芯片已经在威廉希尔官方网站 板上使用这些编程引脚后才使用 FTDI 固件烧录 ATmega 16U2。其他供应商避免在焊接芯片之前通过预烧来安装这些引脚,或者稍后在制造中使用 pogo pin 连接器。就个人而言,在使用屏蔽时,为了避免这些问题,我倾向于只使用 UNO 板,它们具有低调得多的微型 USB 连接器和专用 USB-UART 芯片,如 CH340。

嵌入式板版

独立嵌入式版本:这是在使用嵌入式 ATmega328P-AU 的单板上,包括所有其他子系统。串行和 ICSP 端口连接接头仍可用于调试和必要的芯片烧录。自然这里有更多的表面贴装元件需要焊接。这当然包括 328P-AU。其0.8mm间距的TQFP封装将更具挑战性。在初始草图和/或引导加载程序中进行配置和加载也是如此。

load1small_9qNwKfWkTp.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

嵌入式独立板。

主要成分:

ATmega 328P-澳大利亚

晶体时钟振荡器。

DS18B20温度传感器。

光耦PC817C。

OLED SSD1306 0、91" 显示屏。

AS1117 5V稳压器。

LED指示灯和无源蜂鸣器报警

用于菜单输入的旋转编码器。

板载电源开关。

板载复位按钮。

USB 串行功能可通过外部 FTDI(Future Technology Devices International)板,通过“串行”端口接头插针使用。

ICSP 功能可通过“ICSP”端口接头引脚与外部 USBasp 板一起使用。

初始设置跳线头。

嵌入式版本威廉希尔官方网站 原理:

此版本为风扇控制器代码提供单板平台。它是风扇控制器的独立变体,围绕 ATmega 328P-AU 芯片构建。与许多 Arduino UNO R3 板使用的相同。参考嵌入式板原理图。

该威廉希尔官方网站 使用ATmega 328P。不是 328PB 版本,它有一些引出线差异。后缀AU指的是小型QFP32封装类型,我在测试和构建过程中发现它仍然相对容易处理。

由于我们已经失去了内置 Arduino 引导加载程序的便利,我们将不得不使用 ICSP 上传到微控制器的内存。还需要添加电源管理、时钟、复位和串行调试端口、ICSP 端口等其他功能。

屏蔽和嵌入式威廉希尔官方网站 都使用相同的代码。这是因为所有威廉希尔官方网站 功能和连接都设计为相互兼容。下面我已经说明了每个输入或输出的等效 Arduino Uno 连接是什么,因为这是草图中引用的内容。

Fan-A 和 Fan-B 具有独立控制的 PWM 输出信号,这些信号取自微控制器的引脚 13 和 14。这些是端口引脚 PB1 和 PB2,相当于 Arduino 板上的 I/O 引脚 D9 和 D10。RPM 转速计波形取自 Fan-A,通过 RC 噪声滤波器并馈送到引脚 32,即端口引脚 PD2 (Arduino D2)。这用于计算和显示主风扇 A 的速度。

当代码检测到风扇 A 停止时,引脚 15、端口引脚 PB3 (Arduino D11) 上的高电平将通过其 1K 限流电阻 R4 点亮红色 LED4。同样,它会通过无源蜂鸣器 SG3 发出警报,该蜂鸣器跨越引脚 23 和 24,端口引脚 PC0 和 PC1(Arduino A0 和 A1)。每个输出彼此异相,从而增加了表观音量水平。尽管如此,还是有一个 220 欧姆的小电阻 R1 可以将此处的电流降低到可接受的水平。此压电蜂鸣器也会在开机时发出声音,以确认配置设置已保存。

SSD1306 OLED 使用 I2C 总线。它的数据和时钟线连接到引脚 27 和 28。它们分别是端口引脚 PC4/SDA 和 PC5/SCL(位于 Uno 的 A4/SDA 和 A5/SCL 上)。为了完整起见,包含两个值为 5.1K 的上拉电阻器 R5 和 R6,尽管某些 OLED 板没有这些电阻器也能正常工作,因为它们已经具有上拉电阻器。我的 OLED 已经有一个 +3.3V 稳压器并且是 +5V 逻辑容限,所以不需要电平转换器。

旋转编码器 SW1 线 DT 和 CLK 在微控制器的引脚 1 和 2 处读取。这些是端口引脚 PD3 和 PD4(与 Uno 的 D3 和 D4 相同)。按下时,瞬时开关接地。这个低电平在引脚 10 读取,它是微控制器上的端口引脚 PD6(Uno 的 D6),以循环浏览菜单项。

PC817C 光耦合器 U3 在其引脚 4 上的输出被带到微控制器引脚 12,即端口引脚 PB0(Arduino 上的 D8)。它用于将启用信号与我们可能选择连接到接头 P-IN 的任何辅助设备进行光学隔离。如果光耦合器输出侧由其输入端的内部 LED 照亮,则该值会很低。电阻器 R3 将通过输入电平的电流限制在规格范围内,1K 的值适用于我们预计火腿小屋中最常见的电压。一个 1N4148 二极管可保护同一输入二极管免受意外反极性连接的影响。如果没有这个保护二极管,光耦合器的 LED 将无法承受超过 6V 的反向电压。

请注意:此 P-IN 接头连接器与屏蔽版本不同。连接外部触发器时必须小心。外线的负极,通常是接地,应该连接到 P-IN 接头的引脚 2。外部线路的正极应连接到引脚 1。这在接头的丝印上标记为“+VE 1”。

P5 是我们连接 DS18B20 温度传感器的地方,确保我们遵循它的引出线。其数据线 DQ 接至引脚 11,或端口引脚 PD7(Uno 上的 D7)。这是与传感器通信的单线总线。当我们询问和接收来自传感器的温度数据时,白色 LED2 将闪烁。需要一个上拉电阻来确保良好的总线通信。

我发现 2K 的值可提供稳定的数据流以及我使用的 0805 表面贴装 LED 的充足照明。可以使用更高的值,如 4.7K,但这最终取决于所用 LED 上的压降。这可能因制造商、型号和颜色而异。你的旅费可能会改变。

通过接头 J1,我们可以选择两个风扇之间的工作模式。这发生在开关打开时。引脚 1 和 3 分别连接到 ATmega 的引脚 26 和 25。这些是微控制器端口引脚 PC3 和 PC2(相当于 Uno 引脚 A3 和 A2)。读取这些输入的状态将定义次级 Fan-B 如何与 Fan-A 一起工作。与主 Fan-A 对称(串联)或不对称(相反)。跳线放置将使一个或另一个引脚在引脚 2 上接地。如果跳线跨接在引脚 3 和 4 之间,则实际上断路了。由于已配置内部上拉电阻,输入引脚 A2 和 A3 将出现逻辑 1。使用左侧的跳线,设置非对称操作。使用中间的跳线,设置对称操作。使用右侧的跳线,设置热备。

虽然我们实际上不需要它在这里桥接引脚 3 和 4,但它只是一种方便的方式来存放小跳线并防止我们丢失它。

接头 J2 在开关打开期间也被读取并路由到引脚 9。这是端口引脚 PD5 (Uno D5)。如果此接头的引脚 1 和引脚 2 通过跳线桥接,则引脚 9 变为低电平,代码随后将以华氏度为单位计算温度。如果引脚 2 和 3 桥接,威廉希尔官方网站 中实际上没有任何东西。同样,我们只是将跳线存放在引脚 2 和引脚 3 上,以免丢失。此处,引脚 9 的内部上拉将使它保持高电平,代码将以摄氏温度单位工作。

开关 SW18 连接到设备的复位威廉希尔官方网站 ,在 ATmega 328P 的引脚 29 上。采取低它迫使微控制器复位。在正常操作中,上拉电阻 R2 将其保持在高电平。二极管 D2 保护微控制器免受任何电压尖峰的影响,这些电压尖峰是由于串口 DTR 线上的电容器 C7 引起的。如果此 DTR 变高,我们的复位线上的电压会短暂加倍。1N4148 安全地分流这个 10V。串口DTR线上需要电容C7,起微分作用。当连接到串口时,大多数USB转串口芯片会将DTR设置为低电平并保持低电平。我们在这里只需要一个短脉冲来初始重启微控制器。ATmega 的复位引脚也被任何 ICSP 编程器使用,因此也连接到 ICSP 接头引脚 5。

绿色 LED 5 和 6 指示我们有 +12V 和 +5V 到达我们的威廉希尔官方网站 板。LED5用2K限流电阻R10表示+12V,LED6用1K限流电阻R11表示+5V。电阻值的差异是由于指示的电压不同所致。像这样,它们的亮度水平将是相等的。

在直流桶形连接器和电源开关 SW2 之后,AMS1117 +5V 稳压器 U36 为威廉希尔官方网站 板提供 +5V。该稳压器的版本被引用为具有从 15v 到 20V 的任何地方的最大输入电压。虽然推荐值较低。功耗和发热将取决于它通过的电流量。它保持在功耗规格范围内,因为通过它的总电流相对较低。尽管如此,因为我有足够的威廉希尔官方网站 板空间,所以我已经包含了一个临时的 PCB 散热器。稳压器的 +5V 接头连接到此,它也有通向底部 PCB 层的散热孔。

跨接 AS1117 的 1N4007 二极管 U1 用于在使用 ICSP 端口时提供保护。通常,ICSP 程序员会将 +5V 置于 ICSP 端口的引脚 2 上。当我们燃烧 ATmega 芯片时,这可以保护 AMS1117 LDO 稳压器免受反馈电压的影响。

为了给风扇供电,我们需要 +12V。在通过 AMS1117 将电压调节至 +5V 之前,该电压在桶形连接器处输入。在输入电压通过标有 M7 的反向电压保护二极管后获取风扇电压。这是一个标准的 1N4007 整流二极管,它也会将 12V 电压降低约 0.7V。

AMS7111 +5v LDO 稳压器的额定电流高达 800mA。理想情况下,我们需要低于此值,因为我们已经处于他推荐的输入电压的顶端(尽管最大输入要高得多)。小型线性稳压器需要从用于为风扇供电的 12V 主电源中倾倒大约 6V。然而,总电流消耗远低于这个 800mA 的最大值。因此,即使需要丢弃 6V,通过它的电流如此之低,我们也很好地低于 AMS1117 功耗规格。

正如刚才提到的,为风扇供电所需的 +12V 取自 U37 的阴极。这是 1N4007 二极管,它为我们提供一些简单的反向电源保护,但会下降约 0.7V。即使有这种下降,仍然有足够的电压驱动大多数风扇在其指定的电压容差范围内。这可以在风扇的数据表上进行检查。通常 12V 风扇可承受 10V 至 13.2V(有些甚至 7v 至 13.8V)。

在桶形连接器输入端使用 +12V,在二极管电压下降后我们仍然有大约 11.3V,这是可以接受的。使用 13.8V,这是任何棚屋电源的正常输出,我们有 13.1V。仍在大多数风扇规格范围内,但您可能会注意到 RPM 有所增加。这种小的输入电压增加不会给 AMS1117 +5V 稳压器带来更多负担。

使用 16MHz 外部晶振 Q6。这个选项必须在 ATmega 的保险丝设置中配置。晶体 Q6 两端的 1M 电阻器 R13 改善了各种晶体规格的振荡的启动和维持。一些微控制器内置了这个。它包括在内是为了完整性。

许多 Arduino 板使用陶瓷谐振器而不是晶体。虽然不如水晶那么精确,但它体积更小,而且似乎对于日常应用来说已经足够精确了。我选择晶体是因为 16MHz 晶体在我所在的地区更容易找到,而且比微型陶瓷谐振器更容易处理。我不确定内部 ATmega 的振荡器是否足够精确以满足我们的需求,尤其是对于串行通信功能。

串口头H7可用于调试。它也可以用于上传新的草图,前提是之前已经将引导加载程序烧录到微控制器上。需要一个 FT232RL FTDI USB 转 TTL 串行适配器模块,设置为工作在 +5V。插头引脚将与大多数可用的适配器模块对齐。接地端在串口丝印上标记的引脚 1 上。Tx 和 Rx 线上的两个 1K 电阻 R8 和 R12 限制电流。因此,如果适配器端变高,然后微控制器代码将相应的输出引脚发送到低电平,这将避免直接接地短路。串行接头的 Vcc 引脚 3 未连接。风扇控制器由其自身的稳压器供电,适配器板通过计算机的 USB 连接供电。两者都有共同点。100nF 电容 C7 已经讨论过了。它构成了复位威廉希尔官方网站 的一部分,并确保仅来自串行端口 DTR 引脚的短暂低脉冲就会触发复位。

要使用 ICSP 端口 J5,需要一个在线串行编程器来直接烧录到微控制器的内存中。使用新的 ATmega 328P-AU,这将是将第一个代码上传到微控制器的唯一方法。如果您刻录引导加载程序,您将能够仅使用串行端口和 Arduino IDE 以经典方式上传草图。ICSP 接头引出线遵循标准布局,就像在 Arduino Uno R3 板上一样。对于 ICSP 编程,我使用便宜且易于使用的 USBasp 编程器。当然可以使用其他编程器,前提是引出线匹配。

编程时,风扇控制器板应断电,因为它将从 ICSP 编程器获取电源。然而,一些较旧的 ICSP 编程器需要在 ICSP 引脚 2 上有来自其目标的电压才能运行。在这种情况下,设备应该通电。

ICSP 的 MISO 和 MOSI 线位于接头的引脚 1 和 4,并连接到微控制器的 MISO 和 MOSI 引脚 16 和 15。接头引脚 3 的时钟线 SCK 连接到芯片的 17 引脚和复位线 RST插头引脚 5 连接到芯片 29 处的复位引脚的复位威廉希尔官方网站 。前面讨论的红色 LED4 用于在正常运行期间发出主风扇 A 停止的信号,现在将用于向我们显示任何 ICSP 活动。端口引脚 PB3 也是 MOSI 引脚,因此当我们连接到芯片时 LED4 会闪烁。

嵌入式版本构建:

同样,该威廉希尔官方网站 板混合使用了通孔和表面贴装组件。首选 0805 SMD 封装,因为这种小尺寸仍然相对容易处理。如果您是第一次,在更简单的项目甚至练习板上练习 SMD 焊接技术可能是明智的。嵌入式版本不是一个好的第一个 SMD 项目。在获得可运行的嵌入式版本的过程中,已经有足够多的陷阱需要提防。这可能会给新手带来很大的挫败感。表面贴装或嵌入式微控制器新手最好从屏蔽版本开始。如果您有信心,我现在将介绍一个合乎逻辑的工作流程,这可能会避免家庭酿造的不满。

- 对于 SMD,我使用小型回流焊炉和一些低温含铅焊膏。通过使用与所用焊料相匹配的特定温度曲线,可以轻松控制热量。当然,您也可以使用热板和热风返修台,但要注意不要因过热而熔化任何塑料外壳组件。例如,请注意电解电容器,其电介质可能会损坏。对于焊料,无铅类型现在都是炒作,但请相信我,它并不那么宽容。

无铅焊料容易成珠,不易流动或粘住。一家大型PCB工厂使用环保焊料是有道理的。对于我们的小型家庭爱好来说,它确实是海洋中的环境一滴。就健康而言,焊芯中助焊剂产生的烟雾实际上更有害,含铅和无铅焊料中都存在这种情况。在任何情况下,只要您的工作台通风良好,一年焊接几十块威廉希尔官方网站 板都不会把您推入早期棺材。

- 我建议先回流所有 SMD 组件,然后立即测试和 ICSP 燃烧 Atmega 328P-AU。也就是说,在安装较大的通孔组件之前。这样可以更容易地立即诊断任何编程问题。如果您需要拆焊和重新焊接组件,则无需整块威廉希尔官方网站 板的混乱。我的第一个完成的威廉希尔官方网站 板有几个问题,需要我拆卸和更换组件才能找到问题所在。虽然我解决了这些问题并且董事会工作了,但它看起来确实有点像最后的狗晚餐,而不是我们努力为每个完成的项目提供的米其林星级大餐。

首先,回流所有 SMD:U1、U36、U37、U25、Q6、SW18、D1、D2、LED2、LED4、LED5、LED6、C1、C2、C3、C4、C5、C6、C7、C8、C9 , C12, C13, C14, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13。完成后,目视检查焊点是否良好且无焊桥。使用放大镜或数码显微镜。总是有一些 ATmega 328P-AU 引脚之间经常有桥接,应该使用一些拆焊编织带将其吸起来。一旦我们满意了,我们就可以通过 ICSP 接头进入下一阶段的微控制器编程。

avrdudesssmall_rSOtN6kQgI.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

女主播

检查是否连接到您的 ATmega 328P。如果一切顺利,至少你的 MISO、MOSI、RST、SCK 和你的 ICSP 到微控制器的电源引脚是好的。

检查保险丝和锁定位的当前状态。这些保险丝的出厂默认值通常不是我们想要的。在这里,需要将它们设置为该项目的要求。小心地重新编程它们,因为错误的设置可能会使微控制器变砖,并使其难以再次轻松正常化。

将 ATmega 配置为使用 16MHz 的外部晶体振荡器,预留引导加载程序空间、掉电检测、启动延迟、引导复位引脚等。参考参考书目部分,了解 ATmega 的数据表和配置四组熔丝的其他资源。

低熔丝:对于 CCKDIV8、CKOUT、SUT 和四个 CKSEL 位。

高熔断器:用于带 BOOTRST 的 RSTDISBL、DWEN、SPIEN、WDTON、EESAVE 和 BOOTSZ。

扩展保险丝:用于 BOD 级别。

锁定位:限制对程序存储器的访问。

我使用类似于以下值的值为此项目设置保险丝:

大号F7h

溴化氢

EFH

磅FFh

因为新芯片的出厂默认值通常是:

长 62 小时

H D9h

EFFh

磅FFh

(除其他事项外,微控制器保险丝设置为使用其内部 RC 振荡器、将时钟除以 8、禁用掉电检测等。)

警告:RSTDISBL、SPIEN、DWEN 保险丝和锁定位有可能使 ATmega 芯片变砖,或者至少使芯片很难再次使用。因此,在单击“写入”按钮之前,请务必仔细检查您的保险丝设置值。

- 一旦建立了与微控制器及其保险丝组的通信,我们就可以加载草图了。同样,有多种方法可以做到这一点,尽管我发现在这里使用 Arduino IDE 与相同的 USBasp ICSP 编程器和出色的 MiniCore Arduino 内核是实用的。一旦在 IDE 的板管理器中配置,它就允许对许多 ATmega 微控制器进行编程(包括现在有时在 Arduino 板上使用的 ATmega 328PB 版本)。该内核使用自定义版本的 Optiboot,这是一种节省空间且比常规引导加载程序更高效的替代方案。

在 IDE 的板管理器中设置 MiniCore 后,我们可以在“工具”中选择我们的 ATmega 328P 并检查其选项。程序员当然应该设置为USBasp(MiniCore)。我可以选择将引导加载程序上传到内存,并激活 USB 端口,以便以后通过串行 USB-FTDI 端口更新草图。这会在打开时产生 2 秒的延迟。在此期间,引导加载程序被调用并等待任何草图上传。该串口也用于在 115200 波特率下进行调试。我们也可以选择不上传引导加载程序并取消串行上传草图。不会有 2 秒的延迟,因为代码会立即开始运行。任何草图上传都只能使用 ICSP 完成。

最初尝试上传 Blink 草图。在 Arduino IDE 首选项部分启用详细模式是一个很好的策略。像这样,可以看到编译和上传代码期间发生的事情的详细信息。Blink sketch 小巧、简单并且可以快速上传。微控制器端口 B3 上的 LED 可用于查看 Blink 草图是否与威廉希尔官方网站 板一起工作。这应该在您的 Blink 代码中定义为数据引脚 11。它是位于 328P 微控制器引脚 15 上的红色 Fan-A 警告 LED。顺便说一下,这个 LED 也连接到 ICSP 端口的 MOSI 线上,因此可以向我们显示在线串行编程活动何时发生。

现在项目的微控制器端已经配置和测试,PCB 可以通过手工焊接剩余的通孔组件来完成。

最后,可以将风扇控制器草图上传到板上并测试其所有功能。

示例使用

我在以下示例中使用了风扇控制器。我为每个应用程序调整了风扇速度温度斜率。它确保足够的冷却和可接受的噪音水平。

天线假负载

随着便宜的 50 欧姆陶瓷电阻器的出现,我找到了一些时间来构建一个高功率虚拟负载。它非常适合测试 HF 收发器。它使用 250N50F 氮化铝 (AlN) 陶瓷电阻器。替代品包括氧化铍 (BeO) 电阻器。这些都是以前使用过的组件。被中国一些有进取心的贸易商从报废设备中救出。

警告:数据表规格有所不同,但它们可以通过正确的散热和冷却来消耗大量功率。有些据说高达 250W 或 100degC,以先到者为准。这些评级似乎过于慷慨。

load5small_w45qNOLNGj.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 7

您应该管理应用于负载的“功率时间:休息时间”比率。更多的功率在更多的时间意味着更高的温度,因此需要更多的冷却时间。

大型散热器与双风扇形式的智能冷却解决方案相结合是理想的选择。风扇控制器板安装在该封装的一端。陶瓷电阻器用螺栓固定在散热器上,散热器本身夹在两个冷却风扇之间。DS18B20 温度传感器被夹在与散热器直接接触的位置。您可以使用一些氧化锌导热膏作为很好的措施。我用的尿布霜基本上和我手边的一样。

dummy_hf_M8fsF9CbQn.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

整个高频的 SWR

工业电脑

我讨厌噪音。我使用装有 macOS 的 Mac Mini 和装有 Windows 的工业 PC。既不发出任何声音,也完全保持沉默。然而,很快就会发现,运行 Windows 的无风扇工业 PC 可能会发热很多。尽管被有效地安置在一个大的散热器盒中,但缺乏气流意味着它的温度在执行某些任务时确实会大幅升高。这从来都不好。

我使用风扇控制器和两个风扇来促进 PC 上方的气流。配置温度/风扇速度曲线,充分降低其温度,但仍不会产生令人分心的风扇噪音。温度传感器安装在与 PC 外壳直接接触的位置。

pc10small_GXXNiIOq50.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 7

线性电源单元

我的 Microset PT-135 35A 电源体积大、坚固且无风扇。它使用线性调节并且过度设计。它在 RF 和棚屋中都提供了美妙的静音效果。它的后部有一个大散热片用于散热。我决定添加一些主动冷却。并不是说它需要它。只需一点帮助即可帮助气流。

psu5small_79rQzSMbfI.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 4

这里使用了屏蔽版本。配置低风扇速度曲线可将任何风扇噪音保持在无法检测到的水平。它紧贴在散热器鳍片的背面。另一种解决方案是使用小磁铁固定在外壳上。温度传感器安装在威廉希尔官方网站 板上方的空气中,仅检测环境温度。它只会在炎热的天气激活风扇。

注意事项

不合规。不是商业的。对于工业应用,Arduino 硬件和代码通常缺少保护控制器和相关设备所需的保护威廉希尔官方网站 。商业和工业系统将考虑许多潜在的安全和环境因素。它们将具有许多安全功能。Arduino 实际上只是一个原型设计平台,不应被视为兼容或商业化。尽管如此,许多初始项目在经过多次测试和重新设计后已获得工业认可。

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用此双风扇控制器静音运行',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);