題:
我可以將一個Arduino上的PWM引腳連接到另一個Arduino上的模擬輸入嗎?
Hoytman
2015-04-13 02:36:34 UTC
view on stackexchange narkive permalink

儘管我當時正在考慮幾種不同的方法將簡單數據從一個Arduino發送到另一個Arduino,為什麼不將一個Arduino的PWN引腳連接到另一個的模擬引腳呢?通過在PWM引腳上設置不同的值,我可以向彼此發送簡單的消息。除了PWM引腳通過脈沖模擬電壓外,這似乎可行。

這是鏈接兩個Arduino的可靠方法嗎,如果我只想傳達4個狀態?另外,我需要在連接中包括一些其他組件(電阻,電容器等)

要做的就是發送2v脈衝(是)和5v脈衝(否)。它每小時大約需要執行6次。

四 答案:
Russell McMahon
2015-04-13 07:27:00 UTC
view on stackexchange narkive permalink

是的,通過添加兩個便宜的組件,您可以通過“一點編程”或更輕鬆地實現此目的。

如果您將PWM_Out的一個47k電阻連接到Analog_In,並將Anaolg_In的一個100uF電容器連接起來,接地,您將能夠讀取等效模擬值,精度約為1%。讀取N次(可能是10次),讀取之間要延遲12毫秒,然後取平均值以得到更好的結果。之所以可行,是因為PWM週期大約為1毫秒,因此延遲多個週期而不是精確的倍數意味著您需要半隨機採樣。

對於所需的分辨率(4個級別),可以使用更小的電容器(可能為1 uF)。但是即使是100 uF的電容器也很便宜。

您可以取而代之的是使用PWM輸出(analogWrite)和digitalRead。執行100次數字讀取,每次讀取之間間隔12毫秒(總計約1.2秒),並保持兩個計數-PinWasHigh和PinWasLow(顯然)處於高電平或低電平狀態。 PinWasHigh的內容告訴您讀取的百分比高。由於隨機抽樣,您不能依賴於100個級別,但是確定說10個級別應該可以提供良好的準確性。 PinWasHigh和PinWasLow的總和應為100,以進行健全性檢查。

雖然使用串行端口(硬件或軟件)或SPI允許每次一次傳輸更多的數據,而無需付出太多努力,但這種簡單的模擬方法是對於許多應用程序來說足夠好了。

很好的答案,我最終選擇了答案最底層的無組件解決方案
@Hoytman我沒有提到類似的解決方案,該解決方案需要更多的編碼知識,但讀取速度更快。 Arduino PWM每週期需要** ABOUT ** 1毫秒。如果您在micros()變高時將其值提高並再次與它變低時的值進行比較,則可以得到以微秒為單位的APPROXIMATE高時間。您可以在短時間內做同樣的事情。兩者應加到〜= PWM週期。一旦您對讀取高脈衝持續時間的能力充滿信心並且對各種變化感到滿意,那麼您可以在2 ms的時間內讀取較高的PM%。
Milliways
2015-04-13 03:11:04 UTC
view on stackexchange narkive permalink

可能,但不是最好的主意。模擬輸入需要一個相當穩定的輸入-這可以通過RC濾波器來平滑PWM輸出來實現。

您最好使用Arduino支持的眾多通信協議之一(串行,SPI,I²C)。

最好的選擇是使用SPI,因為它是最快的通信方法。相反,最容易使用(至少從我學到的東西)的是I2C
它要做的就是發送2v脈衝(是)和5v脈衝(否)。它每小時大約需要執行6次。
@Hoytman,那麼為什麼不發送1秒的脈衝表示“是”而發送10秒的脈衝表示“否”呢?只需拉一下(至少每秒一次),然後計算回落多長時間?
CORTEX Systems
2016-08-15 17:28:53 UTC
view on stackexchange narkive permalink

要獲得更高的精度,更少的代碼,更快的執行速度並且無需電容器,就可以通過

數字輸入引腳讀取另一個Arduino上的PWM“模擬”信號> pulseIn(pin,HIGH,timeout)

超時是可選的(默認為1秒)。線路變高時,計時器啟動,並在線路變低的瞬間自動停止。

使用PWM通信(與i2c,SPI等相反)的主要原因是同時廣播到無限數量的設備,而無需時鐘信號或確認。

我們目前正在使用這種通信方法進行神經網絡通信,該神經網絡由用於每個神經元子結構的單獨的微型處理器(用於每個突觸和激活功能的一個處理器)組成。

的確,如果處理器可以用來進行測量,那麼它比濾波方法要好得多。如果沒有,應該更好地使用硬件計時器和中斷來處理它。但是,所有這些方案通常都不如諸如異步串行,I2S,SPI等地值編碼的通信通道。
bets
2017-03-23 14:21:22 UTC
view on stackexchange narkive permalink

完整的解決方案,用於接收 PWM 信號並將轉換為類似 analogRead()的信號。

  int var = pulseIn(digitalPin,HIGH,4200); if(var == 0 &&),它基於@Cortex_systems答案,並想與他人共享以幫助其他人獲得更全面的答案。 digitalRead(digitalPin)== 1){var = 2100;} var = map(var,0,2100,0,1023);  

原因如下:

  • 您不能只將PWM信號讀取到arduino中的模擬引腳。我們將在其 pinMode設置為輸入的數字引腳中接收PWM,並使用pulsIn(pinNum,高/低,超時)進行讀取。
  • pulseIn()記錄脈衝的長度。 PWM中的最長脈衝為2100微秒。
  • 將2個PWM週期的超時設置為4200。如果沒有此參數,它將在PWM為0或255的情況下等待新的高點並凍結代碼。
  • 在最大和最小時,該值將讀取為0,因此在這種情況下,請使用digitalRead()檢查以確定並進行調整。
  • 最後,映射結果,使其看起來像AnalogRead()。

注意!這會增加多達4.2毫秒的代碼延遲。

要無延遲地讀取PWM,請使用中斷http://www.camelsoftware.com/2015/12/25/reading-pwm-signals-from-an-rc-receiver-with-arduino/


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...