一、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()函数。我们了解了它的优点和原理,并了解了它的一些应用场景。在实际的应用中,我们可以根据具体的需求来使用这个函数,从而达到更高效的开发结果。