【雕爷学编程】Arduino 手册之时间函数 delayMicroseconds()

在这里插入图片描述
在这里插入图片描述
什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。

如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。

Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣

在这里插入图片描述

维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。

Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。

Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。

在这里插入图片描述

十六、Arduino时间函数 delayMicroseconds()

Arduino时间函数delayMicroseconds()是一个用于让Arduino程序暂停执行一段时间的函数。它的语法是:

delayMicroseconds(us);

其中,us是一个整数,表示要暂停的微秒数。例如,delayMicroseconds(1000)表示暂停1000微秒,也就是1毫秒。

delayMicroseconds()函数的使用范围主要是在需要控制程序的执行精度或者实现高速通信的情况下。例如,如果要让一个蜂鸣器以一定的频率发出声音,就可以用delayMicroseconds()函数来控制蜂鸣器的开关时间。又例如,如果要让Arduino与其他设备进行SPI或者I2C等协议的通信,就可以用delayMicroseconds()函数来控制信号的时序。

应用场景:
1)精确时序控制:delayMicroseconds()函数常用于需要实现精确时序控制的场景,如控制通信协议的时序、产生精确的脉冲信号等。通过在适当的位置调用delayMicroseconds()函数,可以确保程序在微秒级的时间间隔内执行特定操作。
2)传感器读取:在与高速传感器进行数据采集时,可能需要在微秒级的时间内读取传感器的数据。delayMicroseconds()函数可以用于添加适当的延时,确保系统在进行下一步的传感器读取操作之前等待足够的时间,以获得准确的数据。
3)细粒度控制:在某些应用中,需要进行细粒度的时间控制,如音频处理、PWM信号生成等。通过结合delayMicroseconds()函数和其他控制技术,可以实现对时间间隔的精确控制。

delayMicroseconds()函数的注意事项有以下几点:
1)delayMicroseconds()函数会阻塞程序的执行,也就是说,在delayMicroseconds()函数执行期间,Arduino无法响应其他的输入或输出信号。这可能会导致程序错过一些重要的事件或者数据。因此,在使用delayMicroseconds()函数时,要尽量避免使用过长的延时时间,或者使用其他的非阻塞方式来实现延时效果,例如micros()函数。
2)delayMicroseconds()函数会影响Arduino内部的定时器。Arduino内部有一些定时器用于控制PWM信号、串口通信、计时器中断等功能。如果使用delayMicroseconds()函数,这些定时器会被暂停或者延迟,从而影响相关功能的正常运行。因此,在使用delayMicroseconds()函数时,要注意检查是否会对其他功能造成干扰或者冲突。
3)delayMicroseconds()函数不适用于多任务环境。如果Arduino需要同时运行多个任务,例如同时控制多个传感器或者执行器,那么使用delayMicroseconds()函数会导致任务之间的同步问题。因为在一个任务中使用delayMicroseconds()函数会导致其他任务无法及时执行。因此,在多任务环境下,要使用其他的多任务调度方式来实现任务之间的协调和切换,例如FreeRTOS库。
4)delayMicroseconds()函数有一定的误差范围。根据Arduino官方文档,delayMicroseconds()函数在不同型号的Arduino板子上有不同的误差范围。例如,在16MHz的Arduino Uno上,最小延时时间为3微秒,最大延时时间为16383微秒;在8MHz的Arduino Pro Mini上,最小延时时间为4微秒,最大延时时间为16383微秒;在84MHz的Arduino Due上,最小延时时间为3微秒,最大延时时间为1000000微秒。因此,在使用delayMicroseconds()函数时,要注意根据不同的硬件平台选择合适的延时时间,并考虑误差对程序性能的影响。

以下是Arduino时间函数delayMicroseconds()几个实际运用程序案例:

案例一:让一个蜂鸣器以440Hz的频率发出声音

// 定义蜂鸣器连接的引脚
#define BUZZER_PIN 10

// 初始化函数
void setup() {
    
    
  // 设置蜂鸣器引脚为输出模式
  pinMode(BUZZER_PIN, OUTPUT);
}

// 循环函数
void loop() {
    
    
  // 设置蜂鸣器引脚为高电平
  digitalWrite(BUZZER_PIN, HIGH);
  // 延时1136微秒(440Hz对应周期为2272微秒)
  delayMicroseconds(1136);
  // 设置蜂鸣器引脚为低电平
  digitalWrite(BUZZER_PIN, LOW);
  // 延时1136微秒
  delayMicroseconds(1136);
}

案例二:让Arduino与一个SPI设备进行通信

// 引入SPI库
#include <SPI.h>

