编码器代码书写思路
1.RCC时钟声明
2.GPIO初始化
3.时基单元的配置。其中ARR配置为最大值65535
4.对输入通道进行配置
5.对编码器接口初始化
6.TIM_Cmd()
一、新函数学习
TIM_EncoderInterfaceConfig()定时器编码器接口配置
参数2:编码器模式,选择使用TI1、TI2、TI12一起使用三种模式对应此图,一般使用TI12同时计数
参数3和4就是通道1、2的上升或下降沿,效果与普通输入捕获的相同
二、编码器接口测速初始化程序
GPIO初始化阶段,需要使用PA6与PA7两个引脚,另外对于输入模式,需要根据外部输入来判断使用,外部外部模块默认输出的是高电平则使用上拉输入,默认输出低电平则使用下拉输入。如果不知道外部电路选输出高低电平或者,则使用浮空输入
时基单元部分,预分频器给0(即是不分频),ARR给65536-1(即最大值),输入模式被编码器接管失效
输入捕获单元,编码器只使用了滤波器与边沿检测极性,可以使用TIM_ICStructInit()来初始化捕获单元的各个通道。捕获单元的边沿选择不代表只实现上升沿检测,而是代表不翻转,而下降沿表示翻转(对应上一节的一种输出波形展示出两种方向)。另外,调用TIM_ICInit之后,就已经将函数写入硬件中了,所以无需再次定义结构体,可以直接初始化通道2的模式
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_ICInit(TIM3,&TIM_ICInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInitStruct.TIM_ICFilter = 0xF;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInit(TIM3,&TIM_ICInitStruct);
使用新函数,EncoderInterfaceConfig的上升沿会覆盖ICInit的上升沿
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
最后使用TIM_Cmd结束初始化
三、其他辅助函数的编写
实现输出时呈现正负号的值
int16_t Encoder_GetCounter(void)
{
return TIM_GetCounter(TIM3);
}
但是为了实现测速的效果,可以结合主程序来实现
int16_t Encoder_GetCounter(void)
{
int Counter;
Counter = TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3,0);
return Counter;
}
while (1)
{
OLED_ShowSignedNum(2,1,Encoder_GetCounter(),5);
Delay_ms(1000);
}
效果是一秒内旋转的角度就是输出的编码器速度。设置1s的时间是为了配合手摇的低速,如果选用的是电机等设备,可以将间隔时间调低