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;
//}
相关推荐
三佛科技-1341638421217 小时前
便携式榨汁机方案开发,榨汁机果汁机MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
yongui4783418 小时前
基于TMS320F28027实现光伏MPPT控制
单片机·嵌入式硬件
炸膛坦客20 小时前
Cortex-M3 内核 MCU-STM32F1 开发之路:(一)单片机 MCU 的构成,包括 FLASH 和 SRAM 的区别,以及引脚类型
stm32·单片机·嵌入式硬件
A9better20 小时前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习
三佛科技-1873661339720 小时前
FT62FC3X 8位MCU单片机选型表,详细解析FT62FC31A/32A/33A/35A/3FA
单片机·嵌入式硬件
充哥单片机设计20 小时前
【STM32项目开源】基于STM32的智能衣柜系统
stm32·单片机·嵌入式硬件
Try1harder21 小时前
极海APM32F107V6 + 合宙Air780E
单片机·嵌入式硬件·物联网·合宙air780
文火冰糖的硅基工坊21 小时前
[嵌入式系统-134]:智能体以及其嵌入式硬件架构
科技·嵌入式硬件·架构·嵌入式·gpu
电鱼智能的电小鱼1 天前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 柔性化吊挂调度方案
网络·人工智能·嵌入式硬件·算法·制造
清风6666661 天前
基于单片机的便携式温湿度检测烘干机设计
单片机·嵌入式硬件·毕业设计·课程设计