STM32-TIM定时器编码器

2023-12-15 16:27:50

目录

一、编码器接口简介

二、正交编码器

三、编码器框图

四、编码器接口基本结构

五、工作模式(库函数第二个参数)

六、实例

6.1 均不反相

6.2 TI1反相

七、开发步骤

八、编码器库函数

九、实验


一、编码器接口简介

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

二、正交编码器

三、编码器框图

四、编码器接口基本结构

五、工作模式(库函数第二个参数)

六、实例

6.1 均不反相

6.2 TI1反相

七、开发步骤

①RCC开启时钟,开启GPIO和定时器的时钟

②配置GPIO,输入模式

③配置时基单元,不分频,自动重装65535,CNT计数

④配置输入捕获单元,滤波器和极性

⑤配置编码器接口模式

⑥调用TIM_Cmd,启动定时器

八、编码器库函数

//定时器编码器接口

void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

第一个参数:选择定时器

第二个参数:选择编码器模式

第三、四个参数:通道1和通道2的电平极性

TIM_ICPolarity_Rising:不反相

TIM_ICPolarity_Falling:反相

九、实验

编码器接口测速

Encoder.c

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	/*一、RCC开启时钟,开启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;//PA6和PA7输入模式
	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;
	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 Encoder_Get(void)//有符号
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return Temp;
}

Encoder.h

#ifndef __ENCODER_H
#define __ENCODER_H

void Encoder_Init(void);
int16_t Encoder_Get(void);

#endif

mian.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);//观察CNT计数器值的变化情况
	}
}

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

文章来源:https://blog.csdn.net/qq_52902991/article/details/134934838
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。