Arduino基础实验4,用外部中断来测速

中断是CPU的一种工作模式,当收到中断请求,CPU会停下当前的工作,先去处理中断请求对应的处理流程,等完成了中断处理,再回过头来接着原先被停止的工作。Arduino的外部中断机制经常被用来测量速度,两者之间有什么关系呢?创客行将在本文中给大家揭示这个秘密。

CPU的中断

中断的工作机制已经在上文中进行了描述,它是很普遍的CPU行为,我们使用的电脑键盘,每敲下一次都会打出一个字符,就是由电脑CPU的中断来响应键盘的输入任务。

引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。

内部中断只的是硬件出错或运算出错引起的中断,例如任意数除以零,会造成算术异常,从而引发一个内部中断;外部中断由外部设备向CPU请求引发,键盘输入响应就属于此范围。为了响应外部中断,Arduino Nano提供了程序控制D2和D3,来作为上升沿、下降沿或同时触发的引脚。

 Arduino的普通输入和中断输入

Arduino输入实验基础电路图1 Arduino输入实验电路图

Arduino输入实验物理电路

图2 Arduino输入实验物理电路

搭建如图2的基础实验电路,使用一个按键来给D2输入开关量,把发光二极管连接到D13,使得在D13输出高电平时会点亮它,注意图中按键开关的接法,它必须使得D2连接电源正极或负极,不能悬空,否则会产生各种扰动。图中的发光二极管分压电阻是1KΩ,按键开关到地端的串联电阻是5KΩ。

我们下面将使用普通输入和中断输入的两段不同代码来控制图2的电路。

/*
 digital input experiment
 source by: www.i-makers.info
*/
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin

// variables will change:
bool buttonState = LOW; // variable for reading the pushbutton status

void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin, INPUT);
}

void loop() {
 buttonState = digitalRead(buttonPin);
 digitalWrite(ledPin, buttonState);
}

代码1 Arduino普通输入实验代码

代码1采用digitalRead来读入相关引脚的电平,使得D13引脚输出同样的状态,那么当按下连接在D2引脚的按键时,因为Arduino读入高电平,使得D13输出高电平,而点亮发光二极管;同理,当松开按键,发光二极管熄灭。

/*
 Interrupt input experiment
 source by: www.i-makers.info
*/

const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin

// variables will change:
bool buttonState = LOW; // variable for reading the pushbutton status

void setup() {
 pinMode(ledPin, OUTPUT);
 attachInterrupt(0, stateChange, FALLING);
}

void loop() {
 digitalWrite(ledPin, buttonState);
}

void stateChange(){
 buttonState = !buttonState;
}

代码2 Arduino中断输入实验代码

代码2采用了中断输入的控制方式,在setup初始化函数中,使用

attachInterrupt(0, stateChange, FALLING);

把引脚2定义为下降沿敏感。这个函数的第二个参数需要传入一个函数指针,也就是需要定义一个函数传进去,因此代码2在后面定义了stateChange函数,它的实现很简单,就是遇到下降沿,就改变D13引脚输出状态。它的运行效果不同于代码1,它初始时状态变量buttonState为低电平,发光二极管熄灭,当第一次按下按键开关,就会取得一个电压下降沿,发光二极管被点亮,松开按键,实际为获得电压上升沿,电路没反应,也就是说发光二极管一直亮着,直到再次按下按键,让Arduino第二次获取下降沿输入,才使得发光二极管熄灭。

电压下降沿和上升沿图3 电压下降沿和上升沿

 Arduino的中断测速

槽型光耦图4 槽型光耦

测试码盘图5 测速码盘

中断和测速有什么关系呢?图4中展示的是槽型光耦,它跟文档【1】中的普通光耦有所区别,它采用开放式结构,光耦的两极分别,红外发光二极管和红外光敏二极管,分别位于槽两侧,它的外围电路结构跟普通光耦相同,简单说,槽两侧都需要连接分压电阻,可以参看文档【1】。当转动的码盘从光耦槽中穿过时,其上的光栅会对光路形成开关效应,从而形成可以被Arduino外部中断捕捉的上升沿或下降沿信号。

50刻度的测试码盘也称为50线测速码盘,它的每圈有50对光栅组成,因此,码盘转动一圈会形成50个开关信号,测速的依据就是对固定时间内的开关信号进行累加,再进行适当处理,比如每秒钟进行一次开关量下降沿的累加取值,假设得到数值n,速度=轮子周长*n/50,在应用中,测速码盘需要和待测转轮进行同步连接,使得他们有相同的角速度。

除了进行圆周测速以外,槽型光栅还可以进行直线测速,比如测量电磁炮发射初速,这个用例将在电磁炮调试的案例中详细描述。更多精彩内容,请查看全站目录

 

优秀科技原创内容源,欢迎添加微信公众号。

创客行淘宝店提供本网站电子制作的全部套件

创客行淘宝店地址:https://shop125908459.taobao.com/

参考文档

  1. 大话传感器11-光耦与继电器,电路耦合元件
  2. 全站目录

发表评论