【STM32编码器】【STM32】
提示:一般情况下我们会设计一个硬件电路模块来自动完成简单重复而高频的计算
文章目录
- 一、为什么通常情况下不使用外部中断来对编码器的脉冲进行计数?
- 二、编码器速度测量程序设计思路
- 三、正交编码器
- 四、初始化流程
- 五、STM32正交编码器输入捕获模式配置示例
- 总结
一、为什么通常情况下不使用外部中断来对编码器的脉冲进行计数?
电机高速旋转过程中会在短时间产生成千上万个脉冲信号,如果频繁调用中断进行累加运算会占用一定的软件资源;
一般情况下我们会设计一个硬件电路模块来自动完成上述简单重复而高频的计算;
二、编码器速度测量程序设计思路
每隔一段实际取一次值就可以得到编码器旋转的速度了;
编码器接口(Encoder Interface),编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或者自减,从而指示编码器的位置、旋转方向和旋转速度;
每个高级定时器和通用定时器都拥有一个编码器接口;
两个输入引脚借用了输入捕获的通道1和通道2;
注意CH3和CH4引脚不能接编码器
每个高级定时器和通用定时器都拥有一个编码器接口;
三、正交编码器
正交编码器的接口:
A相 B相 编码器电源 GND Z相(编码器0位置的输出,每转到一个固定的位置的时候输出一个脉冲,一般用于位置测量,校准0位置用的。)
正交信号精度更高:
A、B相都可以计次,相当于频率提高了一倍;
正交信号可以抗噪声:
正交信号的两个信号必须是交替跳变的,可以设计成一个抗噪声电路;
65535的补码为-1,如果想读取到负数,可以将编码器的uint_16类型强行转换为int_16类型;
读取编码器计数次数库函数:
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
四、初始化流程
①RCC开启时钟,开启GPIO和定时器的时钟;
②配置GPIO,把PA6和PA7 配置成输入模式;
③配置时基单元,预分频器一般选择不分频(PSC = 0),自动重装一般给最大值65535(0~2^16-1);
④配置输入捕获单元,这里输入捕获单元只有滤波器和极性有用,后面的参数没有用到,与编码器无关;
⑤配置编码器接口模式
⑥调用TIM_Cmd启动定时器;
编码器初始化需要调用到的库函数
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
获取定时器CNT的计数值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
五、STM32正交编码器输入捕获模式配置示例
代码如下(示例):
/*** @brief 正交编码器输入捕获初始化,采用PA6、PA7捕获编码器A相与B相数据;注意PA6与PA7不可以随意更换,PA6->TIM3的CH1 PA7->TIM3的CH2;* @param 无* @retval 无*/
void Encoder_Init_IC(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的外设时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//设置上拉输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//选中GPIO口GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器TIM3的外设时钟//TIM_InternalClockConfig(TIM3);//选择内部时钟驱动TIM3的时钟单元,定时器上电默认使用内部时钟,这句话可以不写//TIM_ETRConfig(TIM3,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted,0x0F);//选择外部时钟驱动TIM3的时钟单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//滤波器的采样时钟分频系数,跟时基单元关联不大,决定了滤波器的输入时钟频率(越低滤波输出越稳定,同时延迟会增大)TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数TIM_TimeBaseInitStruct.TIM_Period = 65535;//ARR自动重装器的值,取值0~65535,10KHZ/10000=1HZTIM_TimeBaseInitStruct.TIM_Prescaler = 0;//预分频器的值,取值0~65535,72MHZ/7200=10KHZTIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器的值,高级定时器特有的配置,这里用不上TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICStructInit(&TIM_ICInitStruct);//给结构体赋初始值,主要是为了防止结构体不完整导致出错TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//指定配置1~4哪一个通道TIM_ICInitStruct.TIM_ICFilter = 0xF;//选择输入捕获的滤波器,数值越大滤波效果越好(一般滤波器的采样频率会远高于信号频率,此处滤波器不会改变输入信号的频率,而是滤除高频噪声使得输入信号更加平滑)TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//这里的上升沿代表高低电平极性不反转//TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分配器会改变输入信号的频率,这里需要每次信号触发都有效,所以选择不分频//TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择信号从哪一路引脚输入,可以选择直连通道或者交叉通道(DirectTI表示直连通道,InDirectTI表示交叉通道)TIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//指定配置1~4哪一个通道TIM_ICInitStruct.TIM_ICFilter = 0xF;//选择输入捕获的滤波器,数值越大滤波效果越好(一般滤波器的采样频率会远高于信号频率,此处滤波器不会改变输入信号的频率,而是滤除高频噪声使得输入信号更加平滑)TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//这里的上升沿代表高低电平极性不反转//TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分配器会改变输入信号的频率,这里需要每次信号触发都有效,所以选择不分频//TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择信号从哪一路引脚输入,可以选择直连通道或者交叉通道(DirectTI表示直连通道,InDirectTI表示交叉通道)TIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_Cmd(TIM3,ENABLE);//启动定时器TIMx 这里的上升沿代表高低电平极性不反转TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12 ,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//写入到TIMCmd后防止被覆盖
}/*
在输入捕获的模式下如果想获取编码器的位置信息可以直接读出CNT的值;
如果想获取编码器的速度和方向,需要每隔一段固定的闸门时间,去除一次CNT再把CNT清零;
上述测量速度即测频法;
*/
总结
以上就是今天要讲的内容,本文简单介绍了STM32中编码器的使用方式。
相关文章:
【STM32编码器】【STM32】
提示:一般情况下我们会设计一个硬件电路模块来自动完成简单重复而高频的计算 文章目录 一、为什么通常情况下不使用外部中断来对编码器的脉冲进行计数?二、编码器速度测量程序设计思路三、正交编码器四、初始化流程五、STM32正交编码器输入捕获模式配置示…...

Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...

