旋转编码器计次 红外对射传感器计次小实验及其相关库函数详解 (江协科技)

发布于:2025-05-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

旋转编码器

旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向

类型:机械触点式/霍尔传感器式/光栅式

器件介绍

左一器件

光栅编码器的工作原理

  1. 核心组件
    光栅编码器主要由 对射式红外传感器光栅编码盘 组成。
    • 对射式红外传感器:由发射端和接收端组成,发射端发出红外光,接收端检测是否接收到红外光。
    • 光栅编码盘:一个带有均匀透光 / 遮光条纹的圆盘,安装在旋转轴上,随轴一起转动。
  2. 工作过程
    • 当编码盘静止时,红外传感器的接收端持续接收红外光(或持续被遮挡),输出固定电平(高或低)。
    • 当编码盘随旋转轴转动时,其透光 / 遮光条纹会交替遮挡红外光:
      • 当条纹透光时,接收端接收到红外光,输出 高电平
      • 当条纹遮光时,接收端无法接收红外光,输出 低电平
      • 由此产生 高低电平交替的方波信号
  3. 信号意义
    • 方波个数:代表编码盘转过的角度(每个方波对应一定的角度增量),用于测量 位置
    • 方波频率:代表编码盘的旋转速度(频率越高,转速越快),用于测量 速度
  4. 局限性
    会议中提到的简单光栅编码器(单路输出)无法区分旋转方向,因为仅能通过一路方波信号判断位置和速度,无法识别正转或反转。若需测方向,需采用输出正交波形(两相相位差 90°)的编码器(如后续介绍的机电触点式或霍尔式编码器)。

总结

光栅编码器通过光栅编码盘切割红外光,生成周期性方波信号,通过分析信号的频率和个数实现对旋转轴速度和位置的测量,但基础型单路输出光栅编码器不具备方向检测能力。

左二器件

一、核心组件

  1. 金属触点结构

    • 内部包含两组开关触点(外侧触点 A 和 B)和一个公共触点(中间引脚)。
    • 编码盘为金属材质,边缘设计有特定形状的导电 / 绝缘区域,或通过机械结构控制触点通断。
  2. 按键模块

    (可选):

    • 旋转轴可按下,触发顶部的独立按键触点,按下时触点短路(输出低电平),松开时断开(输出高电平)。

二、工作过程

  1. 旋转时的信号生成
  • 初始状态:无旋转时,金属触点未接触外侧触点 A/B,公共引脚通过上拉电阻保持高电平。

  • 旋转过程

    • 编码盘随轴转动时,金属盘边缘的凸起 / 凹陷区域依次接触外侧触点 A 和 B,形成

      交替通断

      • 当金属盘接触触点 A 时,公共引脚与 A 导通,输出低电平;
    • 当金属盘接触触点 B 时,公共引脚与 B 导通,输出低电平;

      • 未接触时,公共引脚通过上拉电阻保持高电平。
    • 由于触点 A 和 B 的位置设计存在 90 度相位差(即机械结构上错开 1/4 周期),A、B 两相输出波形形成 正交信号(相位差 90°)。

  1. 正交波形与方向判断
  • 正转时:A 相波形滞后于 B 相 90°(或 B 相超前 A 相 90°);
  • 反转时:A 相波形超前于 B 相 90°(或 B 相滞后 A 相 90°)。
  • 通过检测两相波形的相位关系,即可区分旋转方向(如 MCU 通过外部中断捕获边沿信号并判断顺序)。
  1. 按键功能
  • 按下旋转轴时,顶部按键触点短路,输出低电平;松开时触点断开,恢复高电平,等效于普通按键输入。

