搞定波形發(fā)生器!5大步驟制作Arduino波形發(fā)生器
想必大家對波形發(fā)生器均具備一定的了解,但是你知道如何制作波形發(fā)生器嗎?針對本文,具體而言,你了解制作Arduino波形發(fā)生器的制作步驟嗎?如果不了解,來看看本文給大家介紹的Arduino波形發(fā)生器的制作流程吧,超詳細哦!
步驟1:技術注意事項
制作模擬信號
Arduino Uno和Nano的一個缺點是它沒有數(shù)字信號 - 模擬(DAC)轉換器,因此無法直接在引腳上輸出模擬電壓。一種解決方案是R2R梯形圖:8個數(shù)字引腳連接到電阻網(wǎng)絡,因此可以達到256級輸出。通過直接端口訪問,Arduino可以通過一個命令同時設置8個引腳。對于電阻網(wǎng)絡,需要9個值為R的電阻,8個值為2R的電阻。我使用10kOhm作為R的值,它將引腳的電流保持在0.5mA或更低。我猜R = 1kOhm也可以工作,因為Arduino可以輕松地為每個引腳提供5mA電流,每端口40mA。重要的是R和2R電阻之間的比率確實為2.通過將2個R值的電阻串聯(lián)起來,總共25個電阻最容易實現(xiàn)。
相位累加器
生成波形然后重復向Arduino引腳重復發(fā)送一系列8位數(shù)字。波形存儲在256字節(jié)的數(shù)組中,并對該陣列進行采樣并發(fā)送到引腳。輸出信號的頻率取決于通過陣列前進的速度。一個強大,精確和優(yōu)雅的方法是使用相位累加器:32位數(shù)字以固定間隔遞增,我們使用8個最高有效位作為數(shù)組的索引。
快速采樣
中斷允許在明確定義的時間采樣,但中斷的開銷將采樣頻率限制在~100kHz。無限循環(huán)更新相位,采樣波形并設置引腳需要42個時鐘周期,從而實現(xiàn)16MHz/42 = 381kHz的采樣率。旋轉或推動旋轉編碼器會導致引腳更改和從環(huán)路中斷的中斷以更改設置(波形或頻率)。在此階段,重新計算陣列中的256個數(shù)字,以便不需要在主循環(huán)中執(zhí)行波形的實際計算。可以產(chǎn)生的絕對最大頻率是190kHz的一半,但是每個周期只有兩個樣本,因此對形狀的控制不大。因此,接口不允許將頻率設置在100kHz以上。在50kHz時,每個周期有7-8個采樣,并且在1.5kHz和低于所有存儲在陣列中的256個數(shù)據(jù)每個周期都被采樣。對于信號平滑變化的波形,例如正弦波,跳過樣本沒有問題。但對于具有窄尖峰的波形,例如占空比較小的方波,存在這樣的危險:對于高于1.5 kHz的頻率,單個樣本丟失會導致波形表現(xiàn)不盡如人意
頻率的準確度
每個樣本相位遞增的次數(shù)與頻率成正比。因此,頻率可以設置為381kHz/2 ^ 32 = 0.089mHz的精度。實際上,幾乎不需要這種精度,因此界面限制以1mHz的步長設定頻率。頻率的絕對精度由Arduino時鐘頻率的精度決定。這取決于Arduino類型,但大多數(shù)指定頻率為16.000MHz,因此精度為~10 ^ -4。該代碼允許修改頻率和相位增量的比率,以校正16MHz假設的小偏差。
緩沖和放大
電阻網(wǎng)絡具有高輸出阻抗,因此如果負載是,則其輸出電壓會快速下降連接。這可以通過緩沖或放大輸出來解決。這里,緩沖和放大是用運算放大器完成的。我使用的是LM358,因為我有一些。它是一個慢速運算放大器(壓擺率為每微秒0.5V),因此在高頻和高幅度時信號會失真。一個好處是它可以處理非常接近0V的電壓。然而,輸出電壓限制在低于軌道約2V,因此使用+ 5V功率將輸出電壓限制為3V。升壓模塊結構緊湊,價格低廉,為運算放大器提供+ 20V電壓,可產(chǎn)生電壓高達18V的信號。 (注意,原理圖說LTC3105,因為那是我在Fritzing中發(fā)現(xiàn)的唯一升級。實際上我使用的是MT3608模塊,請參閱后續(xù)步驟中的圖片)。我選擇對R2R DAC的輸出應用可變衰減,然后使用其中一個運算放大器緩沖信號而不放大,另一個放大5.7,這樣信號可以達到約20V的最大輸出。輸出電流相當有限,約為10mA,因此如果信號要驅動大型揚聲器或電磁鐵,則可能需要更強的放大器。
步驟2:所需組件
核心波形發(fā)生器
Arduino Uno或Nano
16x2 LCD顯示屏+ 20kOhm微調和100歐姆用于背光的串聯(lián)電阻器
5針旋轉編碼器(帶集成按鈕)
25個10kOhm電阻
用于緩沖器/放大器
LM358或其他雙運算放大器
升壓模塊基于MT3608
50kOhm可變電阻
10kOhm電阻
47kOhm電阻
1μF電容
步驟3:構造
我在7x9cm原型板上焊接了所有東西,如圖所示。由于所有電線都有點亂,我試著給帶正電壓紅色的引線和帶黑色的引線涂上顏色。
我使用的編碼器有5個引腳,一邊是3個,2個是另一邊。有3個引腳的一側是實際的編碼器,帶有2個引腳的一側是集成按鈕。在3引腳側,中央應接地,另外兩個接到D10和D11。在2引腳側,一個引腳應連接到地,另一個應連接到D12。
這是我做過的最丑陋的事情,但它有效。放入一個外殼會很好,但是現(xiàn)在額外的工作和成本并沒有真正證明它的合理性。 Nano和顯示器附有針頭。如果我要建一個新的,我不會再那樣做了。我沒有在板上放置連接器來拾取信號。相反,我用突出的銅線上的鱷魚引線拾取它們,標記如下:
R - 來自R2R DAC的原始信號
B - 緩沖信號
A - 放大信號
來自引腳9的T - 定時器信號
G - 接地
+ - 來自升壓的正“高”電壓模塊
步驟4:代碼
代碼是一個Arduino草圖,附上并應上傳到Arduino。
已有20個波形預定義。添加任何其他wave應該是直截了當?shù)?。請注意,隨機波填充具有隨機值的256值數(shù)組,但每個周期都會重復相同的模式。真正的隨機信號聽起來像噪聲,但這種波形聽起來更像是哨聲。
該代碼在引腳D9上用TIMER1設置1kHz信號。這對于檢查模擬信號的時序非常有用。這就是我如何計算時鐘周期數(shù)為42:如果我假設41或43,并產(chǎn)生1kHz信號,它顯然與引腳D9上的信號具有不同的頻率。使用值42,它們完全匹配。
通常,Arduino每毫秒都會中斷以使用millis()函數(shù)跟蹤時間。這會干擾準確的信號生成,因此禁用特定的中斷。
編譯器說:“Sketch使用7254字節(jié)(23%)的程序存儲空間。最大值為30720字節(jié)。全局變量使用483字節(jié)(23%)動態(tài)內存,為局部變量留下1565個字節(jié)。最大為2048個字節(jié)。“因此,有足夠的空間可以使用更復雜的代碼。
步驟5:用法
只需通過Arduino的mini-USB線纜即可為設備供電納米。最好使用移動電源,這樣它就不會與可能連接的設備發(fā)生意外的接地回路。
接通電源時會產(chǎn)生100Hz的正弦波。通過旋轉旋鈕,可以選擇其他20種波形中的一種。通過按下旋轉,可以將光標設置為頻率的任何數(shù)字,然后可以將其更改為所需的值。
可以使用電位計調節(jié)振幅,也可以使用緩沖器或可以使用放大的信號。
使用示波器檢查信號幅度非常有用,特別是當信號向另一個設備提供電流時。如果汲取的電流太大,信號將被削波并且信號嚴重失真
對于非常低的頻率,輸出可以通過LED與10kΩ電阻串聯(lián)來顯示。用揚聲器可以聽到音頻。確保將信號設置為非常小~0.5V,否則電流過高,信號開始削波。