旋转编码器计次 红外对射传感器计次小实验及其相关库函数详解 (江协科技)
文章目录
- 旋转编码器
- 器件介绍
- 硬件电路
- 对射式红外传感器计次&旋转编码器计次
- 相关库函数学习
- 中断挂起标志位,中断使能标志位 和 中断状态标志位的作用和区别
- CPU 响应中断的条件
- 附:中断流程示意图
- `EXTI_GetFlagStatus`、`EXTI_ClearFlag`、`EXTI_GetITStatus`、`EXTI_ClearITPendingBit`)
- 旋转编码器
旋转编码器
旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
类型:机械触点式/霍尔传感器式/光栅式
器件介绍
左一器件
光栅编码器的工作原理
- 核心组件
光栅编码器主要由 对射式红外传感器 和 光栅编码盘 组成。- 对射式红外传感器:由发射端和接收端组成,发射端发出红外光,接收端检测是否接收到红外光。
- 光栅编码盘:一个带有均匀透光 / 遮光条纹的圆盘,安装在旋转轴上,随轴一起转动。
- 工作过程
- 当编码盘静止时,红外传感器的接收端持续接收红外光(或持续被遮挡),输出固定电平(高或低)。
- 当编码盘随旋转轴转动时,其透光 / 遮光条纹会交替遮挡红外光:
- 当条纹透光时,接收端接收到红外光,输出 高电平;
- 当条纹遮光时,接收端无法接收红外光,输出 低电平。
- 由此产生 高低电平交替的方波信号。
- 信号意义
- 方波个数:代表编码盘转过的角度(每个方波对应一定的角度增量),用于测量 位置。
- 方波频率:代表编码盘的旋转速度(频率越高,转速越快),用于测量 速度。
- 局限性
会议中提到的简单光栅编码器(单路输出)无法区分旋转方向,因为仅能通过一路方波信号判断位置和速度,无法识别正转或反转。若需测方向,需采用输出正交波形(两相相位差 90°)的编码器(如后续介绍的机电触点式或霍尔式编码器)。
总结
光栅编码器通过光栅编码盘切割红外光,生成周期性方波信号,通过分析信号的频率和个数实现对旋转轴速度和位置的测量,但基础型单路输出光栅编码器不具备方向检测能力。
左二器件:
一、核心组件
-
金属触点结构
- 内部包含两组开关触点(外侧触点 A 和 B)和一个公共触点(中间引脚)。
- 编码盘为金属材质,边缘设计有特定形状的导电 / 绝缘区域,或通过机械结构控制触点通断。
-
按键模块
(可选):
- 旋转轴可按下,触发顶部的独立按键触点,按下时触点短路(输出低电平),松开时断开(输出高电平)。
二、工作过程
- 旋转时的信号生成
-
初始状态:无旋转时,金属触点未接触外侧触点 A/B,公共引脚通过上拉电阻保持高电平。
-
旋转过程
-
编码盘随轴转动时,金属盘边缘的凸起 / 凹陷区域依次接触外侧触点 A 和 B,形成
交替通断
- 当金属盘接触触点 A 时,公共引脚与 A 导通,输出低电平;
-
当金属盘接触触点 B 时,公共引脚与 B 导通,输出低电平;
- 未接触时,公共引脚通过上拉电阻保持高电平。
-
由于触点 A 和 B 的位置设计存在 90 度相位差(即机械结构上错开 1/4 周期),A、B 两相输出波形形成 正交信号(相位差 90°)。
-
- 正交波形与方向判断
- 正转时:A 相波形滞后于 B 相 90°(或 B 相超前 A 相 90°);
- 反转时:A 相波形超前于 B 相 90°(或 B 相滞后 A 相 90°)。
- 通过检测两相波形的相位关系,即可区分旋转方向(如 MCU 通过外部中断捕获边沿信号并判断顺序)。
- 按键功能
- 按下旋转轴时,顶部按键触点短路,输出低电平;松开时触点断开,恢复高电平,等效于普通按键输入。
三、信号特点与应用场景
-
信号特性 :
- 输出为 高低电平交替的方波信号(A 相和 B 相正交),频率对应转速,脉冲个数对应旋转角度,相位差用于方向判断。
- 接触式设计,可能存在触点抖动(需硬件滤波或软件去抖)。
-
适用场景 :
- 适合 低速调节场景(如音量调节、参数设置),因触点磨损不适合高速旋转(如电机测速)。
- 需配合上拉电阻、滤波电容等外围电路稳定信号(如会议中提到的 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);
- 外设中断使能(允许传递到 NVIC);
- NVIC 中断使能(允许传递到 CPU);
- 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_GetFlagStatus
、EXTI_ClearFlag
、EXTI_GetITStatus
、EXTI_ClearITPendingBit
)
- NVIC 库函数:
- NVIC_priority_group_config 配置中断分组;
- NVIC_init 根据结构体参数初始化 NVIC;
- NVIC_set_vector_table 设置中断向量表;
- NVIC_system_LP_config 系统低功耗配置(后两个函数用得不多) 。
旋转编码器
中断编程建议:
- 函数时长:中断函数中不要执行耗时过长的代码,避免阻塞主程序。
- 硬件操作:避免在中断函数和主函数中调用相同函数或操作同一硬件,可在中断里操作变量或标志位,返回后再处理显示等操作,减少代码耦合性,使程序更清晰强健