三、信号特点与应用场景

  1. 信号特性 :

    • 输出为 高低电平交替的方波信号(A 相和 B 相正交),频率对应转速,脉冲个数对应旋转角度,相位差用于方向判断。
    • 接触式设计,可能存在触点抖动(需硬件滤波或软件去抖)。
  2. 适用场景 :

    • 适合 低速调节场景(如音量调节、参数设置),因触点磨损不适合高速旋转(如电机测速)。
    • 需配合上拉电阻、滤波电容等外围电路稳定信号(如会议中提到的 10K 上拉电阻和滤波电容 C1)。

四、与其他类型的对比

  • 优势:结构简单、成本低,无需复杂传感器(如红外、霍尔)。
  • 缺点:触点易磨损、寿命有限,高速旋转时触点抖动严重,信号稳定性差。

总结

机械触点式传感器通过金属触点的机械通断生成电信号,利用相位差设计实现方向检测,适用于低速、高精度调节场景,但受限于接触式设计,在高速或高寿命要求场景中需改用非接触式方案(如霍尔式、光栅式)。

霍尔传感器形式的编码器附在电机后,通过圆形磁铁和霍尔传感器输出正交方波信号

独立编码器元件,输入轴转动时有波形输出可测速和测方向。

在这里插入图片描述

硬件电路

以旋转编码器为例:

  • 旋转编码器硬件电路
    • 模块电路图:模块电路图中按键线悬空,编码器内部两触点旋转时以 90 度相位差交替导通,需配合外围电路输出高低电平。左边接 10K 上拉电阻,默认高电平,旋转时触点导通拉低电平输出。R3 是输出限流电阻,C1 是输出滤波电容(使电路更稳定),右边电路与左边相同,输出接 b 端口,c 端口接 GND。
    • 接线方法:使用模块时,VCC、GND 接电源,a 项、b 项输出接到 STM32 的 PB0 和 PB1 引脚(注意引脚编号不同),c 引脚暂时不用。

在这里插入图片描述

对射式红外传感器计次&旋转编码器计次

  • 外部中断配置流程
    • 配置原则:打通从 GPIO 到 NVIC 信号链路,配置其中涉及的 RCC时钟、GPIO、AFIO、EXTI、NVIC 等外设模块。
    • 具体步骤
      • 第一步配置 RCC,开启涉及外设时钟,如 RCC APT2 外设时钟控制开启 GPLB 和 AFIO 时钟,注意函数和参数对应的总线(APB2、APB1 和 AHB)要正确;
      • 第二步配置 GPIO,定义结构体,选择输入模式(如外部中断选浮空输入、上拉输入或下拉输入,此处选上拉输入,使用 PB14 号口)并初始化 GPIOB 外设;
      • 第三步配置 AFIO,虽无专门库函数文件,但可在 GPIO 的.c 文件中找到相关函数,使用 GPIO_EXTILineConfig 函数配置外部中断引脚选择(GPIO外部中断线配置);
      • 第四步配置 EXTI,使用 Exti init 函数根据结构体参数初始化,设置中断线、状态、模式和触发信号边缘等参数;
      • 第五步配置 NVIC,先使用 NVIC priority group config 函数进行中断分组,再用 NVIC init 函数根据结构体参数初始化,设置中断通道等参数 。
  • 部分外设时钟说明
    • EXTI:虽为独立外设,但无需开启时钟,原因可能与唤醒或电路设计有关,手册和网上均未找到确切答案。
    • NVIC:是内核外设,RCC 管不着,无需开启时钟。

在这里插入图片描述

