编码器如何在stm32上使用?

编码器如何在stm32上使用

文章目录

  • 编码器如何在stm32上使用
    • 1. 编码器是什么?
    • 2. 如何在stm32上使用编码器
      • 1. 编码器的基本原理
      • 2. STM32上的实现
      • 3. 代码实现

1. 编码器是什么?

编码器是一种传感器或设备,用于测量位置、角度或速度,并将这些物理量转换成电信号,通常是数字信号。它们广泛应用于工业自动化、机器人技术、航空航天、汽车和其他需要精确控制和反馈的系统中。

根据其工作原理和应用的不同,编码器可以分为以下几种主要类型:

  1. 增量式编码器

    • 每次转动时输出脉冲信号,通过计数这些脉冲来确定轴的位置变化。
    • 通常包含A相和B相输出,用于指示方向;有些还可能有Z相输出,用于提供每转一圈的参考点。
    • 常用于需要连续监控运动的应用中。
  2. 绝对式编码器

    • 提供轴的即时位置信息,即使在断电后重新上电也能立即知道当前位置。
    • 使用多种技术(如磁性、光学等)来存储位置信息,因此不需要外部电源就能记住位置。
    • 适用于需要高精度定位且不希望每次启动都需要校准的应用。
  3. 旋变式编码器

    • 利用变压器原理来检测旋转角度。
    • 输出模拟电压信号,与转子的角度成正比。
    • 在某些需要高可靠性的应用中使用,例如飞机和重型机械。
  4. 混合型编码器

    • 结合了增量式和绝对式的功能,可以在提供增量反馈的同时记录绝对位置。

2. 如何在stm32上使用编码器

使用编码器的主要原理是将物理位移或者旋转转化为可被电子系统识别的电信号。增量式编码器是最常用的类型之一。

1. 编码器的基本原理

  1. 基本组成:

    • A相: 代表编码器的主脉冲。
    • B相: 与A相相位相差90度,用于确定旋转的方向。
    • Z相(可选): 提供每转一圈的参考点。
  2. 工作方式:

    • 当编码器轴旋转时,A相和B相产生一系列脉冲信号。
    • A相和B相的脉冲序列可以用来计算轴的位置变化。
    • A相领先B相90度表示顺时针旋转,而B相领先A相90度则表示逆时针旋转。
  3. 脉冲计数:

    • 通过计数A相的上升沿或下降沿来确定位置变化。
    • 根据A相和B相的相对顺序判断旋转方向。
      在这里插入图片描述

2. STM32上的实现

在STM32上使用编码器通常涉及到以下几个步骤:

  1. 配置GPIO:
    • 选择合适的GPIO引脚作为编码器的输入。
    • 配置这些引脚为输入模式,并设置适当的上拉或下拉电阻。
  2. 配置定时器:
    • 选择支持编码器模式的定时器,如TIM1、TIM2、TIM3等。
    • 设置定时器的工作模式为编码器模式。
    • 配置捕获比较通道以匹配A相和B相输入。
  3. 中断配置:
    • 使能定时器的中断,以便在检测到A相或B相的变化时触发中断。
    • 在中断服务程序中更新计数器,根据A相和B相的状态确定旋转方向。
  4. 软件处理:
    • 在中断服务程序中处理计数逻辑,比如增加或减少计数值。

3. 代码实现

#include "stm32f10x.h"                  // Device headervoid Encoder_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_Cmd(TIM3, ENABLE);
}int16_t Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIM3);TIM_SetCounter(TIM3, 0);return Temp;
}

原理

#include "stm32f10x.h"                  // Device header
  • 包含STM32F1系列微控制器的标准外设库头文件。
