STM32 TIM编码器接口

一、编码器接口简介

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

使用场景:使用定时器的编码器接口,再配合编码器,就可以测量旋转速度和旋转方向。一般应用于电机控制的项目上,使用PWM驱动电机,再使用编码器测量电机的速度,再用PID算法进行闭环控制。一般电机旋转速度比较高,会使用无接触的霍尔传感器或者光栅进行测速。(本人使用触点式旋钮编码器,电机是手动旋转)。

二、正交编码器

三、工作原理

四、工作模式

五、代码

cpp 复制代码
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

//定时器编码器接口配置(1:定时器, 2:编码器模式 ,3:通道1的电平极性 ,4:通道2的电平极性)

整体代码:

cpp 复制代码
#include "stm32f10x.h"                  // Device header

void Encoder_init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 ,ENABLE );
	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);
	
//不需要开启内部时钟,编码器接口就是一个带方向控制的外部时钟

	
	//配置定时器时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period= 65536 - 1;   //ARR自动重装器的值
	TIM_TimeBaseInitStruct.TIM_Prescaler=1-1; //PSC预分频器的值,给0,不分频,编码器的时钟直接驱动计数器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter= 0;  //重复计数器的值
	TIM_TimeBaseInit (TIM3 ,&TIM_TimeBaseInitStruct );


//编码器接口基本配置,输入捕获不需要全部用到只需要用到  : 滤波器,通道,极性方向
  TIM_ICInitTypeDef TIM_ICInitStruct;          //定义一个结构体变量
	TIM_ICStructInit(&TIM_ICInitStruct);          //给结构体赋一个初始值
	TIM_ICInitStruct.TIM_Channel =TIM_Channel_1 ; //指定定时器输入捕获所使用的通道。
	TIM_ICInitStruct.TIM_ICFilter = 0xF;       //设置输入捕获滤波器的值,数值越大,滤波效果越强
	TIM_ICInit(TIM3,&TIM_ICInitStruct);     //相当于写入

  TIM_ICInitStruct.TIM_Channel =TIM_Channel_2 ; //指定定时器输入捕获所使用的通道。
	TIM_ICInitStruct.TIM_ICFilter = 0xF;       //设置输入捕获滤波器的值,数值越大,滤波效果越强
	TIM_ICInit(TIM3,&TIM_ICInitStruct);     //相当于写入
	
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); 
	//定时器的编码器接口配置函数
	//(1:定时器几,2:编码器模式选择TI1和TI2都计数,3:Rising是不反向,Falling是反向(反向就是往哪转是正,是相对的))


  TIM_Cmd(TIM3,ENABLE);   //开启定时器3
}


int16_t Encoder_Get(void)
{
	return TIM_GetCounter(TIM3);
}

//如果用编码器测速的话,需要将上面的Get函数改一下,在固定的闸门时间读一次CNT,然后把CNT清零
//在主循环里,每间隔一段时间,Get一次,也就是delay_ms(1000);这是手转的延时,电机的话可以给短一点
//int16_t Encoder_Get(void)
//{
//	int16_t Temp;
//	Temp = TIM_GetCounter(TIM3);
//	TIM_SetCounter(TIM3,0);
//	return Temp;
//}
相关推荐
云伴枫轻舞4 分钟前
我对 OTA 的理解随记,附GD32/STM32例程
stm32·单片机·嵌入式硬件
Aczone281 小时前
硬件(五) 存储、ARM 架构与指令系统
arm开发·嵌入式硬件·架构
LS·Cui1 小时前
单片机按键示例功能
单片机
【ql君】qlexcel1 小时前
MCU上电到运行的全过程
单片机·嵌入式硬件·mcu·启动过程
搞一搞汽车电子2 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
pQAQqa2 小时前
FreeRTOS项目(2)摇杆按键检测
stm32·单片机·嵌入式硬件·freertos
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
一川月白7094 小时前
51单片机---硬件学习(跑马灯、数码管、外部中断、按键、蜂鸣器)
单片机·学习·51单片机·外部中断·蜂鸣器·数码管·跑马灯
月阳羊5 小时前
【硬件-笔试面试题-69】硬件/电子工程师,笔试面试题(知识点:电机驱动电路的反馈电路)
java·经验分享·嵌入式硬件·面试
weixin_468466857 小时前
树莓派32位与64位系统安装teamviewer远程软件
linux·单片机·自动化·树莓派·远程控制·vnc·teamviewer