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

基于微控制器的风扇冷却系统

发布时间:2022-01-11
分享到:

基于微控制器的风扇冷却系统

发布时间:2022-01-11
分享到:

介绍
我更喜欢安静祥和的环境。这就是为什么我更喜欢收听来自 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 中,用于断电恢复。
  • 用于设置温度单位(degC 或 degF)的配置标题
  • 用于设置对称、不对称或热备模式的配置头。
  • 隔离的外部 P 输入,用于启用/禁用辅助设备的操作。
  • 主风扇 A 故障检测,用于在热备模式下切换到风扇 B。
  • 用于调试和固件上传的串行端口。
  • 用于直接烧录到内存的电路串行编程端口。
  • KF2510 3+1P,风扇连接器插座。
  • 易于使用的板载重置开关。

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

  • Shield 版本:这是最容易构建的,因为 Arduino 板已经处理了一半的功能。屏蔽就像任何标准屏蔽一样连接到 Uno R3 板的顶部。它以惊人的紧凑封装提供了运行所需的其余电路。构建屏蔽版本更简单,尽管您仍然应该能够处理它使用的 15 个 0805 SMD。代码上传更易于管理,并且像往常一样通过 USB 串行端口使用 Arduino IDE 执行。
  • 嵌入式版本:这是围绕 Atmega 328P-AU 微控制器构建的,具有独立的独立单元所需的所有电路。构建复杂性更大。您应该具备并精通SMD项目建设。请注意,您还需要熟悉 ICSP 端口。至少在最初将代码上传到微控制器内存,直到您根据需要烧录引导加载程序。

操作
此代码是根据需要动态构建的。从一个简单的温度跟踪风扇速度实用程序,它迅速雪崩成这个可定制的版本。毫无疑问,还有其他编程方法可以实现所期望的。就是这样。无论如何,我的代码可以很容易地更正、修改和改进,让每个人都满意。

启动顺序

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

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

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

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

滚动浏览下图,例如配置的坡度:

一种被动清扫模式:

在这里,风扇速度将在风扇速度斜率上上下扫描,如先前由风扇最小值和风扇最大值定义的那样。不使用温度读数,但可以更改扫描速率。

两种主动触发模式:

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

在最低温度触发:

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

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

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

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

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

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

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

配置菜单:

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

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

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

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

模式
扫描或触发

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

扫描速率
(如果之前选择了扫描,则可用)1/慢到 10/快。选择风扇速度从风扇最小值扫描到最大值的速度。

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

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

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

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

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

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:辅助 Fan-B 充当热备用角色的主 Fan-A 的备份。因此,Fan-B 通常会一直关闭,直到 Fan-A 卡住或出现故障。风扇 A 发生故障时,风扇 B 将接管。

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

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

degC:摄氏温度。在世界其他地方使用。

积木
单片机:

我们不需要 ESP8266 或 ESP32 中的处理能力或花里胡哨。带有 ATmega 328P 芯片的 Arduino 平台具有足够的速度、内存空间和 GPIO 引脚。

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

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

温度感应器:

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

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

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

OLED显示屏:

使用了一个小的 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 中以便于编辑。

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 是为了防止高于 6V 的 Vr。允许的最大输出值为 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 到串行编程和调试,风扇控制器当然应该通电。

ICSP 端口:

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

我还在嵌入式版本中包含了一个 ICSP 端口。这是最初将引导加载程序刻录到独立版本的唯一方法。这些 3x2 插头引脚与大多数常见的 ICSP 编程器(如 USBasp)完美对齐。它允许直接装载 ATmega 328P。对于 ICSP USBasp 编程,风扇控制器应断电,因为大多数像 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.5 转 x 60 秒)。总实际价值的 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,也用于为风扇控制器屏蔽供电。就其尺寸而言,它是一款久经考验的耐用调节器。由不同的公司制造并且容易获得。不同的制造商发布不同的数据表,最大输入电压和功耗标准略有不同。我也在独立的嵌入式板上使用过它。

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

