如何在設(shè)計(jì)中使用Arduino的模擬功能
掃描二維碼
隨時(shí)隨地手機(jī)看文章
Arduino 秉承讓數(shù)字技術(shù)輕松地運(yùn)用到現(xiàn)實(shí)應(yīng)用中這一理念,推出 Arduino 硬件平臺(tái),以實(shí)現(xiàn)將大多數(shù)模擬功能植入 Atmel 多功能 ATmega 8 位 MCU 系列。 在 Arduino 平臺(tái)上使用的所有 ATmega 變體均有一個(gè)片載多通道模數(shù)轉(zhuǎn)換器 (ADC)。 該 ADC 具有 10 位分辨率,能以 0 到 1023 的整數(shù)方式實(shí)現(xiàn)高達(dá)每秒 15,000 次的采樣速率。 大多數(shù) AVR MCU 支持 6 個(gè)模擬輸入通道,而一些變體則可支持 8 和 16 個(gè)輸入。 盡管模擬引腳的主要功能是讀取模擬輸入,但也可配置成數(shù)字式通用輸入/輸出 (GPIO) 引腳。 可根據(jù)需要為模擬引腳配備可選擇上拉電阻器,且采用與 MCU 數(shù)字引腳相同的上拉配置方法。
雖然一些 AVR MCU 采用了數(shù)模轉(zhuǎn)換器 (DAC),但在現(xiàn)有的這一代 Arduino 板上的 MCU 系列均能通過(guò)快速轉(zhuǎn)換其數(shù)字 I/O 引腳來(lái)產(chǎn)生脈寬調(diào)制 (PWM) 信號(hào),以提供模擬輸出。 每個(gè) PWM 輸出的 490 Hz(大約)方波的占空比經(jīng)過(guò)編程后,能提供一個(gè)大小為 0 至 5 V、周期為 256 毫秒、增量為 2 毫秒的等效 RMS 電壓(圖 1)。 Arduino 的輸出功能盡管在某種程度上受到一定限制,但可執(zhí)行如驅(qū)動(dòng) LED 或控制電機(jī)等許多任務(wù)。
圖 1:利用脈寬調(diào)制 (PWM) 技術(shù), Arduino 的數(shù)字 GPIO 引腳可用作模擬輸出(感謝 Arduino.cc 提供數(shù)據(jù))。
通過(guò)板邊緣的母頭引腳連接器,大多數(shù) Arduino 板能輕松連接 MCU 的模擬(和數(shù)字)I/O 信號(hào)。 模擬通道數(shù)及其物理引腳分配會(huì)隨正在使用的特定 MCU 以及板的外形發(fā)生變化,但許多變體還是遵循常見(jiàn)的“官方”設(shè)計(jì)所采用的引腳布局慣例,如 Uno(圖 2)、Mega 和 Nano。
圖 2:Arduino Uno 板(第 3 版)的模擬輸入 (A0-A5) 和模擬 PWM 輸出(數(shù)字式:3、5、6、9、10 和 11)) 可通過(guò)板邊緣的標(biāo)準(zhǔn)針座引腳進(jìn)行物理連接(感謝 Arduino.cc 提供數(shù)據(jù))。
因?yàn)?Arduino IDE 支持的編程語(yǔ)言中含有一組原生模擬 I/O 命令,因此采用模擬 I/O 功能開(kāi)發(fā)代碼也易于進(jìn)行。 通過(guò)這些指令可讀取模擬輸入、生成模擬 (PWM) 輸出以及配置 A/D 轉(zhuǎn)換器的基準(zhǔn)電壓。
讀取模擬輸入
我們能輕而易舉地將 Arduino 的模擬輸入與實(shí)際應(yīng)用連接,但需要為 AVR 的 A/D 轉(zhuǎn)換器選擇合適的基準(zhǔn)電壓源。 此時(shí),可以用默認(rèn) (DEFAULT)、內(nèi)部 (INTERNAL) 或者外部 (EXTERNAL) 基準(zhǔn)電壓來(lái)確定輸入電壓上限。 默認(rèn)模式下,MCU 采用板載電源穩(wěn)壓器的輸出作為基準(zhǔn)電壓。 根據(jù)所使用的特定 Arduino 板,基準(zhǔn)電壓可以是 5 V 或者 3.3 V。
在內(nèi)部模式下,采用 AVR 的片載精密基準(zhǔn)電壓源。 器件不同,基準(zhǔn)源電壓也不同,但通常為 1.1 V(適用于 ATmega168 或 ATmega328)或者 2.56 V(在 ATmega8 和 Mega 系列中)。 在外部模式下,您可用一個(gè) 5K 電阻器將一個(gè)外部基準(zhǔn)電壓連接至 AREF 引腳。 AREF 引腳內(nèi)置一個(gè) 32K 保護(hù)電阻器,與 5K 外部電阻器一起作為分壓器。 所以,如果通過(guò)該外部電阻器施加 2.5 V 電壓,就會(huì)在 AREF 引腳上產(chǎn)生一個(gè)約為 2.2 V 的電壓,具體計(jì)算為 2.5 * 32 / (32 + 5) = 2.2 V。
利用 Aegunio 編程語(yǔ)言讀取模擬電壓時(shí),需用 analogReference(type) 命令選擇基準(zhǔn)電壓源,然后引用一個(gè) analogRead(pin) 讀數(shù)命令,其中,(pin) 表示您希望采樣的針座引腳編號(hào)。 基準(zhǔn)電壓一旦選定,基準(zhǔn)類(lèi)型便不再改變,除非進(jìn)行另外編程。 雖然 AVR MCU 能支持高達(dá)每秒 15k 次采樣的轉(zhuǎn)換率,但 Arduino 的軟硬件環(huán)境通常將其限制在每秒 10k 次采樣左右。
構(gòu)建 PWM 模擬輸出
在某一個(gè) Arduino PWM 引腳上生成模擬電壓的具體做法是,用 pinMode(pin, mode) 命令將該引腳配置成輸出引腳,然后引用一個(gè) analogWrite(pin, value) 命令,其中,(pin) 表示您希望用于輸出的針座引腳,(value) 表示將要產(chǎn)生的基準(zhǔn)電壓的一部分(增量為 1/255)。 配置完成后,該引腳將連續(xù)產(chǎn)生一個(gè)具有規(guī)定占空比的 490 Hz 穩(wěn)定方波,直至收到下一個(gè) analogWrite() 請(qǐng)求(或者針對(duì)該引腳發(fā)出的一個(gè) digitalRead() 或 digitalWrite() 請(qǐng)求)。
這些 I/O 引腳支持高達(dá) 40 mA 驅(qū)動(dòng)電流,因此可直接驅(qū)動(dòng)中型 LED 陣列。 對(duì)于功率較高的照明或者直流電機(jī),模擬輸出可用于驅(qū)動(dòng)功率晶體管或橋式電路。 對(duì)于要求更苛刻的應(yīng)用,這種輸出可通過(guò)簡(jiǎn)單的 R/C 網(wǎng)絡(luò)濾波,且可用作放大器或者電流源的控制電壓。
更多的模擬技巧
一些 AVR MCU(包括 MEGA8 和 MEGA168)內(nèi)置了比較器,能將一個(gè)輸入電壓與另一個(gè)外部輸入進(jìn)行比較,如與某個(gè) PWM 輸出產(chǎn)生的電壓或者基準(zhǔn)器件的內(nèi)部基準(zhǔn)電壓比較。 比較器的電壓可以被輪詢(xún)或者用于觸發(fā)一個(gè)中斷。 盡管涉及了更多的軟件, 但中斷驅(qū)動(dòng)式排列能讓處理器直接檢測(cè)欠壓和過(guò)壓條件,無(wú)需再對(duì)模擬通道進(jìn)行重復(fù)采樣。 對(duì)于從可調(diào)閾值的運(yùn)動(dòng)探測(cè)器、沖擊傳感器到生物醫(yī)學(xué)監(jiān)視的每一種應(yīng)用,這都是一項(xiàng)非常方便的功能。
對(duì)于 MCU 無(wú)內(nèi)置比較器的 Arduino 板,可相對(duì)容易地在一些 Arduino 板上的 “Kluge” 區(qū)域添加一個(gè)外部器件,如 LM741、LM339N 或 TLC3704。 如您的板子上沒(méi)有用戶(hù)電路安裝空間,則可通過(guò)一塊價(jià)格低廉的原型設(shè)計(jì)擴(kuò)展卡添加用戶(hù)電路(圖 3)。
圖 3:利用原型設(shè)計(jì)擴(kuò)展卡,您能方便地將自己的模擬或者數(shù)字 I/O 添加到幾乎任何一塊標(biāo)準(zhǔn)的 Arduino 板上。
總結(jié)
Arduino 器件憑借自身的低成本、多功能優(yōu)勢(shì),在商業(yè)硬件開(kāi)發(fā)人員中培養(yǎng)了一批忠實(shí)擁躉。 Arduino 硬件平臺(tái)旨在將大多數(shù)模擬能力植入 Atmel 的 ATmega 8 位 MCU 系列中。 這些 MCU 的所有變體均有一個(gè)片載多通道模數(shù)轉(zhuǎn)換器 (ADC)。 本文旨在介紹 Arduino 模擬功能的基本軟硬件資源組成,為能夠用這些功能完成未來(lái)設(shè)計(jì)的工程師們提供一個(gè)新起點(diǎn)。 為此,我們討論了如何讀取模擬輸入、構(gòu)建 PWAM 模擬輸出和添加外部模擬 I/O。