// 定义SPI设备的片选引脚
#define CS_PIN 10

// 初始化函数
void setup() {
    
    
  // 设置片选引脚为输出模式
  pinMode(CS_PIN, OUTPUT);
  // 设置片选引脚为高电平,关闭通信
  digitalWrite(CS_PIN, HIGH);
  // 初始化SPI通信,设置时钟频率为4MHz,模式为0,位序为MSB
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
}

// 循环函数
void loop() {
    
    
  // 设置片选引脚为低电平,开始通信
  digitalWrite(CS_PIN, LOW);
  // 延时1微秒,等待设备准备好
  delayMicroseconds(1);
  // 向设备发送一个字节的数据,例如0x55
  SPI.transfer(0x55);
  // 延时1微秒,等待设备响应
  delayMicroseconds(1);
  // 接收设备返回的一个字节的数据,并打印到串口
  byte data = SPI.transfer(0x00);
  Serial.println(data, HEX);
  // 设置片选引脚为高电平,结束通信
  digitalWrite(CS_PIN, HIGH);
}

案例三:让一个步进电机以一定的速度旋转

// 定义步进电机的步进引脚和方向引脚
#define STEP_PIN 9
#define DIR_PIN 8

// 初始化函数
void setup() {
    
    
  // 设置步进引脚和方向引脚为输出模式
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
}

// 循环函数
void loop() {
    
    
  // 设置方向引脚为高电平,表示顺时针旋转
  digitalWrite(DIR_PIN, HIGH);
  // 循环1000次,每次旋转一个步进角度(假设步进电机的步距角为1.8度)
  for (int i = 0; i < 1000; i++) {
    
    
    // 设置步进引脚为高电平,表示开始一个步进动作
    digitalWrite(STEP_PIN, HIGH);
    // 延时500微秒,表示步进速度为1000步/秒(假设步进电机的最小响应时间为500微秒)
    delayMicroseconds(500);
    // 设置步进引脚为低电平,表示结束一个步进动作
    digitalWrite(STEP_PIN, LOW);
    // 延时500微秒,表示保持当前位置不动
    delayMicroseconds(500);
  }
}

案例四:精确时序控制:

const int signalPin = 9;

void setup() {
    
    
  pinMode(signalPin, OUTPUT);
}

void loop() {
    
    
  digitalWrite(signalPin, HIGH); // 设置信号引脚为高电平
  delayMicroseconds(10); // 延时10微秒,产生精确的时序
  digitalWrite(signalPin, LOW); // 设置信号引脚为低电平
  delayMicroseconds(10); // 延时10微秒,保持时序
}

在此案例中,使用delayMicroseconds()函数实现了精确的时序控制。通过在产生特定信号时使用微秒级的延时,确保信号的时序满足要求。

案例五:传感器读取:

const int sensorPin = A0;

void setup() {
    
    
  Serial.begin(9600);
}

void loop() {
    
    
  int sensorValue = analogRead(sensorPin); // 读取传感器的模拟值
  delayMicroseconds(100); // 延时100微秒等待传感器稳定
  Serial.println(sensorValue); // 输出传感器值
}

在此案例中,使用delayMicroseconds()函数实现了传感器读取的稳定性控制。通过在读取传感器值之前添加适当的微秒延时,保证在读取操作之前传感器有足够的时间稳定,以获得准确的读取结果。

案例六:控制舵机转动角度

#include <Servo.h>

Servo myservo;
int pos = 0;

void setup() {
    
    
  myservo.attach(9);
}

void loop() {
    
    
  for(pos = 0; pos < 180; pos+= 1) {
    
     
    myservo.write(pos);
    delayMicroseconds(10000); 
  }
} 

案例七:按一定频率闪烁LED

int led = 13;
int delayTime = 500;

void setup(){
    
    
  pinMode(led, OUTPUT);
}

void loop(){
    
    
  digitalWrite(led, HIGH);
  delayMicroseconds(delayTime);
  digitalWrite(led, LOW);
  delayMicroseconds(delayTime);
}

案例八:产生38kHz的PWM信号

int buzzer = 9;
int cycle = 26; 

void setup() {
    
    
  pinMode(buzzer, OUTPUT); 
}

void loop() {
    
    
  digitalWrite(buzzer, HIGH);
  delayMicroseconds(cycle); 
  digitalWrite(buzzer, LOW);
  delayMicroseconds(cycle);  
}

这些案例展示了delayMicroseconds()在需要高精度微秒级延时时的实际应用,如在舵机、蜂鸣器、传感器等控制上发挥重要作用。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132642118