查看: 206531|回复: 90

Arduino 定时器的使用

  [复制链接]

该用户从未签到

发表于 2013-4-7 16:40 | 显示全部楼层 |阅读模式
本帖最后由 Fortware 于 2013-4-7 16:52 编辑

看了这么久,第一次发帖,做点贡献。
最近了解了一下Arduino 的中断,除了外部中外,还有定时中断,前面已经有大神介绍过中断的概念,这里就不详细介绍了。
下面的程序是用定时器中断让13引脚 led灯每500ms变化一次。(使用的库在帖子底端)
[mw_shl_code=c,true]// led灯接UNO的13管脚
#include <MsTimer2.h>               //定时器库的 头文件

void flash()                        //中断处理函数,改变灯的状态
{                        
  static boolean output = HIGH;
  digitalWrite(13, output);
  output = !output;
}

void setup()
{
  pinMode(13, OUTPUT);

  MsTimer2::set(500, flash);        // 中断设置函数,每 500ms 进入一次中断
  MsTimer2::start();                //开始计时
}

void loop()
{

}
[/mw_shl_code]
再提供一种方法,利用  mills()同样函数可以实现中断的功能。mills()函数功能是获取系统运行的时间长度,单位ms。最大为9小时22分,如果超出时间将从0开始。函数的返回值为unsigned long型。
下面程序的功能让led灯亮灭各500ms :
[mw_shl_code=c,true]unsigned long ledOn=500,ledOff=500; //定义led灯变化的时间长度,每500ms变化一次
int ledStatus;                      //定义LED灯的状态,HIGH or LOWm
void setup()
{
    pinMode(13,OUTPUT);
    digitalWrite(13,HIGH);
    ledStatus=HIGH;
}
void loop()
{
    unsigned long nowtime=millis(); //获取当前的系统运行时间长度
    if(ledStatus==HIGH)             //如果当前lled灯状态为高电平,则执行该程序
    {
      if(nowtime>ledOn)             //检测系统运行时间长度是否到500ms
      {
        ledOn=nowtime;              //记录当前时间长度,第一次为500ms,赋值给ledOn
        ledOff=nowtime+500;         //计算出下一次led灯变化的时刻,第一次运行程序时应该在1000ms时关灯
        digitalWrite(13,LOW);       //关掉led灯
        ledStatus=LOW;              //记录当前led灯状态,下一次使用     
      }
    }

  else{      
         if(nowtime>ledOff)
         {   
          ledOff=nowtime;
          ledOn=nowtime+500;
          digitalWrite(13,HIGH);
          ledStatus=HIGH;
         }
      }
}[/mw_shl_code]
如果需要,可以控制led灯在某一时间段或某一时刻亮灭。

PS:使用mills()函数的好处在于占用的整个程序运行时间短,如果用用延时函数,在延时的时间内,CPU不能干别的事儿。




MsTimer2.zip

2.65 KB, 下载次数: 7202

该用户从未签到

发表于 2013-11-11 12:14 | 显示全部楼层
本帖最后由 xh1951 于 2013-11-11 14:32 编辑

arduino-mega2560上要用FlexiTimer2.h,否则编译能通过,但不会产生定时中断
#include <FlexiTimer2.h >

void flash() {
  static boolean output = HIGH;

  digitalWrite(13, output);
output = !output;
}

void setup() {
  pinMode(13, OUTPUT);
  FlexiTimer2::set(1000, flash);
  FlexiTimer2::start();
}

void loop() {

}

FlexiTimer2.zip

3.83 KB, 下载次数: 2410

  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2013-8-19 21:48 | 显示全部楼层
    qptimus 发表于 2013-8-19 20:26
    mega2560不能用?

    可以用
  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2013-4-7 20:36 | 显示全部楼层
    补充下,直接使用timer会影响对应的pwm输出功能

    该用户从未签到

    发表于 2013-4-9 22:28 | 显示全部楼层
    coloz 发表于 2013-4-7 20:36
    补充下,直接使用timer会影响对应的pwm输出功能

    那应该怎么办呢 求指教~

    该用户从未签到

    发表于 2013-4-9 22:33 | 显示全部楼层
    还有 请问 停止定时器的函数是什么?

    该用户从未签到

    发表于 2013-4-9 22:44 | 显示全部楼层
    jianglai527 发表于 2013-4-9 22:33
    还有 请问 停止定时器的函数是什么?

    ···这个已经在库函数里找到了···MsTimer2::stop()

    该用户从未签到

    发表于 2013-4-9 22:49 | 显示全部楼层
    coloz 发表于 2013-4-7 20:36
    补充下,直接使用timer会影响对应的pwm输出功能

    我还有个问题:看帖说mega328自带有有3个计时器,0号是用于生成delay()的  这个库函数的意思是我只能使用2号计时器吗?能同时使用2个计时器吗?我刚好要在使用定时器的时候用PWM= =,请问应该怎么处理?那么多PWM口是共用一个定时器的吗?

    谢谢指教!!
  • TA的每日心情
    慵懒
    2017-2-21 13:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 2013-8-19 20:26 | 显示全部楼层
    mega2560不能用?
  • TA的每日心情
    慵懒
    2017-2-21 13:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 2013-8-19 23:49 | 显示全部楼层
    coloz 发表于 2013-8-19 21:48
    可以用

    我刚刚试了,没有反应,没有进入中断

    该用户从未签到

    发表于 2013-8-24 17:27 | 显示全部楼层
    我刚刚试了,没有反应,没有进入中断 与9楼一样
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    Arduino物联网开发实例教程
    Arduino物联网开发实例教
    [md] **blinker用户交流群 301438087 (仅限github已Star的用户加群)** ## bli
    ESP8266读DHT11温湿度,开发微信小程序实时显示教程 = arduino...
    ESP8266读DHT11温湿度,开
    第一、原理讲解原理简述:利用发布订阅模式。第一步,先读取DHT11温湿度数值,第二步
    arduino连接ESP8266-01给微信发消息,消息提醒等
    arduino连接ESP8266-01给
    材料准备 ESP8266-01/ESP8266-01s一块 arduino 一块 手机一块 接线 ESP8266-0
    arduino for esp8266
    arduino for esp8266
    大佬们帮我看看这是什么问题,原来从来都能用,现在一编译就出现这个错误
    【传感器大赏】碰撞传感器
    【传感器大赏】碰撞传感器
    Grove-Collision Sensor Grove - Collision Sensor可以检测碰撞和振动,当检测到时会
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表