void Encoder_Init(void)
{
  • 定义初始化编码器接口的函数 Encoder_Init
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  • 使能TIM3定时器时钟。
  • 使能GPIOA时钟,因为编码器的输入引脚连接到了GPIOA。
    GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
  • 定义一个GPIO初始化结构体 GPIO_InitStructure
  • 设置GPIOA的第6和第7引脚为上拉输入模式。
  • 设置这两个引脚的最大速度为50MHz。
  • 调用 GPIO_Init 函数初始化GPIOA的第6和第7引脚。
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;       // ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;       // PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
  • 定义一个定时器时间基础初始化结构体 TIM_TimeBaseInitStructure
  • 设置定时器的时钟分割为1(即不分割)。
  • 设置定时器的计数模式为向上计数。
  • 设置自动重装载寄存器(ARR)的值为65535,这意味着定时器的计数范围为0到65535。
  • 设置预分频器(PSC)的值为0,这意味着没有额外的分频。
  • 设置重复计数器的值为0。
  • 调用 TIM_TimeBaseInit 函数初始化TIM3的时间基础。
    TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);
  • 定义一个输入捕获初始化结构体 TIM_ICInitStructure
  • 初始化该结构体。
  • 设置第1通道(对应GPIOA6)的输入捕获滤波器为16个时钟周期(0xF),这有助于抑制噪声。
  • 初始化TIM3的第1通道。
  • 设置第2通道(对应GPIOA7)的输入捕获滤波器为16个时钟周期。
  • 初始化TIM3的第2通道。
    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  • 配置TIM3为编码器模式,使用TI1和TI2通道。
  • 设置两个通道的输入极性都为上升沿。
    TIM_Cmd(TIM3, ENABLE);
  • 使能TIM3定时器。
}
  • 结束函数 Encoder_Init
int16_t Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIM3);TIM_SetCounter(TIM3, 0);return Temp;
}
  • 定义一个函数 Encoder_Get 用于获取当前的计数值。
  • 读取TIM3的计数器值到变量 Temp
  • 清零TIM3的计数器。
  • 返回计数器值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

坐标系转换公式

坐标系转换2种情况: 一、XOY坐标系不动,点P(x, y) 沿顺时针方向旋转 θ \thetaθ,得在XOY坐标系的坐标为P(x′, y′) 设某点与原点连线和X轴夹角为b度,以原点为圆心,逆时针转过a度 , 原点与该点连线长度为R, [x,y]为…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(上)

1.范围 本部分规定了DLMS/COSEM客户机和服务器的DLMS/COSEM应用层的结构、服务和协议。同时,定义规则规定DLMS/COSEM通信配置。 它定义了用于建立和释放应用程序连接的服务,以及用于访问GB/T17215.662中使用逻辑名称(LN)或短名称(SN)引用定义的COSEM接口对象的方法和属性…

先用先发!小样本故障诊断新思路!Transformer-SVM组合模型多特征分类预测/故障诊断(Matlab)

