您的位置 首页 电路

同一个外部中止的Arduino随机睡觉与唤醒

为了控制Arduino的随机睡眠与唤醒,不采用“预定睡眠-随机唤醒”的常规设计模式,而是通过一个外部中断随机使Arduino进入睡眠,并且通过同一个外部中断随机唤醒Arduino。首先使用开源Ener

摘要:为了操控Arduino随机睡觉与唤醒,不选用“预订睡觉-随机唤醒”的惯例规划形式,而是经过一个外部间断随机使Arduino进入睡觉,并且经过同一个外部间断随机唤醒Arduino。首要运用开源Enerlib和LowPower库对ArduinoPro Mini进行试验,然后运用于实践的工程规划中,取得了很好的作用。该办法能够作为老练的计划推行到工程规划的实践运用傍边。

导言

“预订睡觉-随机唤醒”是嵌入式体系规划中常用的办法。例如,在完结规则的数据发送或接纳使命后,MCU当即进入休眠以节约电力,这便是“预订睡觉”的意义;当有新的数据发送和接纳使命时,经过各种办法唤醒MCU履行前述使命,这便是“随机唤醒”的意义。在实践工程中,完结该功用首要运用软件,首要整合体系功用,履行完功用模块后立刻履行预订的睡觉指令,而唤醒功用则直接在间断服务程序中表现。许多教科书、论坛中广泛介绍的也都是这种办法,该办法能够满意一般工程规划的需求。但“预订睡觉”在某些工程中并不适宜运用,例如在无线传感网络构成的体系中,某个节点或分体系的睡觉机遇不是由自己决议的,而是长途随机操控的。在这种情况下,睡觉指令在节点或分体系履行自己使命的过程中随机产生,相同,唤醒指令宣布也是随机的,一般为节约体系的硬件开支并进步其牢靠性,宣布睡觉和唤醒指令运用同一个信号,所以体系软件的睡觉指令就不能固定在体系功用程序的预订方位,甚至不能在功用主程序及其调用的函数中呈现。

1 现在Arduino睡觉与唤醒的办法

在Arduino IDE中操控Arduino睡觉的东西首要有Enerlib和LowPower两种开源类库,前一种已被Arduino开源库录入,这两种类库专门完结 Arduino的睡觉操控。Arduino的睡觉作用和典型运用在参考文献中有具体的介绍,但也未涉及到随机进入睡觉的办法。

1.1 运用Enerlib类库的完结办法

Enerlib类库供给的Example代码阐明了怎么运用该类库的功用函数,为阅览便利起见,笔者添加了行号标识和中文注释,如下所列:

a.jpg

b.jpg

能够看出,进入睡觉的代码在仅履行一次的初始化模块void setup()中,标明体系发动后做完初始化作业即进入睡觉。代码的19~23行给出了5种睡觉办法,在实践运用中挑选一种适宜的办法即可。体系的唤醒在 Int0外部间断服务程序中,Enerlib类库供给了一个只能在间断服务程序中运用的WasSleeping()函数,以断定体系现在的“睡觉/醒着” 的状况,该程序履行一次睡觉,然后随机唤醒后不能再次进入睡觉状况。这是一个典型的“预订睡觉一随机唤醒”实例。

1.2 运用LowPower类库的完结办法

LowPower类库供给的实例代码如下(行号和中文注释由笔者添加):

c.jpg

d.jpg

能够看出,进入睡觉的代码在主程序循环体void loop()内,体系发动后即进入休眠状况,一旦有外部间断即唤醒,唤醒后履行完主程序功用后再次进入睡觉,这也是典型的“预订睡觉-随机唤醒”实例。

因ATMega单片机在外部间断形式下会疏忽引起间断引脚的数据方向,所以该例程第10行“pinMode(wake UpPin,INPUT);”没有必要。

以上两种睡觉与唤醒实例均完结不了随机进入睡觉的功用要求。

2 随机睡觉与唤醒的办法

假如能够完结在体系作业过程中随时刻断作业进入睡觉(如为了节约电力而长途操控停止节点的监测),然后在恰当的机遇再唤醒体系持续作业,便是典型的“随机睡

眠-随机唤醒”功用。

2.1 随机进入睡觉与唤醒的办法

在以上两个实例中,一个是将睡觉指令放于初始化模块,完结一次性自动睡觉;另一个是将睡觉指令放在主程序循环体中,在履行完预订功用后自动进入睡觉,二者均有外部随机唤醒。假如要完结经过外部指令(间断)随机进入睡觉,睡觉指令首要不能放在初始化模块void setup()中,因为这样仅会引起一次睡觉;假如放到主程序循环体void loop()中,则有必要在由“睡觉/唤醒”指令引起的间断服务程序中放置相应的标志,然后再在主程序中判别这个标志,必然添加相应的软件开支,并且程序的结构也不清楚。

