stm32---编码器接口(实现测量方向和速度的功能)

图文概述

stm32---编码器接口(实现测量方向和速度的功能)_第1张图片

stm32---编码器接口(实现测量方向和速度的功能)_第2张图片

stm32---编码器接口(实现测量方向和速度的功能)_第3张图片

stm32---编码器接口(实现测量方向和速度的功能)_第4张图片

编码器接口的配置

1. 开启TIM时钟和GPIO配置以及时基单元的配置

宏定义参数

/*选择需要哪个定时器配置*/
#define Timer TIM3

/*选择需要哪个引脚*/
#define Pin1 GPIO_Pin_6
#define Pin2 GPIO_Pin_7

/*选择需要哪个GPIO端口--- GPIOA 或 GPIOB */
#define GPIO GPIOA
	//1.开启APB1外设中的TIM时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	//2.GPIO配置 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入模式
	GPIO_InitStructure.GPIO_Pin = Pin1 | Pin2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO, &GPIO_InitStructure);
	

	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //时钟分频选择1分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数
	/*
		时基单元里每个关键寄存器的参数(以下3个参数)
		计数器溢出频率 --- CK_CNT_OV = CK_PSC / (PSC + 1) / (ARR + 1)
		!!!!!! 预分频器和计数器都有1个数的偏差,所以这里要再减个1 !!!!!!
		!!!!!! 且PSC和ARR的取值范围在0~65535之间 !!!!!!
	*/
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; //ARR自动重装器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC预分频
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器的值(高级定时器才需要)
	TIM_TimeBaseInit(Timer, &TIM_TimeBaseInitStructure);

对GPIO配置时需要确定对应的TIM定时器以及通道1和通道2的引脚号

stm32---编码器接口(实现测量方向和速度的功能)_第5张图片

上面代码对应以下功能的配置

stm32---编码器接口(实现测量方向和速度的功能)_第6张图片

2. 对编码器接口进行配置

/*
	对编码器接口进行配置
		1. Timer --- 选择对应的TIM定时器
		2. TIM_EncoderMode_TI12 --- 选择TI1和TI2都计数
		3. TIM_ICPolarity_Rising --- 通道1选择上升沿即不反相(下降沿即反相--相当于加个非门)
		3. TIM_ICPolarity_Rising --- 通道2选择上升沿即不反相(下降沿即反相--相当于加个非门)
	*/
	TIM_EncoderInterfaceConfig(Timer, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

上面代码对应图中的功能进行配置

stm32---编码器接口(实现测量方向和速度的功能)_第7张图片

3. 开启定时器

	/*启动定时器*/
	TIM_Cmd(Timer, ENABLE);

你可能感兴趣的:(stm32,嵌入式硬件,单片机)