STM32——TIM编码器接口

这篇具有很好参考价值的文章主要介绍了STM32——TIM编码器接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、编码器接口简介

  • Encoder Interface 编码器接口
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口,C8T6拥有4个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2(CH1和CH2引脚)
  • 编码器接口可以看做是带有方向控制的外部时钟
  • 实际上是测频法测正交脉冲的频率,可以根据旋转方向,实现自增计次,自减计次,然后每隔一段时间取一次CNT的值,再把CNT清零,每次取出来的就是编码器的速度。如果只是取出CNT的值不清零,则表示编码器当前的位置
  • 外部中断实现的效果和编码器接口实现的效果相同,区别是后者使用硬件资源取代软件资源开销

二、正交编码器

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

  • 可以测量位置(返回CNT的值),或带方向的速度值(返回CNT的变化值)
  • 旋转越快,频率越高,频率代表速度
  • 设计正交信号可以抗噪声
  • 由右侧的图可知,A相上升沿的时候,B相在正传和反转时是不同的电平。所以,将A相和B相的所以边沿作为计数器的时钟,出现边沿变化时,计数器就自增或自减

三、通用定时器框图

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

  • 编码器接口的两个输入引脚借用了输入捕获的通道的CH1和CH2引脚
  • 编码器接口是从模式控制器,通路连接到CNT计数器
  • 72MHZ的内部时钟和时基单元初始化设置的计数方向并不会使用,而是受到编码器控制

四、编码器接口基本结构

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

  • ARR自动重装器设置为65535。利用补码特性得到负数,将16位的无符号数转化为16位的有符号数,65535为-1,65534为-2。
  • 函数TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//配置编码器接口,第二个参数为编码器模式,参数三四为通道的极性
  • 边沿检测:上升沿有效表示的是高低电平不翻转,下降沿有效表示翻转高低电平

五、工作模式

  • 四倍频技术

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

  • 左侧的有效边沿为3种工作模式:由于在判断为正转时可以有四种状态,也就是AB相都可以用来判断,仅仅采用一个通道进行判断也可以只是计次精度会下降
    stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

六、实例(均不反相)

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

  • 一个引脚不变,另一个引脚多次变化的毛刺信号,计数值还是原来那个数

七、实例(TI1反相)

stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

  • TI1反相,在分析前先将TI1的时序图翻转
  • TI1反相,是修改将CH1或2通道内的极性选择,在编码器模式下是高低电平的极性翻转,而不是输入捕获模式下的边沿翻转
  • 用途:当计数相反的时候可以修改极性

八、编码器接口测速

本质:编码器计次,计次可以使用外部中断方式,方波信号来自编码器,在中断函数里面手动计次,占用软件资源,CPU会频繁进入中断,可以采用硬件自动化计次,也就是定时器的编码器接口模式。

使用场景:使用PWM驱动电机,再使用编码器(无接触式的霍尔传感器或光栅)测量电机速度,再用PID算法实现闭环控制

电路设计

旋转编码器的AB相分别接PA6和PA7
stm32编码器接口,STM32,stm32,单片机,嵌入式硬件

关键代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed;

int main(void)
{
	OLED_Init();
	Timer_Init();
	Encoder_Init();
	
	OLED_ShowString(1, 1, "Speed:");
	
	while (1)
	{
		OLED_ShowSignedNum(1, 7, Speed, 5);//OLED_ShowSignedNum()可以显示负数
		//Delay_ms(1000);为了避免在主循环中造成阻塞,可以用定时中断的方式读取CNT的变化值,如TIM2_IRQHandler()函数
	}
}

void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Speed = Encoder_Get();//每隔一秒读取一次速度
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

Encoder.c

#include "stm32f10x.h"                  // Device header

void 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;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSC,不分频,编码器时钟直接驱动计数器
	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;//通道1
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	//无须定义新的结构体配置成员,因为调用TIM_ICInit()函数后就写入到硬件寄存器中
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道2
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//配置编码器接口,第二个参数为编码器工作模式,参数三四为通道的极性,Falling表示通道反向,Rising表示通道不反向
	
	TIM_Cmd(TIM3, ENABLE);
}

//返回有符号位的16位计数器的值
int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

参考视频:江科大自化协文章来源地址https://www.toymoban.com/news/detail-804117.html

到了这里,关于STM32——TIM编码器接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机(五)第二节:EXTI外部中断练习2(旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(42)
  • STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(45)
  • STM32(HAL)--使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数

    目录 一 旋钮编码器相关知识 二 STM32CubeMx配置 三 程序编写 3.1 相关函数介绍 3.2 程序编写 四 实验结果 旋转编码器是一种位置传感器,输出脉冲信号可以用来确定编码器的旋转角度和旋转方向。 编码器中有两个开关,当旋钮旋转后,开关会依次导通,开关结构图如下图所示

    2024年02月15日
    浏览(52)
  • STM32定时器的编码器接口模式

    MCU为STM32L431,通用定时器框图: 编码器接口模式一共有三种,通过TIMx_SMCR寄存器的SMS[3:0]位来选择。模式1计数器仅在TI1FP1的边沿根据TI2FP2的电平来判断向上/下计数;模式2计数器仅在TI2FP2的边沿根据TI1FP1的电平来判断向上/下计数;模式3计数器同时在TI1FP1和TI2FP2的边沿根据另

    2023年04月15日
    浏览(49)
  • STM32移植LVGL+旋转编码器接口对接

    写在前面:本菜鸟结合了许多大佬的文章,成功实现了基于LVGL的GUI设计,小开心~浅浅记录一下!~ 本文以单片机STM32F103VET6为核心,利用ST7796芯片驱动分辨率为480*320的LCD液晶屏模块,移植LVGL,对接显示接口,对接外部接口——旋转编码器,完成以上两步,就可以实现LVGL的显

    2024年02月10日
    浏览(44)
  • 【嵌入式】STM32计时器编码器接口模式使用

    使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。 硬件: STM32F103C8T6 光栅测距传感器 编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信

    2024年02月20日
    浏览(46)
  • 【32单片机学习】(3)霍尔编码器减速直流电机控制及测速

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.实验现象 2.实验接线及原理图 接线图 原理图  电机接线图 3.代码部分 1.主函数  main.c 2.按键部分   key.c  key.h pwm代码   pwm.c  pwm.h 电机驱动   motor.c   motor.h  OLED显示 oled.c oled.h  编码器

    2024年02月11日
    浏览(54)
  • stm32-编码器测速

    编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。 使用定时器

    2024年03月19日
    浏览(48)
  • STM32编码器模式(带方向/正交编码)

    看前说明 :这里重点介绍的时STM32的定时器编码器模式,是根据STMF10x参考手册,如果有使用过编码器或编码器不一样的可以直接跳过前面的编码器介绍,直接看理论分析与程序部分。 这里需要注意的参数 输出脉冲线数:1024线: 编码器每旋转一周输出的脉冲的个数 ,这个数

    2023年04月24日
    浏览(55)
  • STM32 ABZ编码器模式详解

            本文旨在记录和说明STM32CubeIde中ABZ编码器的配置。本人作为STM32新手,在使用STM32时,太多的意义不明的配置项让我摸不着头脑,查阅资料并在这里记录,如果有不对的,欢迎各位大佬指正。         本文硬件使用ST官方提供的NUCLEO-G474RE+X-NUCLEO-IHM16M1,记录ABZ的配

    2024年02月19日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包