因而,完结随机进入睡觉的最简略的办法便是将睡觉指令直接置于间断服务程序傍边,当睡觉指令宣布后,履行间断服务程序进入睡觉;当唤醒指令宣布后,只需进入了间断服务程序即可唤醒。但是在同一个间断服务程序中完结该功用,需求透彻地了解相应单片机的间断处理机制以及所用的库函数对间断的处理办法。

2.2 Arduino的外部间断

构成Arduino的中心处理器首要是Atmel的AVR ATmega系列MCU(如ATmega328),常用的试验渠道有UNO、NANO、Pro、Pro Mini、Micro、Lilypad、Leonardo、Duemilanove等,因而Arduino的睡觉与唤醒的操控本质是对MCU的操控,也便是操控ATnaega328睡觉与唤醒。

完结随机睡觉与唤醒的试验渠道是Arduino Pro Mini3.3 V、8 MHz/ATInega328,ATrnega328的外部间断机制首要有:①RESET具有最高的优先级,第二个为INT0;②任一间断产生时大局间断使能位被清零,然后制止了一切其他的间断;③退出间断后,总是回到主程序并至少履行一条指令才能够去履行其他被挂起的间断;④假如挑选了边缘触发办法或电平改变触发办法,那么持续时刻大于一个时钟周期的脉冲将触发间断,过短的脉冲则不能确保触发间断,假如挑选低电平触发办法,那么低电平有必要坚持到当时指令履行完结;⑤外部间断经过引脚INT0、INT1与INT2触发,只需使能间断且电平产生了适宜的改变,即便引脚INT0~2装备为输出,间断也会触发;⑥若要求INT0与INT1在信号下降沿或上升沿触发,则I/O时钟有必要作业;⑦经过电平办法触发间断,在将MCU从掉电形式唤醒时,要确保电平坚持必定的时刻,以下降MCU对噪声的灵敏程度;⑧间断呼应时刻最少为4个时钟周期,若间断产生时MCU处于休眠形式,间断呼应时刻还需添加4个时钟周期,此外还要考虑到不同的休眠形式所需求的发动时刻。

2.3 Enerlib和LowPower类库的间断处理办法

两个类库中,Enerlib的5种睡觉指令为PowerDown()、Standby()、PowerSave()、SleepADC()、Idle(),LowPower的5种睡觉办法为ADC_OFF、BOD_OFF、IDLE_OFF、STANDBY EXT_STANDBY,除了对各种不同设备进行关断外,对体系间断的处理办法均相同,即睡觉前后均不对间断的使能进行处理,并且均供给了翻开和封闭终端使能的函数。这样,翻开和封闭间断的机遇就彻底交给了开发者。

3 随机睡觉与唤醒的完结与成果

运用Arduino自带的LED(Pin13驱动)来查验随机睡觉与唤醒,睡觉产生时LED闪耀0.1 s,表明接纳到睡觉指令,然后平息LED进入睡觉;唤醒产生时LED闪耀0.1 s,表明接纳到唤醒指令,然后LED以1 Hz频率闪耀作业。以下代码笔者添加了行号标识和中文注释。

e.jpg

f.jpg

将Arduino Pro Mini的Pin2(D2)经过一个10 KΩ电阻衔接到Vcc,然后在Pin2对地衔接一个按键开关,下载完程序后上电,体系LED进入1 Hz闪亮形式,按一下按键,LED闪耀0.1 s,然后进入睡觉;再按一下按键,LED闪耀0.1 s,然后体系LED进入1 Hz闪耀形式,如此重复。

结语

Arduino的中心–ATmega系列单片机,以其RISC的牢靠结构、主控板、外围模块等硬件的标准规划,具有较高的牢靠性。Arduino之所以风行全球,除了开源的硬件之外,更重要的是配套了开发软件的IDE以及很多的类库,一起IDE集成、界说了编程办法,底层的Bootloader就像是个微型操作体系,而不像运用Keil C开发单片机软件那样自己来安排程序的结构、编写驱动程序,Arduino的软件和硬件规划使得编程、供电、下载一体化。因为其遵从开源同享的主旨,相关类库会越来越丰厚,也正是这个IDE将软件开发东西和实践硬件阻隔,使得软件开发变得简略、快速,开发者能够专心于计划的施行。当然也因为软件底层与功用模块硬件的阻隔,使得开发者越来越依靠类库,这一循环导致开发者过火依靠类库而不去探求问题的本质,最终导致问题得不到处理或许退而替换主控体系硬件,然后阻碍了Arduino更大规模的运用。本文所叙说的例程能够依据实践工程要求做恰当修正而直接运用,具有必定的参考价值。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/293718.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部