介紹
我更喜歡安靜祥和的環境。這就是為什么我更喜歡收聽來自 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 停機報警。
發光的 +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 的值給出了一個合適的時間常數,以濾除風扇轉速計信號上出現的任何更高頻率的噪聲脈沖。
這已經構成了 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 電源大、堅固且無風扇。它使用線性調節并且過度設計。它在射頻和小屋中都提供了美妙的沉默。它的后部有一個大散熱器,用于散熱。我決定添加一些主動冷卻。并不是它需要它。只是一點幫助,以幫助氣流。
這里使用了屏蔽版本。配置低風扇速度曲線可將任何風扇噪音保持在無法察覺的水平。它緊緊地夾在散熱片的背面。另一種解決方案可能是使用小磁鐵將其固定在外殼上。溫度傳感器安裝在電路板上方,僅檢測環境溫度。它只在炎熱的日子里激活風扇。
-
微控制器
+關注
關注
48文章
7542瀏覽量
151318 -
冷卻系統
+關注
關注
5文章
115瀏覽量
17777
發布評論請先 登錄
相關推薦
評論