#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需要能够在代码中对不同的任务进行原型处理。三个线程将伪一致地运行。这些用于读取旋转编码器、读取风扇 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()到听起来罗杰确认'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()读取相关的跳线位置以设置辅助风扇 B 的工作模式为非对称、对称或在开关 ON 时待机。
  • 函数fanBconversion()计算与风扇 A 相比风扇 B 的运行速度,同时考虑到非对称、对称或待机的当前操作模式。
  • 函数percentToPWM()将百分比速度值转换为适合直接馈送到定时器寄存器以进行 PWM 控制的值。这用于控制 Fan-A 的速度。
  • 函数percentToBars()将命令到风扇 A 的 PWM 显示为 OLED 显示屏上一行的移动条形图。
  • 函数fanJamCheck()检查风扇 A 的停止并在四次违规后发出信号。然后它会发出警报并闪烁红色警告 LED。
  • stepIncrement()和steppedDecrement()函数在被动清扫模式下增加和减少风扇的速度。
  • 函数pwm25kHzSet()将 PWM 频率设置为25khz 。之所以需要此更改,是因为风扇需要以 25KHz 运行的 PWM 信号,并且可用的默认 Arduino PWM 频率仅为 490Hz 或 980Hz,具体取决于所使用的引脚。

ATmega328P 有三个定时器,我们可以同时使用它们。定时器是为每个时钟脉冲递增(或递减)的寄存器。328P 有三个,它们的使用在 delay()、millis()、micros()、Servo()、Tone() 和其他库等函数之间进行切换。时钟频率取自 16MHz 晶振时钟。该时钟频率可以在馈送到定时器之前由预分频器分频。当定时器增加到它们的最大寄存器大小时,它们将溢出。对于 8 位定时器的 timer0 和 timer2,这是 255(16 位 timer1 为 65535)。也可以设置发生此溢出的值。我们不需要等到定时器寄存器达到 255(或 65535)才能标记溢出。控制寄存器将 timer1 配置为模式 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 触发器 1d 由 0% 风扇速度的温度。
  • 地址 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 输入启用图标的字符。

滚动浏览显示信息示例:

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

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

主要组件:

  • 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 转速计波形从风扇 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 两端的电压降。这可能因制造商、型号和颜色而异。您的里程可能会有所不同。
在引脚 D5 处打开期间读取标题 U1。如果此接头的引脚 1 和 2 由跳线桥接,则 D5 为低电平,代码将使用华氏度。如果引脚 2 和 3 被桥接,则实际上电路中没有任何内容。D5 的内部上拉将使其保持在高位,并且将使用摄氏度单位。

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

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

为了给风扇供电,我们需要+12V。该电压来自桶形连接器,然后通过 AMS1117 将电压调节至 +5V,为其他 UNO 电路供电。对于粉丝来说,我们必须始终在此桶形连接器上为 UNO 提供大约 +12V 的电源。风扇的直流输入取自 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。电阻值差异是由于指示的电压不同。像这样,亮度水平将非常相似。

独立嵌入式版本:

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

主要组件:

  • ATmega 328P-AU
  • 晶体时钟振荡器。
  • DS18B20 温度传感器。
  • 光耦PC817C。
  • OLED SSD1306 0、91" 显示屏。
  • AS1117 5V稳压器。
  • LED 指示灯和无源蜂鸣器报警
  • 用于菜单输入的旋转编码器。
  • 板载电源开关。
  • 板载复位按钮。
  • USB 串行功能可通过外部 FTDI(未来技术设备国际)板使用,通过“串行”端口接头引脚。
  • 外部 USBasp 板通过“ICSP”端口接头引脚提供 ICSP 功能。
  • 初始设置跳线接头。

嵌入式版电路原理:

该版本为风扇控制器代码提供了一个单板平台。它是风扇控制器的独立变体,围绕 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 转速计波形取自风扇 A,通过 RC 噪声滤波器并馈送到引脚 32,即端口引脚 PD2 (Arduino D2)。这用于计算和显示主 Fan-A 的速度。

