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次,串口输出是单号的时候是亮的,双号的时候的熄灭的。
心得总结
说说在学习MsTimer2中遇到的问题吧,因为我设置的是每两秒进入一次中断,控制板的运行速度非常快,就不会存在中断函数还没执行完毕,下一次中断就又到来了的情况,两秒一次的中断时间足够执行很多行代码了。
起初我是想把loop函数中的程序放在中断函数fals中去执行的,但并不像我想像的那样运行——在中断中改变电平后会持续整个中断的时间,这个问题的原因就是控制板的运行速度太快了,很快就执行完中断回到loop函数,于是我又想在中断中添加个延时函数,但是这并不行,通过查找资料,我才知道在中断函数中,delay()和millis()函数将不起作用。然后我又让loop函数执行一个空循环,arduino的串口监视器有数据输出,但是3号引脚连接的二极管依然不亮。
要运用中断,最好的方式还是只有通过中断来改变变量的值(代码中a的值)来实现控制,灯闪烁的时间由进入中断的间隔来决定。