一、millis()函數的原理
在使用Arduino進行開發時,我們經常會使用到millis()函數。這個函數的作用是返回程序運行時間(以毫秒為單位)。這個函數的實現原理是基於計算機系統中的定時器中斷。
當你調用millis()函數時,它會返回自外部中斷0引腳上次觸發的時間(以毫秒為單位)。如果你記錄了當前時刻,你可以將兩個時刻的差值轉換成你需要的時間單位,以實現時間測量、定時和延時等操作。
每個定時器中斷的時間間隔為1毫秒(或4毫秒),也就是說,如果你運行了一段時間,你可能會在外部中斷0引腳上看到一條穩定的PWM波形。
unsigned long lastTime = 0; unsigned long currentTime = millis(); unsigned long timeInterval = currentTime - lastTime; // 計算時間間隔 lastTime = currentTime; // 更新上一次時間戳
二、millis()函數的優勢
在嵌入式系統中,對於延時和時間間隔的測量是非常基礎、常用也容易出錯的操作。在以前,我們通常會使用delay函數或者外部計時器的計數器進行測量。
但是,這兩種方法都不能很好地適應多任務和非同步操作的需求。使用delay函數會阻塞整個系統,而使用計數器會強制你手動調用計數器和計時器中斷的計數。在複雜的系統中,這些操作會佔用大量的CPU時間,導致系統響應緩慢甚至崩潰。
與這些方法相比,使用millis()函數具有一些優勢:
- millis()函數不會阻塞整個系統,因為它只是返回計時器中斷的時間戳。
- millis()函數非常準確,因為它使用系統硬體定時器。
- millis()函數非常容易使用,因為它只需要一個簡單的函數調用。
三、millis()函數的應用
在使用millis()函數進行時間測量和延時時,你需要知道當前時間戳和上一次時間戳之間的差值。通常情況下,你需要定義一個全局變數來存儲上一次時間戳。
在Arduino中,我們可以使用millis()來實現很多應用。比如:
- 時間控制,定時器、計數器和鬧鐘系統的實現。
- 按鍵消抖(當按鍵按下時,等待一段時間以消抖,以確定按鍵是否真正按下)。
- 物品測距,當超聲波發生器和接收器之間沒有障礙物時,通過測量信號發出和返回的時間來計算距離。
- 太陽能利用,使用光敏感測器來測量光線強度,並根據測量結果來調整太陽能板的朝向。
四、代碼示例
下面是一個使用millis()函數實現閃爍LED的簡單代碼示例:
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { unsigned long currentTime = millis(); static unsigned long lastTime = 0; unsigned long interval = 1000; // 閃爍間隔 if (currentTime - lastTime >= interval) { lastTime = currentTime; digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // 翻轉LED狀態 } }
這個程序會使內置LED在1秒鐘內翻轉一次。在每次循環中,它會檢查當前時間戳和上一次時間戳之間的時間間隔。如果時間間隔超過了閃爍間隔,就會翻轉LED狀態。
五、總結
通過這篇文章的闡述,我們更深入的理解了Arduino中的millis()函數。我們了解了它的優點和原理,並了解了它的一些應用場景。在實際的應用中,我們可以根據具體的需求來使用這個函數,從而達到更高效的開發結果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258591.html