当代码检测到风扇 A 停止时,引脚 15、端口引脚 PB3 (Arduino D11) 上的高电平将通过其 1K 限流电阻 R4 点亮红色 LED4。同样,它会通过跨越引脚 23 和 24、端口引脚 PC0 和 PC1(Arduino A0 和 A1)的无源蜂鸣器 SG3 发出警报。每个输出彼此异相,从而增加了明显的音量水平。尽管如此,还是有一个小的 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,我们可以选择两个风扇之间的工作模式。这发生在开关 ON 时。引脚 1 和 3 分别连接到 ATmega 的引脚 26 和 25。这些是微控制器端口引脚 PC3 和 PC2(相当于 Uno 引脚 A3 和 A2)。读取这些输入的状态将定义辅助风扇 B 如何与风扇 A 一起工作。与主风扇 A 对称(串联)或不对称(相反)。跳线放置将使引脚 2 上的一个或另一个引脚接地。如果跳线跨引脚 3 和 4,则实际上是断路。逻辑 1 将出现在两个输入引脚 A2 和 A3 上,因为它们的内部上拉电阻已被配置。使用左侧的跳线,设置非对称操作。通过中间的跳线,设置对称操作。使用右侧的跳线,设置热备。

虽然我们实际上不需要它来桥接 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。电阻值差异是由于指示的电压不同。像这样,它们的亮度水平将相等。

在 DC 桶形连接器和通电开关 SW2 之后,AMS1117 +5V 稳压器 U36 为电路板提供 +5V。该稳压器的版本被引用为具有 15V 至 20V 的最大输入电压。虽然推荐值较低。功耗和发热将取决于它将通过多少电流。它保持在功耗规格范围内,因为通过它的总电流相对较低。尽管如此,我还是包含了一个临时 PCB 散热器,因为我有电路板空间。稳压器的 +5V 选项卡连接到此,它也有通往底部 PCB 层的热通孔。

AS1117 两端的 1N4007 二极管 U1,用于在使用 ICSP 端口时进行保护。通常,ICSP 编程器会在 ICSP 端口的引脚 2 上放置 +5V。当我们烧掉 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 处连接到芯片的 SCK 引脚,复位线 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 接头进入对微控制器进行编程的下一阶段。

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

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

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

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

高保险丝:适用于带 BOOTRST 的 RSTDISBL、DWEN、SPIEN、WDTON、EESAVE 和 BOOTSZ。

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

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

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

L F7h

H DEh

E FDh

LB FFh

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

长 62 小时

高 D9h

E FFh

LB 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 草图很小、很简单并且可以快速上传。微控制器端口 B3 上的 LED 可用于查看 Blink 草图是否与电路板配合使用。这应该在您的 Blink 代码中定义为数据引脚 11。它是 328P 微控制器引脚 15 上的红色风扇 A 警告 LED。顺便说一句,这个 LED 也连接到 ICSP 端口的 MOSI 线,因此可以在发生在线串行编程活动时向我们显示。
  • 既然项目的微控制器端已经配置和测试过了,PCB 可以通过手工焊接剩余的通孔元件来完成。
  • 最后,风扇控制器草图可以上传到板上并测试其所有功能。

示例用途

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

天线假负载

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

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

大型散热器加上这些双风扇形式的智能冷却解决方案是理想的选择。风扇控制器板安装在此封装的一端。陶瓷电阻用螺栓固定在散热器上,它本身夹在两个冷却风扇之间。DS18B20 温度传感器被夹在与散热器直接接触的位置。您可以使用一些氧化锌导热膏进行良好测量。我用的尿布膏和我手头的东西基本一样。

工业电脑

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

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

线性电源单元

我的 Microset PT-135 35A 电源大、坚固且无风扇。它使用线性调节并且过度设计。它在射频和小屋中都提供了美妙的沉默。它的后部有一个大散热器,用于散热。我决定添加一些主动冷却。并不是它需要它。只是一点帮助,以帮助气流。

这里使用了屏蔽版本。配置低风扇速度曲线可将任何风扇噪音保持在无法察觉的水平。它紧紧地夹在散热片的背面。另一种解决方案可能是使用小磁铁将其固定在外壳上。温度传感器安装在电路板上方,仅检测环境温度。它只在炎热的日子里激活风扇。

本文中所用到的一些代码

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

原文链接丨以上内容来源网络,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论 (1)
讨论区
walker2048 ·  2022-01-13