每个定时器的CH1和CH2引脚可以用来接编码器测速
计数正转都是向上计数,反转都是向下计数
这三组计数模式
我们把上面的表对应下面来看,一般我们使用第三种模式再TI1和TI2计数,因为这种计数模式比较精确。
TI1计数其实就是忽略掉了TI2的状态,只参考TI1的上升下降沿
TI2计数其实就是忽略掉了TI1的状态,只参考TI2的上升下降沿
只有第三种模式是结合了TI1和TI2
需要用到的库函数
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
第一个参数旋转定时器,第二个参数选择编码器模式,第三个参数,通道1的极性,第四个参数,通道2的极性
void Encoder_Init(void)
{
//初始化GPIO
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//配置结构体
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
//传入结构体
GPIO_Init(GPIOA,&GPIO_InitStruct);
//开启APB1时钟 配置时基单元
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//选择时基单元的时钟 注意这里是配置时钟 (我们选择内部时钟)
TIM_InternalClockConfig(TIM3);
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//选择分频一般是1分频
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
//计数模式
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
//接下来三个参数的配置就是时基关键寄存器参数的配置
//周期就是ARR自动重装载器的值
TIM_TimeBaseInitStruct.TIM_Period=65536-1;
//Prescaler是PSC预分频器的值
TIM_TimeBaseInitStruct.TIM_Prescaler=1-1;
//RepetitionCounter是重复计数器的值 高级定时器才有
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
}
//初始化输入捕获单元
void Encoder_get(void)
{
//编码器通道1
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICStructInit(&TIM_ICInitStruct);//赋初值
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//通道
TIM_ICInitStruct.TIM_ICFilter=0xf;//滤波器
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//作为编码器接口给上升沿代表不反向
//TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器
//TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;//触发信号从哪个引脚输出
TIM_ICInit(TIM3,&TIM_ICInitStruct);
//编码器通道2
TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;//通道
TIM_ICInitStruct.TIM_ICFilter=0xf;//滤波器
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//作为编码器接口给上升沿代表不反向
//TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器
//TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;//触发信号从哪个引脚输出
TIM_ICInit(TIM3,&TIM_ICInitStruct);
//编码器函数配置TIM_ICPolarity_Rising:代表不反向
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
//开启定时器
TIM_Cmd(TIM3,ENABLE);
}
uint16_t Get_TIM_Count(void)
{
uint16_t num= TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3,0);
return num;
}
使用这个的好处就是不用阻塞主程序就可以测量编码器的旋转速度
江协科技笔记1