基本信息
文件名称:Arduino 系列:Arduino Nano (基于 ATmega328P)_(11).外部中断应用.docx
文件大小:22.66 KB
总页数:13 页
更新时间:2025-06-27
总字数:约6.44千字
文档摘要

PAGE1

PAGE1

外部中断应用

在ArduinoNano上,外部中断是一种非常有用的特性,可以让你在特定的外部事件发生时立即触发一个函数。这种机制在需要实时响应的场景中尤其有效,例如检测按钮按下、读取编码器位置或检测传感器信号等。本节将详细介绍如何使用外部中断,并通过具体的例子来说明其应用。

外部中断的基本概念

外部中断允许你在特定的引脚上检测到事件(如电平变化)时,立即调用一个函数。ArduinoNano上的外部中断引脚是数字引脚2和3。你可以配置这些引脚在检测到上升沿、下降沿或电平变化时触发中断服务例程(InterruptServiceRoutine,ISR)。

中断引脚

引脚2:对应于中断0

引脚3:对应于中断1

中断触发模式

RISING:在引脚从低电平变为高电平时触发中断。

FALLING:在引脚从高电平变为低电平时触发中断。

CHANGE:在引脚电平发生任何变化时触发中断。

LOW:在引脚电平为低时触发中断。

使用外部中断的步骤

定义中断服务例程(ISR):这个函数会在中断触发时被调用。

配置中断:使用attachInterrupt函数将引脚与中断服务例程关联起来,并设置触发模式。

编写主程序:在主循环中处理其他任务,中断服务例程会在中断触发时自动调用。

示例:检测按钮按下

假设我们要检测一个按钮的按下事件,并在检测到时点亮一个LED。我们可以使用外部中断来实现这一点。

硬件连接

按钮的一端连接到数字引脚2(中断0)。

按钮的另一端连接到GND。

LED的正极连接到数字引脚13。

LED的负极通过一个限流电阻连接到GND。

代码示例

//定义引脚

constintbuttonPin=2;//按钮连接到引脚2

constintledPin=13;//LED连接到引脚13

//中断服务例程

voidhandleInterrupt(){

//点亮LED

digitalWrite(ledPin,HIGH);

//延迟一段时间

delay(500);

//关闭LED

digitalWrite(ledPin,LOW);

}

voidsetup(){

//设置引脚模式

pinMode(buttonPin,INPUT);

pinMode(ledPin,OUTPUT);

//附上中断服务例程

attachInterrupt(digitalPinToInterrupt(buttonPin),handleInterrupt,FALLING);

}

voidloop(){

//主循环中可以处理其他任务

//例如读取温度传感器或控制电机

}

代码解释

定义引脚:

constintbuttonPin=2;:按钮连接到引脚2。

constintledPin=13;:LED连接到引脚13。

中断服务例程:

voidhandleInterrupt():定义了一个中断服务例程,当按钮按下时(引脚2从高电平变为低电平)会被调用。

digitalWrite(ledPin,HIGH);:点亮LED。

delay(500);:延迟500毫秒,以确保LED点亮一段时间。

digitalWrite(ledPin,LOW);:关闭LED。

配置中断:

attachInterrupt(digitalPinToInterrupt(buttonPin),handleInterrupt,FALLING);:将引脚2与中断服务例程handleInterrupt关联起来,并设置触发模式为FALLING,即按钮按下时触发中断。

主程序:

voidsetup():初始化引脚模式并附上中断。

voidloop():主循环中可以处理其他任务,例如读取传感器数据或控制其他设备。

示例:读取旋转编码器

旋转编码器是一种常用的位置传感器,可以检测旋转方向和速度。我们可以使用外部中断来读取旋转编码器的状态。

硬件连接

旋转编码器的A相连接到数字引脚2(中断0)。

旋转编码器的B相连接到数字引脚3(中断1)。

旋转编码器的公共端连接到GND。

代码示例

//定义引脚

constintencoderPinA=2;//A相连接到引脚2

constintencoderPinB=3;//B相连接到引脚3

//定义全局变量

volatilelongencoderPosition=0;

//中断服务例程

voidhandleEncoderA(){

//检测B相的状态

if(di