arduino定时器(MsTimer2)学习

学习之前,先认识一下定时器的中断函数吧

void set(unsigned long ms, void (*f)())
这个函数设置定时中断的时间间隔和调用的中断服务程序。ms表示的是定时时间的间隔长度,单位是ms,void(*f)()表示被调用中断服务程序,只写函数名字就可以了。

void start()
开启定时中断

void stop()
关闭定时中断

这三个函数都是在MsTimer2的作用于中进行的,在使用时都要加上作用域。

下面通过一段代码讲解来学习吧
我使用的是arduino nano(用哪一个控制板都没有关系)来验证定时函数,下面的代码想要实现的功能是,每隔两秒进入一次中断,改变a的值,从而控制3号引脚的发光二极管的熄灭和亮。总共会闪烁5次,之后是保留最后一次的a值,并退出中断。加入串口的目的在于,我们能很好的在串口显示器上观察键值的变化,什么时候中断结束。

#include<MsTimer2.h>    //MsTimer2库
int a;            //定义一个全局变量,将在被调用的中断函数中使用
void fals(){      //中断函数
 static int i=0;    //定义的一个静态变量,每次进入中断时,i保留上一次的值
 if(i%2==0){    //通过i来改变a的值,用a来改变pin 3 的电平
 a=0;
  }
  else{
    a=1;
    }
 if(i==9){     //通过串口查看i的值,并在i=9时关闭中断
  MsTimer2::stop();   //关闭定时中断的函数
  Serial.println("9中断已结束");   
  }
   Serial.println(i);      //当i=9时,执行完上面的if语句后还会在串口监视器上显示9
   i++;
  }
void setup() {      //初始化
 Serial.begin(9600);    //设置波特率
 pinMode(3,OUTPUT);    //3号引脚,输出模式
 digitalWrite(3,1);     
 MsTimer2::set(2000,fals);   //每2秒进入一次中断,中断函数是fals()
 MsTimer2::start();     //开启定时中断函数
}

void loop() {    //依据中断改变的a值来变换3号引脚的高低电平
  if(a==0){
   digitalWrite(3,0);
  }
  else{
    digitalWrite(3,1);
    }
  }

运行效果,发光二极管会闪烁5次,串口输出是单号的时候是亮的,双号的时候的熄灭的。

arduino esp32定时器中断_引脚

心得总结

说说在学习MsTimer2中遇到的问题吧,因为我设置的是每两秒进入一次中断,控制板的运行速度非常快,就不会存在中断函数还没执行完毕,下一次中断就又到来了的情况,两秒一次的中断时间足够执行很多行代码了。

起初我是想把loop函数中的程序放在中断函数fals中去执行的,但并不像我想像的那样运行——在中断中改变电平后会持续整个中断的时间,这个问题的原因就是控制板的运行速度太快了,很快就执行完中断回到loop函数,于是我又想在中断中添加个延时函数,但是这并不行,通过查找资料,我才知道在中断函数中,delay()和millis()函数将不起作用。然后我又让loop函数执行一个空循环,arduino的串口监视器有数据输出,但是3号引脚连接的二极管依然不亮。

要运用中断,最好的方式还是只有通过中断来改变变量的值(代码中a的值)来实现控制,灯闪烁的时间由进入中断的间隔来决定。