|
发表于 2019-2-27 20:47:24
|
显示全部楼层
宏定义:
#if TIM1_ENC_EN
#define TIM1_ENC_GPIO_PORT_CHA GPIOE
#define TIM1_ENC_GPIO_PORT_CHB GPIOE
#define TIM1_ENC_GPIO_CLK_ALL RCC_AHB1Periph_GPIOE
#define TIM1_ENC_CHA_PIN GPIO_Pin_9
#define TIM1_ENC_CHB_PIN GPIO_Pin_11
#define TIM1_ENC_CHA_SOURCE GPIO_PinSource9
#define TIM1_ENC_CHB_SOURCE GPIO_PinSource11
#define TIM1_ENC_CHA_AF GPIO_AF_TIM1
#define TIM1_ENC_CHB_AF GPIO_AF_TIM1
#define TIM1_ENC_TIMER TIM1
#define TIM1_ENC_TIMER_CLK RCC_APB2Periph_TIM1
#define TIM1_ENC_TIMER_IRQCh TIM1_IRQn
#define TIM1_ENC_PPR 2500 //500 number of pulses per revolution
#define MAX_COUNT1_IN_1MS 1000 //encoder1在10ms内可能出现的计数最大值
EncoderData encoder1; //实时记录编码器的总读数
vs32 encoder1_old = 0;
#endif
初始化:
#if TIM1_ENC_EN
//step1 初始化timer & gpio时钟
RCC_APB2PeriphClockCmd(TIM1_ENC_TIMER_CLK, ENABLE); //注意确定是RCC_APB1PeriphClockCmd还是RCC_APB2PeriphClockCmd
RCC_AHB1PeriphClockCmd(TIM1_ENC_GPIO_CLK_ALL, ENABLE);
//step2 设置引脚为浮空输入
GPIO_StructInit( & GPIO_InitStructure);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = TIM1_ENC_CHA_PIN;
GPIO_Init(TIM1_ENC_GPIO_PORT_CHA, & GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TIM1_ENC_CHB_PIN;
GPIO_Init(TIM1_ENC_GPIO_PORT_CHB, & GPIO_InitStructure);
//connect the pins to their Alternate Functions
GPIO_PinAFConfig(TIM1_ENC_GPIO_PORT_CHA, TIM1_ENC_CHA_SOURCE, TIM1_ENC_CHA_AF);
GPIO_PinAFConfig(TIM1_ENC_GPIO_PORT_CHB, TIM1_ENC_CHB_SOURCE, TIM1_ENC_CHB_AF);
//step4 设置成编码器模式 Timer configuration in Encoder mode
TIM_DeInit(TIM1_ENC_TIMER); //ENCODER_TIMER复位
TIM_TimeBaseStructInit( & TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 无分频
TIM_TimeBaseStructure.TIM_Period = (4 * TIM1_ENC_PPR) - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM1_ENC_TIMER, & TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM1_ENC_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //编码器接口初始化
TIM_ICStructInit( & TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
TIM_ICInit(TIM1_ENC_TIMER, & TIM_ICInitStructure);
// Clear all pending interrupts
TIM_ClearFlag(TIM1_ENC_TIMER, TIM_FLAG_Update);
TIM_ITConfig(TIM1_ENC_TIMER, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM1_ENC_TIMER, ENABLE);
encoder1.value = 0;
#endif
/*
* ****************************************************************************************************
* 函数名 : Encoder1_SysTick_ISR
* 描 述 : 该函数算出在单位定时周期内编码器的读数变化
* 输 入 : 无
* 输 出 : 读数变化值
* 调 用 : 需要外部定时调用!比如systick
* ****************************************************************************************************
*/
#if TIM1_ENC_EN
s16 TIM1_ENC_SysTick_ISR(void)
{
static u16 lastCount1 = 0;
u16 currentCount = TIM1_ENC_TIMER->CNT;
s32 tmp = currentCount - lastCount1;
if (tmp >= MAX_COUNT1_IN_1MS) {
tmp -= (4 * TIM1_ENC_PPR) - 1;
} else if (tmp <= -MAX_COUNT1_IN_1MS) {
tmp += (4 * TIM1_ENC_PPR) - 1;
}
lastCount1 = currentCount;
return (s16)tmp;
}
#endif
|
|