使用可以在Arduino板上使用的數字和模擬引腳,您可以接收或發送電信號以控製或從電子項目中獲取數據。 此外,在這種類型的印版中還有其他非常有趣的信號,這些信號是 PWM, 可以模擬模擬信號而無需實際模擬。 也就是說,它們是數字引腳,可以以類似於模擬信號的方式(不同)起作用。
當您不僅要使用數字高和低信號(即1或0,ON和OFF),而且想進一步說明時,這些類型的信號非常實用。 稍微複雜一些的信號。 例如,可以調節 電機直流,或螺線管等燈的光強度。
模擬與數字系統
電子電路可以分為兩個大家族或大類: 數字和模擬。 在談論數字電子時,我們使用具有離散值的量,即由低或高電壓電信號表示的二進制系統來解釋要處理的那些位的狀態。 另一方面,當涉及到模擬電路時,正在使用具有連續值的數量。
在數字系統內可以依次找到 組合型和順序型。 也就是說,前者是那些系統的輸出僅取決於輸入狀態的系統。 另一方面,在順序存儲器中,包括存儲元件,並且輸出將取決於輸入的當前狀態和存儲的先前狀態。
對於類似物,沒有這兩個大的組或變體,因為在這裡它們是連續的信號,將始終取決於 拉塞納爾 當前系統。 例如,在揚聲器中,提供給揚聲器的信號將取決於您要再現的聲音。 麥克風也一樣,麥克風會根據所接收的聲音生成模擬信號。 當然,您還可以通過我們在本博客中描述的許多其他傳感器看到它並與模擬信號一起使用(因此必須創建一個公式,以便以後可以在Arduino IDE草圖中計算或調節值) )...
彼此的這些特性使某些特性各有千秋 的優點和缺點,幾乎所有內容都一樣。 例如,數字信號通常更便宜,更快,更容易開發,信息可以更輕鬆地存儲,它們具有更高的準確性,可以進行編程,不那麼容易受到噪聲的影響等。 但是,確實可以使用模擬信號處理更複雜的信號。
通過 例子,數字型霍爾效應傳感器只能檢測附近磁場的存在或不存在。 取而代之的是,模擬霍爾效應傳感器不僅可以做到這一點,而且還可以通過在其輸出端生成的模擬信號來確定所述磁場的密度。 知道如何很好地解釋電壓更高或更低的信號,就可以輕鬆知道該幅度。 您還可以使用模擬系統定量測量其他性質的示例,例如溫度,時間,壓力,距離,聲音等。
模擬與數字信號
話雖這麼說, 模擬信號 它是隨時間連續變化的電壓或電流。 如果以圖表形式顯示,則模擬信號將是單頻正弦波。
由於 數字信號,是相對於時間逐步變化的電壓。 也就是說,如果以圖形表示,則它將是一個步進信號,它不會連續變化,而是以步進或離散增量變化。
您應該知道,存在從模擬信號到數字信號的電路,反之亦然。 這些 轉換器 它們被稱為DAC(數模轉換器)和ADC(模數轉換器)。 它們在我們今天使用的許多設備(例如電視,計算機等)中非常常見。 有了它們,您可以將這些設備使用的數字信號轉換為電子電平,以與其他外圍設備或以模擬方式工作的部件一起使用。
通過 例子,可以與聲卡一起使用的具有模擬信號的揚聲器或麥克風,或者俱有著名的用於模擬監視器端口的RAMDAC芯片的數字圖形卡...在Arduino中,這種類型的轉換器還可以用於多個項目,我們將看到。 ..
什麼是PWM?
雖然 PWM(脈衝寬度調製)或脈衝寬度調製, 由於具有數字底座,其信號形狀類似於某種“方形”的模擬信號。 正如我之前已經評論過的,它允許通過數字脈衝來改變信號以模擬模擬系統。 實際上,如果您看一下名稱,它已經通過數字脈衝的寬度為您提供了提示。
這對 Arduino的 因為您可以將許多自動化或電子組件添加到您的項目中,並且 無法提供真實的模擬信號,但他們使用此PWM進行操作。 他們也不能使用離散的模擬信號,也就是說,電壓跳變類似於數字信號。 他們能做的是使用數字輸出-Vcc或數字類型的Vcc生成此特殊信號...
因此,PWM是一種“技巧”,Arduino和其他系統可以通過它與此類信號進行互操作, 他們不是完全的模擬,也不是傳統的數字。 為了使之成為可能,它們會始終保持數字輸出在特定時間處於活動狀態或處於關閉狀態,這取決於始終的興趣。 這與脈衝寬度相同的數字時鐘或二進制代碼信號相去甚遠。
在使用Arduino的項目中,您可以檢查這種類型的PWM信號,該信號在一段時間內保持恆定的脈衝觸發頻率,但是 這些脈衝的寬度是變化的。 實際上,當信號相對於整個週期保持高電平時,它稱為佔空比。 因此,佔空比以%給出。
請記住,在PWM中,您不會像在多個電壓值之間的模擬信號那樣工作,並且在兩個電壓值之間會波動。 在PWM的情況下,它是數字形式的方波信號, 最大值為Vcc。 例如,如果使用3V電源,則可以提供3V或0V脈衝,但不能提供1V或任何其他中間值,這在真實模擬中會發生。 在這種情況下,變化的是脈衝寬度,我們可以在高Vcc值下保持30%的脈衝寬度,或者將60%的脈衝寬度賦予更大的功率,依此類推。
但是要小心,因為如果設備支持Vcc限制並且超出了PWM,則可能會損壞它。 因此,始終有必要尊重製造商提供的數據表的值。 另外,在某些設備(例如直流電動機)中, 接力,電磁鐵等在“佔空比”後撤除電壓,這可能意味著電感性負載可能會造成損壞。 這就是為什麼 保護措施 及時。
Arduino上的PWM
現在您知道它是如何工作的,讓我們看一下Arduino世界中PWM的具體情況...
PWM:Arduino上的引腳排列
在Arduino板上,您可以找到幾個實現硬件PWM的引腳。 您可以在PCB本身上識別它們,因為它們具有 符號〜(小頭) 以及引腳編號。 它也可以通過Arduino代碼中的軟件來完成,但是這會使微控制器工作繁重,而當它可以通過本機和硬件完成時,這是荒謬的。
- Arduino UNO,迷你和納米-您在引腳6、8、3、5、6和9上有10個11位PWM輸出,這些輸出將在數字的前面。
- Arduino的兆豐-在此功能最強大的Arduino板上,您具有15個8位PWM輸出。 它們位於引腳2到13和44到46上。
- Arduino到期:在這種情況下,有13個8位PWM輸出。 它們位於引腳2至13上,另外還有兩個由DAC離散化的12位分辨率模擬輸出。
在這種類型的PWM輸出中,當談到8位或12位等分辨率時,是指您有足夠的迴旋餘地。 和 8位具有256級 您可以在這兩者之間變化,並且12位上升到4096級。
計時器控制
對於硬件PWM控制,Arduino 將使用計時器 為了它。 每個當前的定時器可以提供2或3個PWM輸出。 每個輸出的比較寄存器對該系統進行了補充,因此,當時間達到寄存器的值時,將更改輸出的狀態或值以停止那些佔空比。 儘管有兩個輸出由同一個定時器控制,但是儘管它們共享相同的頻率,但它們都可以具有不同的佔空比。
對於與每個PWM引腳關聯的定時器,它會有所不同 取決於Arduino開發板的類型 你有:
- Arduino UNO,迷你和納米:
- 定時器0-5和6
- 定時器1-9和10
- 定時器2-3和11
- Arduino的兆豐:
- 定時器0-4和13
- 定時器1-11和12
- 定時器2-9和10
- 計時器3-2、3和5
- 計時器4-6、7和8
- 計時器5-44、45和46
預分頻寄存器將把時間除以一個整數,而定時器則將剩下的時間控制每個相關的PWM輸出。 修改註冊表值可以更改頻率。 這 頻率 根據計時器和盤子的不同,它們也會有所不同:
- Arduino UNO,迷你和納米:
- 定時器0:允許預分頻1、8、64、256和1024。頻率為62.5 Khz。
- 定時器1:預設為1、8、64、256和1024。頻率為31.25 Khz。
- Timer2:與Timer1相同,只是它在先前的計數基礎上增加了32和128的預分頻比。
- Arduino的兆豐:
- 定時器0、1、2:與上述相同。
- Timer3、4和5:頻率為31.25 Khz,並預先分頻為1、8、64、256和1024。
不兼容和衝突
計時器 與輸出關聯的功能不僅限於該功能,也被其他人使用。 因此,如果它們被另一功能使用,則必須在一個或另一個之間進行選擇,不能同時使用這兩個功能。 例如,以下是您在項目中可能發現的一些不兼容性:
- 伺服庫:使用伺服電機時,會大量使用定時器,這可能會導致衝突。 專門將Timer1用於UNO,Nano和Mini,即,在該庫中使用草圖時,不能使用引腳9和10。 在兆豐,這將取決於伺服器的數量...
- SPI:如果Arduino板上使用SPI通信,則引腳11用於MOSI功能。 這就是為什麼不能使用PWM引腳的原因。
- 音:此功能使用Timer2進行操作。 因此,如果使用它,則會使針腳3和11(對於Mega針腳來說是9和10)變得無用。
使用Arduino進行動手測試
如果您想就地了解PWM在Arduino上的工作方式,那麼最好的辦法就是連接一個 電壓表或萬用表 (用於測量電壓)在您選擇使用的PWM引腳與Arduino板的接地引腳或GND之間。 這樣,借助此PWM技巧,在測量設備的屏幕上,您將能夠看到數字輸出的電壓變化情況。
您可以將電壓表/萬用表替換為LED,以查看光強度如何變化,使用直流電動機或所需的任何其他元件。 我在圖表中使用帶更多指示燈的Fritzing簡化了它,但是您知道它也可以代表萬用表的技巧...
如果使用LED,請記住陰極和GND處的電阻。
至 源代碼 為了控制Arduino開發板微控制器以使所有功能正常工作,您應該將其插入Arduino IDE(在這種情況下,我使用了 Arduino UNO):
const int analogOutPin = 6; byte outputValue = 0; void setup() { Serial.begin(9600); pinMode(ledPIN , OUTPUT); bitSet(DDRB, 5); // LED o voltímetro bitSet(PCICR, PCIE0); bitSet(PCMSK0, PCINT3); } void loop() { if (Serial.available()>0) { if(outputValue >= '0' && outputValue <= '9') { outputValue = Serial.read(); // Leemos la opción outputValue -= '0'; // Restamos '0' para convertir a un número outputValue *= 25; // Multiplicamos x25 para pasar a una escala 0 a 250 analogWrite(ledPIN , outputValue); } } } ISR(PCINT0_vect) { if(bitRead(PINB, 3)) { bitSet(PORTB, 5); // LED on } else { bitClear(PORTB, 5); // LED off } }
大家好首先,我要感謝您為最新的解釋付出的時間。
我想問你一個問題。 我正在嘗試在Arguino Mega的proteus 8模擬器上運行代碼。 我將電壓表連接到引腳6,Proteus連接到串行端口,但是我不知道如何或如何改變以輸出不同的電壓。 我必須對代碼進行些微調整才能使其編譯。 非常感謝您的幫助