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