STM32单片机 定时器 编码器接口 编码器接口测速用于电机控制Encoder Interface 编码器接口编码器接口可接收增量正交编码器的信号根据编码器旋转产生的正交信号脉冲自动控制CNT自增或自减从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用定时器都拥有1个编码器接口基本定时器没有编码器接口编码器的两个输入引脚借用了输入捕获的通道1和通道2CH1、CH2CH3和CH4不能接编码器通用定时器编码器结构框图编码器接口基本结构编码器接口根据编码器的旋转方向控制CNT的计数方向编码器正转CNT自增编码器反转CNT自减ARR一般设置ARR为65535最大量程利用补码的特性可以得到负数将6553516位无符号数转换为16位的有符号数65535 -165534 -2 等等正交编码器用于测量位置或带有方向的速度值有两个信号输出引脚A相、B相正转A相提前B相90°反转A相滞后B相90°CNT计数方向与编码器信号的关系仅在TI1计数接收A相信号我们忽略TI2FP2信号相当于B相信号这样精度低了点编码器模式下的计数器操作实例TI1反相即TI1信号通过极性选择时选择的参数是下降沿高低电平反转了。TI1在经过极性选择时可以选择是上升沿有效还是下降沿有效而编码器接口上、下升沿始终有效都需要计次那么在编码器模式下极性选择就不再是边沿的极性选择而是高低电平的极性选择。如果选择上升沿的参数那么信号直通过来高低电平极性不反转。如果选择下降沿的参数那么信号通过非门过来高低电平极性反转。编码器接口测速 代码书写思路1 RCC开启时钟开启GPIO和定时器的时钟GPIO模式可以选择上拉、下拉、浮空如何选择上拉、下拉看接在该引脚的外部模块输出的默认电平如果外部模块空闲默认输出高电平就选择上拉输入默认输入高电平如果外部模块默认输入低电平那就选择下拉输入默认输入低电平和外部模块保持一致防止电平打架。默认高电平是习惯状态。如何判断GPIO模式是否需要配置为浮空输入不确定外部模块输出的默认状态或者外部信号输出功率非常小就尽量选择浮空输入浮空输入没有上拉电阻和下拉电阻影响外部信号浮空输入缺点引脚悬空没有默认电平输入受噪声干扰来回不断跳变2 配置GPIO将要用的接口配置为输入模式不需要定时器内部时钟配置编码器接口会托管时钟编码器接口就是一个带方向控制的外部时钟。3 配置时基单元。计数器模式参数没有用因为计数方向也是被编码器接口托管的。预分频器一般选择不分频。自动重装一般给最大65535-1只需要CNT执行计数就行4 配置输入捕获单元只需要配置滤波器和极性后两个参数没用可以删掉结构体配置不完整为防止结构体中出现不确定值可能造成的问题最好用StructInit给结构体赋初始值加StructInit也是提醒我们结构体没有配置完整。结构体中极性设置为上升沿不是代表上升沿有效因为编码器接口上升沿、下降沿始终有效这里设置的上升沿表示高低电平极性不反转。这里的极性配置会和后面TIM_EncoderInterfaceConfig函数重复配置极性可以删掉。//初始化结构体给结构体赋初始值说明结构体没有完整赋值参数为结构体地址 TIM_ICStructInit(TIM_ICInitStructure);5 配置编码器接口模式/** 定时器编码器接口配置 参数1选择定时器 参数2选择编码器模式 TIM_EncoderMode_TI1 仅在TI1计数 TIM_EncoderMode_TI2 仅在TI2计数 TIM_EncoderMode_TI12 TI1和TI2都计数 参数3、4分别选择CH1和CH2的电平极性 **/ void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);参数2对应的3个模式6 最后调用TIM_Cmd启动定时器CNT会随编码器位置自增自减如果想要测量编码器位置直接获取CNT值即可。如果想测量编码器的速度和方向需要每隔一段固定的闸门时间取出CNT再将CNT清零。