2013-06-20 68 views
1

對於具有一些交互式安裝的展覽,我必須創建一個系統,從三個超聲波PING傳感器讀取數據,並在一個輸出端連接一個調光器。Arduino計時器似乎正在崩潰?

所以我拿了我的Arduino Mega板,圍繞它製造了一些硬件(DMX的信號反相器),並使用庫DmXSimple測試了DMX調光器。它工作正常!

下一步:測試PING傳感器。我使用庫NewPing,並連接了傳感器。它工作正常!

現在兩個在一起,在一個程序中:導入兩個庫,使用相同的代碼。 它不起作用!

計時器碰撞?那麼......無論如何 - 我不知道如何解決這個問題。我該怎麼辦?如果它是一個計時器問題(也就是說,這兩個庫調用同一個計時器),我真的不知道如何修改庫來使它工作。

回答

1

Arduino上有兩個定時器,您可以將兩個工作放在一邊。 DmxSimple明確表示它使用定時器#2,而對於NewPing則不清楚。但NewPing庫可以在不使用定時器的情況下工作。您可以使用它的定時器(這是強制性的貼近實時提供巴士交互)使DmxSimple工作,而你可以處理在循環功能的聲納脈衝:

void loop() { 
    int dst = sonar.ping_cm(); 
    delay(50); 
    DmxSimple.write(1, dst); 
} 

在那裏,你不該」沒有定時器衝突。

望着NewPing的源代碼,它使用定時器2,如果你使用timer_us()/timer_ms()功能,但沒有定時器否則。但是如果您在Arduino Leonardo(或Arduino Micro或任何其他基於ATmega32U4的微控制器)上運行它,它將使用不與DmxSimple衝突的Timer4。

如果要修補的NewPing庫爲使用Timer3,你可能想在NewPing.cpp替換此:

OCR2A = 249; 
TIMSK2 |= (1 << OCIE2A); 

OCR3A = 640; 
TIMSK3 |= (1 << OCIE3A); 

和STOP_TIMER:

TIMSK2 &= ~(1 << OCIE2A); 

TIMSK3 &= ~(1 << OCIE3A); 
+0

感謝您的幫助,zmo!看來,我已經找出了一條途徑。我在NewPing庫Timer2中更改爲Timer4。儘管我不知道自己在做什麼,但我一直在嘗試和錯誤,直到我得到了一些有用的結果。 – kilian232323

+0

但是,您的建議是在Ping代碼中使用Delay,對我沒有任何幫助,因爲我的程序的其餘部分需要進行常量(和「不間斷」)更新,因此我必須避免任何類型的延遲陷阱。 – kilian232323

+0

也許你想看看修改過的NewPing庫,我試圖用定時器4替換定時器2.可能有趣的是,我正在使用Arduino Mega 1280. – kilian232323