先用先发!小样本故障诊断新思路!Transformer-SVM组合模型多特征分类预测/故障诊断(Matlab) 目录 先用先发!小样本故障诊断新思路!Transformer-SVM组合模型多特征分类预测/故障诊断(Matlab&#…

关于 OSPF LSA 序列号范围 0x80000001-0x7FFFFFFF 释疑正本清源

注:机翻,未校对。 正本:RFC 2328 OSPF Version 2 中相关解释 April 1998 12.1.6. LS sequence number 12.1.6. 序列号 The sequence number field is a signed 32-bit integer. It is used to detect old and duplicate LSAs. The space …

找工作准备刷题Day14 回溯算法 (卡尔41期训练营 7.29)

第一题:Leetcode376. 摆动序列 题目描述 解题思路 使用两个变量:preDiff 和 curDiff,分别记录 前一次相邻元素差值和 此处相邻元素值之差,只有当preDiff 和 curDiff 符号不同,摆动序列长度加一。 初始:长…

1.4、存储系统

目录 存储器的层次结构外存(辅存)内存CPU的寄存器Cache总结举例局部性原理 练习题 高速缓存Cache总结举例总结 练习题 Cache的地址映像方法直接相联映像全相联映像组相联映像练习题 Cache替换算法Cache页面淘汰算法Cache的读写过程练习题 磁盘总结固态硬…

dpdk 响应icmp请求(Echo or Echo Reply Message)

注:对于"Echo or Echo Reply Message"类型的icmp报文,响应报文的Identiy和Sequence Number的值与请求报文的这两个字段的值要相同。 Identifier(标识符)字段通常由发送方设置,并被用于将ICMP请求与相应的回复…

python采集阿里巴巴历年员工人数统计报告

数据为2012到2022财年阿里巴巴每年的全职员工数量。截止2022年3月31日,阿里巴巴共有全职员工254941人,比上年增长3479人。 数据来源于阿里巴巴20-F和F-1文件 按阿里巴巴财政年度进行统计,阿里巴巴财年结束日期为每年3月31日 为全职员工人数 阿…

好用的开源免费录屏工具|OBS录屏参数设置|OBS录屏参数优化|录屏工具科普|OBS如何设置录屏才能不模糊

背景/引言 我的需求 相信这也是大多数用户的录屏需求。 选择一款开源免费的PC录屏软件(开源意味着可能需要了解一些参数概念以及如何设置,设置多少的问题,灵活性带来入门门槛的问题,但是相应的也会掌握一些视频相关的知识&…

WireShark 更改界面主题

背景 Windows 是黑色主题 安装 WireShark 后&#xff0c;WireShark 界面也是黑色主题 预期 想要将 WireShark 界面更改为白色主题 操作 启动 wireshark 时添加 -platform windows:darkmode0 参数 <Wireshark.exe 路径> -platform windows:darkmode0 例&#xff1a;…

echarts所遇到的问题,个人记录

TreeMap 矩形树图&#xff0c;label设置富文本之后&#xff0c;无法垂直居中 font-size 支持rem&#xff0c;其余不支持 font-size 支持 rem&#xff0c;但是其余的属性如height&#xff0c;width等不支持 echarts-for-react 绑定事件&#xff0c;会覆盖实例上绑定的 当给cha…

[C++探索]初始化列表,static成员,友元函数,内部类,匿名对象

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

Linux基础操作指令

Linux的操作特点&#xff1a;纯命令行&#xff08;虽然也有图形化界面&#xff0c;但主要是工程师使用&#xff0c;意义不大&#xff09; windows的操作特点&#xff1a;图形化界面&#xff08;也有纯命令行的形式&#xff0c;但其更贴近大众&#xff0c;命令行学习成本高&…

服务暴露 traefik

一。traefik 部署 前置资源 还是那个网站&#xff0c;这里复制 entryPoints&#xff0c;进入traefik的大门 可选在哪台机器上部署 traefik 部署 用 Daemonset 的方式是为了&#xff0c;加机器到集群后&#xff0c;能自动部署traefik 到目标机器 注意 8084端口 必须加…

一种多策略改进黑翅鸢智能优化算法IBKA(2024年新出优化算法)种群初始化精英反向+透镜成像反向学习+黄金正弦变异策略

一种多策略改进黑翅鸢智能优化算法IBKA&#xff08;2024年新出优化算法&#xff09; 种群初始化精英反向策略透镜成像反向学习策略黄金正弦变异策略 文章目录 前言一种多策略改进黑翅鸢智能优化算法IBKA&#xff08;2024年新出优化算法&#xff09; 种群初始化精英反向策略透镜…

sentinel 服务流量控制 、熔断降级

1、什么是 sentinel,可以用来干什么 sentinel是用来在微服务系统中保护微服务对的作用,如何避免服务的雪崩、熔断、降级,说白了就是用来替换hystrix。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 官网:GitHub - alibaba/Se…

sqlilabs解题方法

Lass1 查询id为1的用户名和密码 查询id为2的用户名和密码 没有回显&#xff0c;不含id-1的行 判断字段数&#xff0c;字段数为3 查询数据库用户名&#xff0c;和数据库名 查询时id必须超出数据库以外&#xff0c;一般用-1 用户名&#xff1a;user() 数据库名&#xff1a;databa…

【电路笔记】-共源JFET放大器

共源JFET放大器 文章目录 共源JFET放大器1、概述2、共源JFET放大器3、JFET放大器电流和功率增益共源JFET放大器使用结场效应晶体管作为其主要有源器件,提供高输入阻抗特性。 1、概述 普通源JFET放大器与共射极BJT放大器相比有一个重要优点,即FET具有极高的输入阻抗,再加上低…

在IDEA中切换分支没有反应

说明&#xff1a;记录一次在IDEA中切换分支没有反应的情况&#xff0c;新建一个分支后&#xff0c;准备暂存代码&#xff0c;切换到其他分支去&#xff0c;发现怎么切都没有反应&#xff0c;也没有切过去&#xff1b; 解决&#xff1a;首先&#xff0c;我想到是不是当前新分支…