最近做一个小车项目,为了实现高效准确的测距,我使用定时器和外部中断写了一个测距的模块,分享给大家参看,如果有不对的地方,请留言批评指正。
代码分享:
#include <FlexiTimer2.h>
int Ul_trigPin = 7, Ul_echoPin = 2; // 定义超声波的引脚
long Ul_duration; // 测到的距离
unsigned long Ul_starttime; // 超声波测距的启动时间
int Ul_startflag = 0; // 超声波测距的启动标志位
/**
* 定时器2的中断子程序,用于超声波延时20ms
*/
void timer2()
{
FlexiTimer2::stop();
digitalWrite(Ul_trigPin, LOW);
Ul_starttime = micros();
}
/**
* 外部中断2的延时子程序,用于超声波回波接收,接Echo
*/
void interrupt_0(){
Ul_duration = (micros() - Ul_starttime-2240) / 59; // 需要减去trig和echo变化之间的延迟2240us time/2/1000 * 34cm/ms
Ul_startflag = 0;
}
void setup()
{
Serial.begin(38400); // 设定串口的波特率
FlexiTimer2::set(20, 1.0/1000, timer2); // 初始化定时器2
pinMode(Ul_trigPin, OUTPUT);
pinMode(Ul_echoPin, INPUT);
digitalWrite( Ul_trigPin , LOW );
// 初始化外部中断0
attachInterrupt(0, interrupt_0, FALLING); //interrupt为你中断通道编号,function为中断函数,mode为中断触发模式
}
void loop()
{
if (Ul_startflag == 0){ //启动测距
Ul_startflag = 1;
digitalWrite(Ul_trigPin, LOW);
delayMicroseconds(2);
digitalWrite(Ul_trigPin, HIGH);
FlexiTimer2::start();
Serial.print("message");
Serial.print(Ul_duration );
Serial.println();
}
}