Arduino 外部中断重置内部定时器

2023-05-16

Arduino 外部中断重置内部定时器

文章目录

  • Arduino 外部中断重置内部定时器
  • 前言
    • 一、准备工作
    • 二、代码
    • 三、实验效果
      • 1. 设置1Hz的方波(外部中断触发):
      • 2. 观察示波器各个波形:
      • 3. 延迟问题
      • 1.另,改用1.3hz方波进行外部中断触发
      • 2. 观察示波器各个波形:
    • 四、备注
  • 总结
  • 致谢

前言

  • 本条博客的需求来源于自动驾驶中多传感器融合定位的硬件同步。
  • 需要用GNSS1Hz的信号去重置lidar(10Hz)和camera(20Hz)的时钟。

一、准备工作

  1. 实验器材:Ardunio UNO开发板;信号发生器;多通道示波器。
  2. 需求:用1Hz方波的上升沿触发10Hz和20Hz的方波重置时钟。
  3. UNO开发板接口配置

    D2-----1Hz信号输入作为外部触发
    D13----10Hz的方波输出
    D7------20Hz的方波输出

  4. 代码思路
    1. 首先用MsTimer2将设置timer2为一个周期为25ms的时钟(25ms是20Hz方波的半个周期),然后用attachInterrupt设置一个外部中断.
    2. 当检测到上升沿RISING时外部中断被触发,进入到blink函数中,首先停止timer2,然后将两个输出引脚设置为高电平,并将下一轮的状态设置为低电平,然后使用MsTimer2::start()函数重新打开之前设置的时钟。
    3. 时钟调用flash函数,其中每执行一次,对20Hz的方波输出口进行高低电平状态转换,每执行两次,对10Hz的方波输出口进行高低电平状态转换。

二、代码

#include <MsTimer2.h>

volatile boolean output1 = HIGH;
volatile boolean output2 = HIGH;
volatile int i=0;

void flash() {
  digitalWrite(7, output1);
  output1 = !output1;
  
  if(i%2==1)
  {
    digitalWrite(13, output2);  // 状态翻转
    output2 = !output2;
   }
   i++;
}

void setup() {
  pinMode(13, OUTPUT);
  pinMode(7, OUTPUT);
  MsTimer2::set(25, flash); // 50ms period
  MsTimer2::start();  // enables the interrupt.
  attachInterrupt(0, blink, RISING);//当int.0电平改变时,触发中断函数blink   RISING
}

void loop() {
}

void blink()//中断函数
{
 MsTimer2::stop();
 digitalWrite(13, HIGH);
 digitalWrite(7, HIGH);
 output1 = LOW;
 output2 = LOW;
 i=0;
 MsTimer2::start();  // enables the interrupt.
}

三、实验效果

1. 设置1Hz的方波(外部中断触发):

2. 观察示波器各个波形:

在这里插入图片描述

3. 延迟问题

看到20Hz的方波有3ms的延迟,这个我不太清楚问题出在哪里……在这里插入图片描述

1.另,改用1.3hz方波进行外部中断触发

主要是为了避免和子波产生整数倍关系,更清晰明了地观察外部触发是否真正地重置了子波的时钟。

在这里插入图片描述

2. 观察示波器各个波形:

看到正在正常执行的子波,被外部中断示波器上的黄线触发后,立即转为高电平,并进入下一个时钟周期。但是这里的20hz方波存在3ms的延迟。
在这里插入图片描述

四、备注

  1. Arduino UNO有三个定时器,

    timer0:一个被Arduino的delay(), millis()和micros()使用的8位定时器
    timer1:一个被Arduino的Servo()库使用的16位定时器
    timer2:一个被Arduino的Tone()库使用的8位定时器
    

