**
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
}
}
**
效果
**