VScode分文件编写C++报错 | 如何进行VScode分文件编写C++ | 不懂也能轻松解决版
分文件编写遇到的问题 分文件编写例子如下所示: 但是直接使用 Run Code 或者 调试C/C文件 会报错如下: 正在执行任务: C/C: g.exe 生成活动文件 正在启动生成… cmd /c chcp 65001>nul && D:\Librarys\mingw64\bin\g.exe -fdiagnostics-col…...

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南
在当前信息技术与“互联网”深度融合的背景下,金融行业的转型升级是热门话题,创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展,它们与金融领域的深度融合,正引领着新型…...

Unity3D学习FPS游戏(4)重力模拟和角色跳跃
前言:前面两篇文章,已经实现了角色的移动和视角转动,但是角色并没有办法跳跃,有时候还会随着视角移动跑到天上。这是因为缺少重力系统,本篇将实现重力和角色跳跃功能。觉得有帮助的话可以点赞收藏支持一下!…...

C#基础知识-枚举
目录 枚举 1.分类 1.1普通枚举 1)默认情况 2)指定起始值 1.2标志枚举(Flag Enum) 位运算符与标志枚举 1)组合标志 2)检查标志 2.枚举与不同类型之间的转换 1)枚举->整型 2&#…...

系统架构设计师教程 第2章 2.1-2计算机系统及硬件 笔记
2.1计算机系统概述 ★☆☆☆☆ 计算机系统 (Computer System) 是指用于数据管理的计算机硬件、软件及网络组成的系统。 一般指由硬件子系统和软件子系统组成的系统,简称为计算机。 将连接多个计算机以实现计算机间数据交换能力的网络设备,称为计算机网…...
通过使用Visual Studio将你的程序一键发布到Docker
通过使用Visual Studio将你的程序一键发布到Docker 代码 阿里云容器镜像服务 https://www.aliyun.com/product/acr 添加Docker CE阿里云镜像仓库 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装Docker CE、Doc…...
vue2和vue3动态引入路由,权限控制
后端返回的路由结构(具体路由可以本地模拟) // 此路由自己本地模拟即可 const menus [{"title": "动态路由","meta": "{\"title\":\"动态路由\",\"noCache\":true}","component": "/t…...

Spring Boot:植物健康的智能守护者
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
红黑树 学习笔记
目录 1.红黑树的概念 1.1红黑树的规则 1.2红黑树的效率 2.红黑树的实现 2.1红黑树的大致结构 2.2红黑树的插入 2.2.1红黑树插入的大致过程 2.2.2情况1:变色 2.2.3情况2:单旋+变色 2.2.4情况3:双旋变色 2.3红黑树的查找…...
linux更改系统时间
测试环境和生产环境代码完全一致,但是生产环境代码碰到了问题,报错类似time expired,猜测和系统时间有关系,修改之后确实好了。测试如下: 参考:centos7时间同步教程_centos7 时间同步,如果遇到…...

B站C#刘铁猛笔记
C#——刘铁猛笔记 类、名称空间(简述) 类(class)是构成程序的主体 名称空间(namespace)以树形结构组织类(其他类型) 名称空间:名称空间是用来组织和管理类、接口、结构…...

如何使用信号发生器产生正弦波并用数字示波器进行测量
使用信号发生器产生正弦波并用数字示波器进行测量的步骤如下: 1. 准备工作 所需设备 信号发生器数字示波器探头(通常为10X衰减探头)BNC电缆和适配器(如果需要) 2. 设置信号发生器 连接 使用BNC电缆将信号发生器的…...

XJ04、消费金融|授信基本概念及其流程设计
银行是经营风险的特殊行业,而银行授信则与银行业务和风险天然相伴。它是银行与客户建立业务关系的起点,也是银行风险管理的关键环节和核心要素。若要了解银行业务,就得先了解银行的授信业务;若要理解银行经营,就得先理…...

儿童预防接种预约微信小程序springboot+论文源码调试讲解
2相关技术 2.1微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的如虎添翼,发展迅猛。 2.2 MYSQL数据…...
nginx 修改配置
如果你的后端服务在不同的端口上运行,但静态资源访问路径相同,你可以使用 Nginx 的 location 配置来将请求转发到不同的后端服务,同时处理静态文件。这里有几种常见的方式: 方案 1: 基于路径的配置 如果所有服务的静态资源路径相…...
孤岛架构在安全性方面
孤岛架构在安全性方面的考虑主要涉及如何确保每个孤岛的安全性,同时维护整个系统的安全。 关键的安全性考虑: 1. 数据隔离和访问控制 数据隔离:每个孤岛应该有独立的数据存储,以确保数据隔离。这有助于防止数据泄露和未经授权的…...

COSCon'24 志愿者招募令:共创开源新生活!
亲爱的开源爱好者们, 第九届中国开源年会(COSCon24)即将在北京中关村国家自主创新示范区会议中心于2024年11月2日至3日隆重举行。今年的主题是“Open Source, Open Life|开源新生活”,旨在探索开源技术如何在各个领域推…...

vscode使用make编译c的问题
问题1:makefile:2: *** missing separator. Stop vscode的配置问题,看这哥们的文章即可:https://blog.csdn.net/m0_57464986/article/details/134220676 问题2:创建makefile文件 直接创建文件名为“makefile”的文件即可&#x…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...