查看: 71303|回复: 28

在Arduino中使用看门狗定时器

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2013-2-10 13:36 | 显示全部楼层 |阅读模式
    本帖最后由 奈何col 于 2014-1-17 21:11 编辑

    看门狗(Watch Dog)是一个独立的定时器,当你开启看门狗后,需要在程序中看门狗定时器溢出前,对其进行 喂狗(复位)操作,否则看门狗会强制你的单片机重启,从头运行程序。
    zuiaikanshu.jpg
    虽然Arduino核心库并未提供看门狗相关的API,但AVRGCC提供了相应的API支持,同样简单易用。
    需要注意的是Arduino bootloader并不支持看门狗,如果你直接使用看门狗定时器,可能会卡死在bootloader中。如果要使用看门狗建议使用ISP下载器直接下载程序。

    在使用该API前,你需要调用相应的头文件wdt.h:


    在wdt.h中,提供了3个看门狗API:

    kittenblock中小学创客名师推荐的图形化编程软件

    wdt_enable(timeout) //看门狗使能 并设置超时时间
    wdt_disable() //看门狗禁止
    wdt_reset() //看门狗复位

    wdt_enable(timeout) 中timeout可使用如下常量:
    序号
    常量
    定义
    1
    WDTO_15MS
    看门狗定时器15ms超时
    2
    WDTO_30MS
    看门狗定时器30ms超时
    3
    WDTO_60MS
    看门狗定时器60ms超时
    4
    WDTO_120MS
    看门狗定时器120ms超时
    5
    WDTO_250MS
    看门狗定时器250ms超时
    6
    WDTO_500MS
    看门狗定时器500ms超时
    7
    WDTO_1S
    看门狗定时器1S超时
    8
    WDTO_2S
    看门狗定时器2S超时
    9
    WDTO_4S
    看门狗定时器4S超时
    10
    WDTO_8S
    看门狗定时器8S超时


    通常情况下,在arduino中使用该API,你需要在setup中使能看门狗定时器,并在loop中按实际需要进行喂狗操作。示例代码如下:

    kittenblock中小学创客名师推荐的图形化编程软件

    
    #include <avr/wdt.h>
    void setup()
    {
       pinMode(13,OUTPUT);
       wdt_enable(WDTO_2S); //开启看门狗,并设置溢出时间为两秒
    }
    
    void loop()
    {
       digitalWrite(13,HIGH);
       delay(100);
       digitalWrite(13,LOW);
       delay(100);
       wdt_reset(); //喂狗操作,使看门狗定时器复位
    }


    最后附带AVRGCC 的手册:http://www.arduino.cn/avrgcc/


    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2013-2-15 13:15 | 显示全部楼层
    如果你是初学者,我是啦,就看看下面的,对理解本帖有帮助哦~
    简介
    看门狗定时器是单片机的一个组成部分,在单片机程序的调试和运行中都有着重要的意义。
    看门狗定时器(WDT,Watch Dog Timer)实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。
    看门狗定时器工作原理
    使能时,WDT将递增,直到溢出,或称“超时”。除非处于休眠或空闲模式,WDT 超时会强制器件复位。为避免WDT 超时复位,用户必须定期用PWRSAV 或CLRWDT 指令将看门狗定时器清零。如果WDT 在休眠或空闲模式下超时,器件将唤醒并从PWRSAV 指令执行处继续执行代码。在上述两种情况下,WDTO 位(RCON<4>)都会置1,表示该器件复位或唤醒事件是由于WDT超时引起的。如果WDT 将CPU从休眠或空闲模式唤醒,“休眠”状态位(RCON<3>)或“空闲”状态位(RCON<2>)也会置1,表示器件之前处于省电模式。
    功能作用
    此外,WatchDog还可以在你的程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路。看门狗定时器对微控制器提供了独立的保护系统,当系统出现故障时,在可选的超时周期之后,看门狗将以RESET信号作出响应,像x25045就可选超时周期为1.4秒、600毫秒、200毫秒三种。当你的程序死机时,x25045就会使单片机复位。
    大多数看门狗定时器IC产生一个单一的,有限的输出脉冲持续时间当看门狗超时。这适用于触发复位或中断微处理器,但有些应用需要输出(故障指示灯)的锁存器。
    考虑到安全性问题,汽车电子系统需要监控电路监测故障容限或安全性。看门狗定时器可理想满足这类需求,通过对微控制器正常工作条件下产生的周期脉冲进行检测,侦测电路或IC的失效状态,一旦发生故障可立即切换到备份/冗余系统。
    简单锁定看门狗定时器设计
    在看门狗(看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,是MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。出于对单片机运行状态进行实时监测的考虑,产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog))集成电路(MAX*9)的基础上,该电路提供了响应的输入脉冲流损失锁存故障指示。该电路可以监控风扇(上风扇的转速输出计算),振荡电路,或一个微处理器软件执行。
    大多数看门狗定时器IC产生一个单一的,有限的输出脉冲持续时间当看门狗超时。这适用于触发复位或中断微处理器,但有些应用需要输出(故障指示灯)的锁存器。一个简单的电路(图1)提供了响应的输入脉冲流损失锁存故障指示。在μP-supervisor/watchdog集成电路(MAX*9)的基础上,该电路用于监测风扇(在风扇的转速输出计算),振荡电路,或一个合适的微处理器软件执行。
    在上电期间,低电平有效复位仍然很低,直到VCC的稳定和复位超时时间到期。电容器C通过R,直到FET的栅极电压达到阈值(电压VTH),它开启了场效应管,使锁存能力。为了防止误触发,你应该设置RC延迟的时间远远超过了复位超时。
    WDI输入(引脚6)必须按切换电容器CSWT设立最低速率。如果这没有发生,低电平有效复位变低,在LED指示灯,在连接和低拉复位,从而锁定低电平复位。该电路仍然有效,直到你循环VCC或推开关在此条件。要么关闭FET的行动,并允许重置变高。
    为了监测风扇开漏测速信号,从世界发展指标10kΩ的连接到VCC(引脚8)上拉电阻器。由于风扇需要一些时间来旋转起来,看门狗电路需要为一个短暂的延迟时间间隔停用。您可以通过将本延迟电容(C2)从对地复位。请注意,此延迟必须小于上述RC延迟,或低电平有效复位锁存过早会较短。
    对于一个风扇监控,对CSWT值设置最大转速脉冲周期根据公式5.06×106 × CSWT,其中在几秒钟内CSWT。如果转速低于这个阈值时,低电平有效复位输出低和插销。
    看门狗定时器的操作
    在正常操作期间,一次WDT 超时溢出将产生一次器件复位。当器件处于休眠状态时,一次WDT超时溢出将唤醒器件,使其继续正常操作(即称作WDT 唤醒)。对WDTE 设置位清零可以永久性地关闭WDT。
    后分频器分配完全是由软件控制,即它可在程序执行期间随时更改。
    为避免发生不可预测的器件复位,当从Timer0 预分频器的分配改为WDT 后分频器的分配时,必须执行下列指令序列。即使WDT 被禁止,也要执行这个指令序列。
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2013-2-10 19:04 | 显示全部楼层
    占楼
    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2013-2-10 20:34 | 显示全部楼层
    哇,不错哦,简单易懂,顶一个
     发表于 2013-2-12 11:02
    Array[tthread=zuojianzhong_hua, 孤叶寒冰]http://app.qlogo.cn/mbloghead/7b58ea60f2555b0d94f2[/tthread]
  • TA的每日心情
    开心
    2016-6-30 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2013-2-18 13:05 | 显示全部楼层
    好贴要顶!好回复更要顶!
  • TA的每日心情
    开心
    2016-11-3 13:00
  • 签到天数: 52 天

    [LV.5]常住居民I

    发表于 2013-2-22 22:01 | 显示全部楼层
    顶一个,很好,学习了
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2013-2-25 09:48 | 显示全部楼层
    但我用Atmage328P的时候,不写入 bootloader的话WDT无作用哦。要写入 bootloader才可以。

    Atmgea8A的话,直接编译不通过。

    点评

    我试了,mega8A是可以编译通过的,你可能哪弄错了,代码和错误提示发来看看  详情 回复 发表于 2013-2-25 09:58
    你怎么直接编译不通过的呢?  详情 回复 发表于 2013-2-25 09:56
    这个,不应该呀~  详情 回复 发表于 2013-2-25 09:55
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2013-2-25 09:55 | 显示全部楼层
    loneress 发表于 2013-2-25 09:48
    但我用Atmage328P的时候,不写入 bootloader的话WDT无作用哦。要写入 bootloader才可以。

    Atmgea8A的话, ...

    这个,不应该呀~
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2013-2-25 09:56 | 显示全部楼层
    loneress 发表于 2013-2-25 09:48
    但我用Atmage328P的时候,不写入 bootloader的话WDT无作用哦。要写入 bootloader才可以。

    Atmgea8A的话, ...

    你怎么直接编译不通过的呢?
    如果以上内容对你有帮助,你可以通过打赏支持作者
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    游戏机和开发板脑洞一下;这个本来就是开源的。
    游戏机和开发板脑洞一下;
    这个开发板和标准UNO是1;1的;通用。做在一起是因为可以不用游戏机时可以切换回来做开
    新人求助,关于舵机和限位开关。
    新人求助,关于舵机和限位
    新人求助社区各位哥哥姐姐,具体需要用航模遥控器的3段开关控制Arduino nano控制一个3
    基于MWC开源飞控DIY关键总结分享:
    基于MWC开源飞控DIY关键总
    很早就已经很想写这么一个帖,但总是由于各种原因没能落实,但最后还是找了时
    有关函数返回值的问题
    有关函数返回值的问题
    求助大神们,这个程序中有return返回值,但为什么有这个“ warning: return-statement
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表