首页 > 其他分享 >STM32 TIM编码器接口测速(最详细的编码器接口笔记)

STM32 TIM编码器接口测速(最详细的编码器接口笔记)

时间:2024-09-09 13:24:56浏览次数:3  
标签:TimeBaseInitStructure TIM3 编码器 接口 STM32 TIM GPIO ICInitStructure

编码器接口简单介绍

方波的频率其实就代表了速度

编码器接口测速原理

TIM编码器测速本质上就是测频法,在指定时间内,对高电平信号进行计次

编码器接口的设计逻辑就是,首先把A相和B 项的所有边沿作为计数器的计数时钟,出现边沿信号的时候,就自增或者自减,如何判断自增还是自减?当出现边沿信号的时候,我们去判断另一项的状态,如果这时候另一项为低电平,那么就为正转,如果为高电平,那么就为翻转,以此判断正交编码器的旋转方向。

这里的从模式自动电路也是一样的,当出现了边沿信号,并且另一向为低电平就控制CNt自增 否则控制CNT自减

编码器接口基本结构

工作模式

因为旋转器编码接口有两个向的输入,可以选择只对一个向进行计数,一般情况下,我们都对两个向进行计数

正交编码器抗噪声原理

当一个向的电平不变化,另一个向的电平连续变化的时候,这时候,由于一项保持高电平或是低电平,对应表的关闭,根据跳变信号向CNT计数器就会反复的自增自减自增自减,那么最终的数,还是毛刺信号前的数值,不会收到干扰影响。

总结:编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟

代码部分

初始化流程

GPIO 模式选择原则:一般可以看外部模块输出默认电平,如果外部模块空闲默认输出高电平,我们就选择上拉输入,默认输入高电平,反之,如果外部模块默认输出低电平,我们就配置下拉输入,默认输入低电平,和外部模块保持默认一致,防止默认电平打架,这是上拉下拉的选择原则,不过一般来说,默认高电平,这是一个习惯的状态,所以一般上拉输入用的比较多,如果你不确认外部输入的默认状态,或是外部信号输出功率非常小,这时候就尽量选择浮空输入,因为他没有上拉或是下拉电阻干扰外部信号,缺点就是当引脚悬空的时候,容易受到干扰

主函数部分
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"
#include "Delay.h"
int16_t Speed;
int main(void){
  
  OLED_Init();
  Encoder_Init();
  OLED_ShowString(1,1,"Speed:");
  Timer_Init();
  
  //  Timer_Init();
  while(1){
    OLED_ShowSignedNum(1,7,Speed,5);
  }
}

void TIM2_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM2 ,TIM_IT_Update)==SET )
  {
    Speed = Ecoder_Get();
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  }
}

初始化函数部分
#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
  
  //1.开启时钟,开启定时器跟GPIO的时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  
  //将GPIO配置为输入模式
  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);
  
  //配置TIM3 时钟源为内部时钟
  //        TIM_InternalClockConfig(TIM3); //编码器接口会托管时钟,所以不需要时钟源
  
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//也是无效的
  TIM_TimeBaseInitStructure.TIM_Period=65536-1;
  TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;
  TIM_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 Ecoder_Get(void)
{
  int16_t Temp;
  Temp = TIM_GetCounter(TIM3);
  TIM_SetCounter(TIM3,0);
  return  Temp;
}        

程序现象

OLED 屏幕呈现编码器正/反旋转速度 频率1 秒

标签:TimeBaseInitStructure,TIM3,编码器,接口,STM32,TIM,GPIO,ICInitStructure
From: https://blog.csdn.net/m0_74323796/article/details/142056165

相关文章

  • 从STM32的定时器到Linux上的时间相关服务
    难题:在baremetal上实现按钮点击、长按事件起因是因为我想用stm32加几个按钮只做一个我自己的控制器,我可以通过按钮执行一些功能。硬件是如何和CPU通信的呢?CPU上支出几个GPIO引脚,这些引脚可以配置为输入模式和输出模式,并且都有两种状态——高电平和低电平。硬件连接这些引脚,你编......
  • RESTful api 与远程接口调用
       RPC( Remote Process Call) 远程接口调用的准确应用是程序与程序之间的通信 。程序 是在计算机中运行中的可用进程。进程之间的通信可以通过管道或者是消息。随着时代的发 展,应用程序的架构模式不断地简化。浏览器作为操作系统客户端和其他数据服务端连接的 可视......
  • 在 Qt5 中创建一个 HTTP 接口以返回屏幕截图
    在Qt5中创建一个HTTP接口以返回MainWindow的屏幕截图在Qt5中,可以通过使用QTcpServer和QTcpSocket来创建一个简单的HTTP服务器。通过这种方式,我们可以实现一个HTTP接口,当访问该接口时,会返回当前MainWindow窗口的屏幕截图。以下是实现这一功能的详细步骤与相关知......
  • 如何使用API接口获取 TaoBao 商品数据详情
    在电子商务的快速发展中,淘宝作为中国最大的电商平台之一,提供了丰富的API接口,使得开发者能够高效地获取淘宝商品的详细信息。这些信息包括商品的基本属性、价格、库存状态、销售策略、卖家信息等,对于电商分析、市场研究或者商品信息管理等场景非常有用。什么是淘宝API接口?淘......
  • 一文讲清,常用通信协议IIC,SPI,串口,基于STM32
    目录一、通讯的基本概念1.串行通讯2.并行通讯3.传输模式(单工、半双工、全双工)二、常见通讯协议(串口、IIC、SPI)1.串口(1)UART和USART的区别是什么?(2)UART(TTL、RS232、RS485)(3)基于STM32的HAL库的串口配置2.IIC(1)物理层(2)协议层(3)软件模拟IIC通讯代码(4)有关IIC面试的问题(5)硬......
  • STM32常用数据采集滤波算法
    例如,STM32进行滤波处理时,主要目的是处理数据采集过程中可能产生的噪声和尖刺信号。这些噪声可能来自电源干扰、传感器自身的不稳定性或其他外部因素。1.一阶互补滤波方法:取a=0~1,本次滤波结果=(1-a)本次采样值+a上次滤波结果优点:对周期性干扰具有良好的抑制作用适用于波动频率......
  • 【愚公系列】《AIGC辅助软件开发》018-AI辅助后端编程:快速生成接口文档
    ......
  • 硬件基础知识和典型应用-关于STM32休眠唤醒引脚PA0使用说明(PA0问题,PA0一直连接高电
     说明PA0本身是下降沿唤醒,PA0在休眠时不能连接高电平,因为会导致休眠失败!所以在STM32使用PA0做中断唤醒时,学习到的教程全部是外部连接按键进行唤醒,平时PA0悬空,按键按一下PA0接到低电平,然后唤醒单片机; 如何解决(A0本身是下降沿唤醒,PA0在休眠时不能连接高电平,因......
  • java面试(9.8)接口和抽象类的区别
    接口:        定义了一组方法规范,但不提供这些方法的具体实现。接口的作用:定义规范:接口主要用于定义一个规范,规定了实现该接口的类必须遵守的规则。实现多继承:一个类可以实现多个接口,从而继承多个接口中定义的方法。解耦合:接口提供了一种解耦合的方式,使得代码......
  • Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密&解密
    加密效果:解密后的数据就是正常数据:后端:使用的是spring-cloud框架,在gateway模块进行操作<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version>......