版权声明:本文为CSDN博主「chenyfan_」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_19887221/article/details/124820081

  1. (1)如果你使用了 MsTimer2 库, 则 pin11pin3 就不能再用做 PWM 输出了! 因为该 pin3 和 pin11 的 PWM 是靠 timer2 帮忙的! (tone()也是)
    (2)注意 Servo.h 库与 TimerOne 都是使用内部定时器 timer1 会影响pin9, pin10 的 PWM
    (3)tone() 使用 timer2 定时器; 若使用 Tone 库的 Tone 对象(Tone 变量)也是优先使用 timer2 定时器,若用两个 Tone 变量则 timer1 也会被用掉, 用三个 Tone 则连控制 millis( )的 timer0 也会被用掉。
    (4)别忘了, timer0 负责帮忙控制 pin 5pin 6 的 PWM 输出。只要不去改变 timer 的 Prescaler 就不会影响其控制的 PWM pin, 但MsTimer2 库与 tone( )都会改变 Prescaler ! !

版权声明:本文为CSDN博主「chenyfan_」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_19887221/article/details/124820081

  1. 参考链接:Arduino教程——外部中断的使用
  2. 一些可能有用的博客:
    Arduino基础篇(八)-- Arduino如何实现多线程(SCoop)
    Arduino基础篇(二)-- 常用的基本函数
    详解Arduino Uno开发板的引脚分配图及定义(重要且基础)
    Arduino教程——外部中断的使用 讲解很形象
    Arduino延迟函数delay(),以及为什么不应该使用它

总结

本文主要用了外部中断来重置内部定时器。
疑问:

  1. 但这里涉及到中断优先级的问题,具体是定时器中断优先还是外部中断优先?本文并没有细究。

    我个人认为:
    - 如果外部触发的时候没有进入定时器中断的话,那是没有问题的。
    - 如果外部触发的时候程序已经进入了定时器中断,定时器中断就要更换输出口的高低电平位。如果程序出了定时器中断而没有进入外部中断的话,会导致该次外部触发无效;如果出了定时器中断后进入外部中断,则该次外部触发有效,但存在几行程序的延迟时间。
    - 一些拙见,不具有实际参考价值。

  2. 另外20Hz信号为什么存在3ms的延迟,经实验验证得出结论是示波器不同通道扫描时间的问题。

致谢

向开源致敬,向各位博主致敬!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino 外部中断重置内部定时器 的相关文章

