硬件中断定时库 MsTimer2 的使用

硬件中断定时库 MsTimer2 的使用

很多时候需要精准定时的执行任务,

可以使用硬件中断定时库 MsTimer2

http://playground.arduino.cc/Main/MsTimer2
(注意此库精准度只有以 milli second 为单位)

MsTimer2 库简单好用, 只有三个 function:
(1)设定时间间与要执行的 function
MsTimer2::set( ms, your_function);
(2)启动中断
MsTimer2::start();
(3)必要时可停止中断
MsTimer2::stop();

先來看一个例子: 
#include  <mstimer2.h>
  
const int INTERVAL = 500;   // 0.5 秒 = 500ms
void onTimer( ) {
   static int val = 0;
   val = 1- val;  // toggle 0, 1
   digitalWrite(13, val);  // pin 13 LED
}
void setup( ) {
  pinMode(13, OUTPUT);
  MsTimer2::set(INTERVAL, onTimer); // INTERVAL ms 
  MsTimer2::start( );
}
void loop( ) {
  delay(6000); 
  MsTimer2::stop( );
  delay(3000);
  MsTimer2::start( );
}

这个例子让 pin13 的 LED 灯闪烁大约6秒, 然后停止大约3秒,                   
之后又闪烁大约6秒, 然后停大约3秒, ... 
 
用 MsTimer2 只能设定一件要定时做的事 !
查看 MsTimer2 库的 source code 会发现,
重复使用 MsTimer2::set( ) 只有最后一次有效,
每次使用 MsTimer2::set( ) 会覆盖掉前一次的设定 !!

注意事项:
如果使用了 MsTimer2 库, 
则 pin11 和 pin3 就不能再用做 PWM 输出了! 因为该 pin3 和 pin11 的 PWM 是靠 timer2 帮忙的! (tone( ) 也是**)
注意 Servo.h 库于 TimerOne 都是使用内部订时器 timer1 会影响 pin9, pin10 的 PWM
若用两个 Tone 变量则 timer1 也会被用掉, 用三个 Tone 则连控制 millis( )的 timer0 也会被用掉 !!! 
別忘了, timer0 负责控制 pin5 和 pin6 的 PWM 輸出 !!! 
只要不去改变 timer 的 Prescaler就不會影响其控制的 PWM pin, 但MsTimer2 库于 tone( )都会改变 Prescaler !!

用 MsTimer2 库是在中断时做事, 越快做完越好, 最好只是读取或设置一些 volatile 变量,然后在loop()内根据这些变量做相应处理,
还有, 这时中断在被禁止状态(interrupt is disable), 所以, 不要做会用到中断的事, 例如要避免做类似 Serial.print 的事 !
   

- 本文为本站原创文章,转载请保留出处。
- 文章链接:https://www.xpstem.com/article/10080

2022-06   阅读(1978)   评论(0)
 标签: 创客 Arduino 定时器

涨知识
数码管

也称作LED数码管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。

评论:
相关文章
ESP32 + Arduino使用TFT_eSPI库

Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789


Arduino 数据结构: 队列Queue

Queue 库提供了一个通用的 C++ 动态队列实现,专为在 Arduino 项目中使用而定制。


小鹏浇花套件单机版程序V1.0.0

本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。


Arduino 数据结构: ArrayList

ArrayList 类是一个 C++ 模板类,它提供了 ArrayList 的实现,以便轻松存储任何指定类型的值。它允许使用索引进行高效存储和检索,支持排序操作。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


理解 MSBFIRST(最高有效位)和 LSBFIRST(最低有效位)

在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。


Arduino 和 TB6612FNG 驱动直流电机

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。


Arduino-ESP32 Preferences库使用详解

Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。


Adafruit GFX图形库的使用

用于Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示器提供了通用语法和图形功能集。这使Arduino程序可以轻松地在显示类型之间进行调整,而不必花太多精力……


Arduino Serial 接收数字

在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。