Arduino具有輸出數碼訊號和PWM訊號等功能,但不具備輸出模擬訊號的能力。 在本文中,我們將介紹乙個可以實現這種模擬訊號輸出的DA轉換器。
數碼訊號是由二進位數字 0 和 1 表示的訊號。 在電子電路領域,有時也被稱為“低高”或“開關”。 自然界中的現象和人類可以感知的訊號是模擬訊號。 模擬訊號的特點是它們的大小、時間和數量是連續的。
轉換器是將數碼訊號轉換為模擬訊號並輸出的轉換器。
音訊和 ** 是模擬訊號。 然而,近年來,音訊處理和影象處理已經開始需要數碼訊號。 處理模擬訊號時不支援濾波和壓縮,而數碼訊號則支援。 將處理後的數碼訊號轉換回模擬訊號需要DA轉換器。
Arduino 包括 Arduino Uno、Arduino Leonardo 和 Arduino Nano 等多種產品。
Arduino Due 是帶有內建 DA 轉換器的 Arduino 之一。 但是,DU的形狀與Arduino Uno的形狀不同,工作電壓為33V,使用方式也不同。
如果要使用已經很流行的Arduino UNO輸出模擬訊號,則需要外部DA轉換器IC。
這一次,我們沒有使用帶有內建DA轉換器的擴充套件板,而是嘗試將DA轉換器IC直接連線到Arduino,看看是否可以輸出模擬訊號。 我們使用的是ROHM的DA轉換器IC“BH2219FVM”(8位解像度,雙通道)。
由於BH2219FVM採用 MSOP8 封裝,我們將使用轉換板使其與多用途板相容。
與 I2C 和 SPI 方法的 D-A 轉換器不同,該 DA 轉換器通過三線序列通訊執行。 由於這是它自己的方式,並且不符合特定的協議,因此您需要建立自己的序列通訊處理,以便 DA 轉換器在草圖中正常工作。
在連線到Arduino時檢查BH2219FVM的技術規格。 將示波器探頭連線到輸出引腳並確認波形。
BH2219FVM的技術資料表提供了有關如何使用它的詳細說明。 除了最大額定值和電氣特性外,技術規範還提供了如何應用訊號進行操作的操作說明,在閱讀這些內容時有必要考慮如何處理它們。
參考: D A 轉換器 標準 8 位解像度 雙通道 三通道 Rohm
BH2219FVM的控制方法很簡單。 輸出模擬訊號的埠(4 位)和 8 位資料(4 位、8 位、12 位)以 1 位為增量依次傳輸到 DI 引腳。 BH2219FVM讀取 CLK 引腳上公升沿上的 DI 引腳。 12位傳輸完成後,如果LD引腳接通,則輸出與資料對應的模擬訊號。
以下是將輸出 2 到 AO1 埠以 5V 電壓為例。
根據上表通道設定(BH2219FVM),前四位數字表示埠AO1的固定值為0000。
下乙個資料是顯示“25v“ 的 8 位值,通過。
256 輸出電壓電源電壓資料”。
進行計算。 結果是:
256 × 2.5[v] ÷5[v] =128”。
自 25V 是“電源電壓的一半”,因此資料是“可以用 8 位表示的數字 (256) 的一半”,即“128”。 當以二進位表示時,128 是“10000000”。
將“0000”和“10000000”傳送到BH2219FVM,方法是按照 CLK 引腳的 ON 順序將 DI 引腳放在 (1 0) 上。 最後,只要LD引腳是ON和OFF,BH2219FVM就可以輸出25V模擬訊號。
下面的草圖是通過序列通訊將資料從Arduino傳送到BH2219FVM,並將“鋸齒波”輸出到BH2219FVM的AO1引腳。
#define ld 8#define clk 7#define di 6boolean d[12];將輸入值轉換為二進位並儲存在陣列 d0 d7int binary(int out)} 儲存指定的輸出埠 result in array d8 d11int chselect(int outpin) }else if (outpin == 2) 將陣列輸出到 dacvoid outconfirm() digitalwrite(ld, high); digitalwrite(ld, low);} 將輸出值和輸出埠傳遞給每個變數 int operationout(int value, int ch)void setup() void loop()。這個草圖比較注重易懂性,所以效率不是很好,轉換週期有點慢。
草圖中的每件作品都在下面解釋。
#define ld 8#define clk 7#define di 6boolean d[12];首先,將要連線的 DA 轉換器的引腳與 Arduino 的引腳號相關聯。 LD 是引腳 8,CLK 是引腳 7,DI 是引腳 6。 接下來,定義乙個陣列 d 來儲存要傳送到 DI 引腳的 12 位資訊。 為了將 0 1 保留為 12 位,需要 12 個陣列元素。 由於只儲存了 0 和 1,因此我們使用 boolean 資料型別。
void setup()通過設定功能設定要使用的引腳的工作。 所有三個引腳都用於輸出。 在設定功能中將LD引腳指定為低電平是為了防止其狀態不穩定。
void loop()“要輸出的資料”和“埠號”通過迴圈功能傳遞給操作輸出功能(用於將訊號輸出到下文所述的 DA 轉換器)。 對於要輸出的資料,使用 for 語句將值設定為從 0 到 255 逐漸增加。 由於每次呼叫環路函式時都會重複工作,因此輸出電壓為“鋸齒波”。
int operationout(int value, int ch)operationout 函式已將引數傳遞給執行實際處理的函式。 然後呼叫三個函式:chselect 函式,它將埠號(上 4 位)擴充套件到 0 或 1,二進位函式,將要輸出的資料(下 8 位)擴充套件到 0 或 1,以及 outconfirm 函式,將陣列 d 的內容傳輸到 da 轉換器。
int chselect(int outpin) }else if (outpin == 2)使用 chselect 函式執行最多 4 位的操作。 當從引數中指定埠號 1 時,0 將儲存在陣列 d 的元素 8 到 11 中。 當從引數中指定埠號 2 時,1 儲存在陣列 d 的元素 8 中,0 儲存在元素 9 到 11 中。
int binary(int out)}傳入的十進位數由二進位函式轉換為 8 位二進位數,並儲存在 d[0] 到 d[7] 中。 此技術通常用於二進位轉換。 使用 for 語句“找到除以 2 後的餘數(最低數字是 0 還是 1? ),除以 2(四捨五入最低數字)“到”依次從最低數字轉換為二進位數”。
void outconfirm() digitalwrite(ld, high); digitalwrite(ld, low);}通過最終的輸出確認功能,將陣列 d 中的資料傳輸到 da 轉換器並輸出模擬訊號。
陣列 d 中 0 個 1 的順序與它傳輸到 d a 轉換器的順序相反。 因此,for 語句按從 11 到 0 的降序迴圈,並以正確的順序輸出陣列 d 的內容。 在迴圈中,還執行 CLK 處理。 for語句結束後,當新增LD引腳的上公升沿訊號時,DA轉換器輸出與傳輸資料相對應的模擬訊號。
下面是用示波器觀測到的每個點的電壓圖。
Arduino操作BH2219FVM時的波形從DA轉換器的輸出引腳輸出19Hz鋸齒波。
檢視 DI 引腳(頂部)和 CLK 引腳(底部)上的波形。 您可以根據 CLK 的動作檢視 DI 引腳的開啟和關閉方式。
放形以檢視訊號的傳送方式。 圖中顯示,180的訊號被傳送到DA轉換器的AO1引腳。 根據此訊號輸出 352V電壓。
隨著數位化的進步,DA轉換器廣泛應用於**裝置、通訊裝置、電機驅動裝置等各種產品中。
通過在Arduino上新增使用DA轉換器的模擬訊號處理,它可以在各種場景中使用。
在這種情況下,資料傳輸方法可能看起來有點複雜,但使用支援 I2C 或 SPI 等常見資料傳輸標準的轉換器會更容易、更簡單。 當您需要模擬輸出時,請嘗試 DA 轉換器!
如需購買D變頻器,申請樣品測試、BOM匹配等需求,**客服微信:13310830171。