随机推荐

  • 第十篇,STM32串口蓝牙编程

    1 串口蓝牙概念 串口蓝牙是一个蓝牙模块 xff0c 内部有蓝牙模块和程序 xff0c 可以进行蓝牙通信 xff0c 同时提供一个串口接口 xff0c 通过串口可以配置蓝牙模块进行数据传输 2 使用串口3连接蓝牙模块 3 手机上安装蓝牙调试
  • 第十四篇,STM32的CAN总线通信

    1 CAN总线的概念 CAN指的是控制器局域网网络 Controller Area Network xff0c 由德国博世汽车电子厂商开发出来 CAN使用差分信号 xff0c 具有较强的抗干扰能力和传输稳定性 CAN属于多主通信 xff0c
  • OpenCV图像处理学习十九,像素重映射cv::remap

    一 像素重映射概念 重映射就是把输入图像中各个像素按照制定的规则顺序映射到另外一张图像的对应位置上去 xff0c 形成一张新的图像 二 像素映射API函数接口 cv remap xff08 InputArray src 输入图像 Outpu
  • OpenCV图像处理学习二十一,直方图比较方法

    一 直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2 xff0c 归一化到相同的尺度空间 xff0c 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度 xff08 每张图像都有唯一的直方图与之对应 xff0
  • 嵌入式FreeRTOS学习八,xTaskCreate创建任务的细节以及恢复中断任务实现

    一 创建任务函数xTaskCreate 任务也不是很复杂的东西 xff0c 任务也就是一个函数xTaskCreate 简单得说 xff0c 创建一个任务 xff0c 你得提供它的执行函数 xff0c 你得提供它的栈的大小 xff0c 函数的
  • 嵌入式FreeRTOS学习一,FreeRTOS概述和代码结构

    一 FreeRTOS是什么 FreeRTOS 是由 Real Time Engineers Ltd 出品 xff0c 是一款市场领先的 RTOS 现在已经支持几十种 处理器架构 Free即免费的 xff0c RTOS全称是 Real Tim
  • 嵌入式FreeRTOS学习二,FreeRTOS任务的创建和删除

    一 任务的创建和删除 1 1 函数xTaskCreate 此函数用来创建一个任务 xff0c 任务需要RAM来保存与任务有关的状态信息 任务控制块 xff0c 任务也需要一定的RAM 来作为任务堆栈 如果使用函数xTaskCreate 来创
  • 嵌入式FreeRTOS学习五,FreeRTOS任务调度器

    四 调度器 FreeRTOS 操作系统支持三种调度方式 xff1a 抢占式调度 xff0c 时间片调度和合作式调度 实际应用主要是抢占式调度和时间片调度 xff0c 合作式调度用到的很少 启动调度器的API函数vTaskStartSched
  • 嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

    一 tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中 xff0c 其中有任务状态链表和事件链表两个链表成员 xff0c 首先介绍任务状态链表这个结构 xff0c 这个链表通常用
  • 嵌入式FreeRTOS学习十,任务调度和任务就绪链表任务调度过程

    一 main函数里面的栈是哪里分配的 main函数里面用到的栈 xff0c 假设为msp 是汇编代码里面设定的 xff0c 对于STM32F103 在汇编代码里的向量表设置了一个栈 initial sp 那这个栈是给谁用的呢 xff1f 可
  • ovn 通过网关虚拟路由器连接外部网络

    本文实验如何通过ovn的网关逻辑路由器将ovn网络连接到外部网络 前面讲过ovn的逻辑路由器是分布式的 xff0c 这意味着它没有绑定到某个节点上 xff0c 而是存在于所有节点上的 xff0c 同时它是通过每个节点的openflow流表来
  • 嵌入式FreeRTOS学习十一,深入理解任务调度机制

    一 任务调度机制 可抢占 xff1a 高优先级的任务先运行时间片轮转 xff1a 同优先级的任务轮流执行空闲任务礼让 xff1a 如果有同是优先级为0的其他就绪任务 xff0c 空闲任务主动放弃一次运行机会函数调用vTaskDelay xD
  • SOAP传输协议

    一 HTTP传输协议 超文本传输协议 xff08 HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 xff0c 它是基于请求 响应的模式协议 xff0c 客户端发出请求 xff0c
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • gsoap工具生成onvif设备搜索(remotediscovery)代码框架

    什么是gsoap工具 xff1f gSOAP 提供了两个工具来方便开发人员使用 C C 43 43 语言快速开发Web 服务应用 xff0c 通过 gSOAP 提供的这两个工具 xff0c 开发人员可以快速生成服务端与客户端代码框架 xff
  • 001_初识_飞航科技光标飞控

    这两天老潘给我一块飞控 xff0c 让我练手 xff0c 为电赛做准备 xff0c 拿到控挺开心的 xff0c 毕竟省了一笔RMB 本来想着买块正点原子的飞控 资料 xff1a 说起资料简单看了一下发现还蛮全的 xff0c 但是这个资料我居
  • 写出C语言的第一个程序“Hello World”

    这里写自定义目录标题 写出C语言的第一个程序 Hello World 写出C语言的第一个程序 Hello World 下面展示一些 内联代码片 span class token comment A code block span span
  • Eigen库的安装攻略

    Eigen库的安装攻略 转载 xff1a Eigen库安装 xff08 两种方式 xff09 转载 xff1a Eigen库安装 xff08 两种方式 xff09 链接 link
  • 【ROS2基础学习】

    入门篇 前言一 创建一个功能包二 编译三 source总结 前言 提示 xff1a 这里是记录的大概内容 xff1a 随着机器人技术的不断发展 xff0c ROS也越来越重要 xff0c 很多人都开启了学习ROS xff0c 本文就介绍了R
  • Arduino 外部中断重置内部定时器

    Arduino 外部中断重置内部定时器 文章目录 Arduino 外部中断重置内部定时器前言一 准备工作二 代码三 实验效果1 设置1Hz的方波 xff08 外部中断触发 xff09 xff1a 2 观察示波器各个波形 xff1a 3 延迟