STM32笔记——定时器编码器接口模式

目录

一、概述

二、编码器接口

2.1 编码器接口简介

2.2 编码器接口工作模式

2.3 编码器接口模式基本结构


一、概述

        编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。

二、编码器接口

2.1 编码器接口简介

  • Encoder Interface 编码器接口
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2

2.2 编码器接口工作模式

  •  仅在TI1计数:只计数TI1FP1的脉冲数量。在TI1FP1上升、TI2FP2为高电平和TI1FP1下降、TI2FP2为低电平时向下计数;在TI1FP1上升、TI2FP2为低电平和TI1FP1下降、TI2FP2为高电平时向上计数。
  • 仅在TI2计数:只计数TI1FP2的脉冲数量。在TI2FP2上升、TI1FP1为低电平和TI2FP2下降、TI1FP1为高电平时向下计数;在TI2FP2上升、TI1FP1为高电平和TI2FP2下降、TI1FP1为低电平时向上计数。
  • 在TI1和TI2上计数:计数TI1FP1和TI1FP2的脉冲数量。向上计数和向下计数将上面结合。

TI1FP1和TI2FP2信号可以参考下面:

  •  正转:向上计数;反转:向下计数。
  • 如果正转反转,跟你想规定的相反,可以选择反相。①可以把接线A、B相互换;②可以把TI1FP1和TI2FP2其中一个反相。

2.3 编码器接口模式基本结构

  1. 正交信号(TI1和TI2)从输入捕获通道接口(复用的GPIO口)进入输入捕获部分。
  2. 经过输入捕获部分的滤波器滤波和带有极性选择的边沿检测器变相,得到TIFP1和TI2FP2信号。
  3. 编码器接口输出一个相当于带有方向选择的外部时钟。控制计数器的加减。

具体步骤如下:

  1. 初始化GPIO口。
  2. 初始化两个输入捕获通道。
  3. 设置编码器接口模式。
  4. 初始化时基单元。
  5. 使能TIM。

对应的模块程序如下:

#include "stm32f10x.h"                  // Device header

void Encode_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICStructInit(&TIM_ICInitStruct);
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
	TIM_ICInitStruct.TIM_ICFilter=0xF;
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
	TIM_ICInit(TIM3, &TIM_ICInitStruct);
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;
	TIM_ICInitStruct.TIM_ICFilter=0xF;
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
	TIM_ICInit(TIM3, &TIM_ICInitStruct);
	
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_Period=65536-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler=1-1;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	TIM_Cmd(TIM3,ENABLE);
}

猜你喜欢

转载自blog.csdn.net/ssssshhbh/article/details/129472203