相关库函数学习

  • GPIO相关函数

    • GPIO_AFIODeInit 复位 AFIO外设;
    • GPIO__pinlock_config 锁定 GPIO 配置;
    • GPIO__eventoutputconfig 和 GPL_eventoutputcmd 配置和开启 Aflo 事件输出功能;
    • GPIO__pin_remap_config 进行引脚重映射;
    • GPIO__exti_line_config 配置 Aflo 数据选择器以选择中断引脚;
    • GPIO__ETH_media_interface_config 用于以太网(芯片无此功能,用不到)。

    在这里插入图片描述

  • ETTI 库函数

    • exti_deinit 清除 exti 配置;

    • exit_init 根据结构体参数配置 exit 外设;

    • exit_structinit 将外部中断配置结构体(EXTI_InitTypeDef)的成员变量初始化为库定义的默认值;

    • exit_generate_SW_interrupt 软件触发外部中断;

    • exit_byte_flag_status 获取指定标志位是否被置一;

    • exit_clear_flag 清除置一的标志位;

    • exit_get_it_status 获取中断标志位;

    • exit_clear_it_pending_bit 清除中断挂起标志位。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

类型 存储寄存器 含义 操作方式
中断状态标志位 EXTI_PR(状态寄存器) 记录 “是否发生了外部中断事件”(硬件自动置 1,软件需手动清除) 硬件置 1,软件写 1 清零(EXTI_ClearFlag()
中断使能标志位 EXTI_IMR(中断屏蔽寄存器) 控制 “是否允许中断事件触发中断服务函数”(软件配置,默认关闭)

在这里插入图片描述

中断挂起标志位,中断使能标志位 和 中断状态标志位的作用和区别

  • 中断使能标志位是 “开关”:决定中断是否被允许触发;

  • 中断挂起标志位是 “事件记录器”:标记待处理的中断请求;

  • 中断状态标志位是 “状态反馈器”:广义记录设备状态(可能包含中断或非中断的状态)。

    对比维度 中断使能标志位 中断挂起标志位 中断状态标志位
    核心功能 控制中断是否触发(开关) 记录事件是否发生(待处理) 反馈设备当前状态(通用)
    触发方式 软件配置(手动使能 / 禁用) 硬件自动置位(事件触发) 硬件自动置位(状态变化)
    与中断的关系 必须使能才能触发中断服务函数 无论是否使能,事件发生时都会置位 可能与中断相关(如 EXTI_PR)或无关(如 USART_RXNE)
    清除方式 软件手动修改(无需清除,仅需禁用) 软件手动清除(必须!否则重复触发) 部分自动清除(如 USART_RXNE)或手动清除(如 EXTI_PR)

CPU 响应中断的条件

  1. 外设产生中断请求(外设挂起标志位为 1);
  2. 外设中断使能(允许传递到 NVIC);
  3. NVIC 中断使能(允许传递到 CPU);
  4. NVIC_ISPR 对应位为 1(标记中断请求等待处理)。

其中,NVIC_ISPR 是 CPU 最终决定是否进入中断的直接标志位。只有当 NVIC_ISPR 为 1 时,CPU 才会实际响应中断。

附:中断流程示意图
外设事件触发 → 外设挂起标志位(如 EXTI_PR)置1  
↓(外设使能标志位为1)  
NVIC 接收请求 → NVIC 使能标志位(NVIC_ISER)为1  
↓  
NVIC 挂起标志位(NVIC_ISPR)置1 → CPU 检测到 NVIC_ISPR 为1  
↓  
CPU 进入中断服务函数 → 清除外设挂起标志位(如 EXTI_ClearFlag())  

EXTI_GetFlagStatusEXTI_ClearFlagEXTI_GetITStatusEXTI_ClearITPendingBit

  • NVIC 库函数
    • NVIC_priority_group_config 配置中断分组;
    • NVIC_init 根据结构体参数初始化 NVIC;
    • NVIC_set_vector_table 设置中断向量表;
    • NVIC_system_LP_config 系统低功耗配置(后两个函数用得不多) 。
      在这里插入图片描述

旋转编码器

在这里插入图片描述

中断编程建议

  • 函数时长:中断函数中不要执行耗时过长的代码,避免阻塞主程序。
  • 硬件操作:避免在中断函数和主函数中调用相同函数或操作同一硬件,可在中断里操作变量或标志位,返回后再处理显示等操作,减少代码耦合性,使程序更清晰强健