旋转编码器的使用———基于STM32F103C8T6的定时器4编码器模式

**

ENCODER.h程序

**
system.h的头文件为正点原子的sys.h以及delay.h的整合头文件,
可以拆分为#include "sys.h"和#include “delay.h”

#ifndef  _ENCODER_H
#define  _ENCODER_H

#include "system.h"

#define ENC_SW PBin(1)

void ENCODER_Init(void);			//旋转编码器初始化

int16_t GET_ENCODER_STATE(void);	//获取旋转编码器状态

#endif

ENCODER.c程序

#include "ENCODER.h"

//引脚:
//PB6:CLK		PB7:DT		PB1:SW
#define ENC_TIME			TIM4
#define ENC_RCC_APB_TIME	RCC_APB1Periph_TIM4

#define ENC_RCC_APB_GPIO	RCC_APB2Periph_GPIOB
#define ENC_GPIO_PORT		GPIOB
#define ENC_SW_GPIO_PIN     GPIO_Pin_1
#define ENC_CLK_GPIO_PIN	GPIO_Pin_6
#define ENC_DT_GPIO_PIN		GPIO_Pin_7


void ENCODER_Init(void) 
{
    
    	
	GPIO_InitTypeDef GPIO_InitStructure;
	
    TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
	RCC_APB1PeriphClockCmd(ENC_RCC_APB_TIME,ENABLE); 
	RCC_APB2PeriphClockCmd(ENC_RCC_APB_GPIO, ENABLE);

	
	GPIO_InitStructure.GPIO_Pin = ENC_SW_GPIO_PIN | ENC_CLK_GPIO_PIN | ENC_DT_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(ENC_GPIO_PORT, &GPIO_InitStructure);
	
	
    // PB6 ch1 , PB7 ch2 	
    // TIMxCLK = 36MHZ
	//定时器设置	
    TIM_DeInit(ENC_TIME);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 0xffff;//自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseInit(ENC_TIME, &TIM_TimeBaseStructure);
	
	//编码器模式设置
	//计数模式3,下降沿计数
	TIM_EncoderInterfaceConfig(ENC_TIME, TIM_EncoderMode_TI12,  TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
    TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入
    TIM_ICInitStructure.TIM_ICFilter = 10;//ICx_FILTER;滤波器值
    TIM_ICInit(ENC_TIME, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化定时器
	
	ENC_TIME->CNT = 32768;
	TIM_Cmd(ENC_TIME, ENABLE);
}


int16_t GET_ENCODER_STATE(void)
{
    
    
	int16_t value;
	value = ENC_TIME->CNT - 32768;
    ENC_TIME->CNT = 32768;
	
	return value/4;
}

**

使用程序:

**

int main(void)
{
    
    
	int16_t encoder;
	SysTick_Init(72);	    	 //延时函数初始化
	USART1_Init(115200);
	ENCODER_Init();

	while(1)
	{
    
    
  		encoder= GET_ENCODER_STATE();
		if(encoder>0){
    
    
			printf("编码器正转:  %d\r\n",encoder);
		}
		else if(encoder<0){
    
    
			printf("编码器反转:  %d\r\n",encoder);
		}	
		if(ENC_SW==0){
    
    
			delay_ms(10);
			if(ENC_SW==0){
    
    
				printf("编码器按下\r\n");
				while(0==ENC_SW);
			}
		}
		
		delay_ms(1000);	//延时1000ms
	}
}

**

效果

**
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_50862404/article/details/125245935