尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

stm32学习19--定时器之编码器

stm32学习19--定时器之编码器 一、简介Encoder Interface编码器接口编码器接口可接收增量正交编码器的信号根据编码器旋转产生的正交信号脉冲自动控制CNT自增或自减从而指示编码器的位置、旋转方向和旋转速度。每个高级定时器和通用定时器都有1个编码器接口两个输入引脚借用了输入捕获的通道1和通道2二、基础原理1、正交编码器信号增量式正交编码器输出A相、B相。正向旋转A先跳变随后B跳变反向旋转B先跳变随后A跳变定时器硬件自动识别相位先后自动增减CNT寄存器无需软件判断方向。2、定时器编码器模式STM32F1系列定时器编码器模式由TIM_EncoderMode配置3种模式模式一TIM_EncoderMode_TI1仅检测TI1边沿只在A相跳变计数模式二TIM_EncoderMode_TI2仅检测TI2边沿只在B相跳变计数模式三TIM_EncoderMode_TI12TI1TI2双边沿都计数4倍频比较常用A、B上升沿下降沿全部触发计数→分辨率x4F103系列只有TIM1/TIM2/TIM3/TIM4支持编码器模式TIM5/TIM6/TIM7不支持。核心逻辑检测到某一相边沿→立即读取另一相此刻电平→根据电平决定CNT1向上计数还是CNT-1向下计数。相对信号的电平指的是TI1FP1对应TI2TI1发生跳变参考信号是TI2电平TI1FP2对应TI1TI2发生跳变参考信号是TI1电平即当TI1FP1出现跳变沿时硬件读取TI2FP2当前电平当TI2FP2出现跳变沿时硬件读取TI1FP1当前电平。举例标准正转时序A↑→B↑→A↓→B↓对照模式三4倍频查表得知A上升沿此时B0低电平→向上计数B上升沿此时A1高电平→向上计数A下降沿此时B1高电平→向上计数B下降沿此时A0低电平→向上计数一圈4次计数即4倍频反转时波形顺序颠倒每次边沿查表都会触发向下计数如下反转时序B↑→A↑→B↓→A↓B上升沿此时A0低电平→向下计数--A上升沿此时B1高电平→向下计数--B下降沿此时A1高电平→向下计数--A下降沿此时B0低电平→向下计数--再举例仅TI1计数TIM_EncoderMode_TI1规则只有A相跳变才计数B相任何变化直接无视。同样正转波形A↑→B↑→A↓→B↓A上升沿此时B0低电平→向上计数B上升沿→忽略不计数A下降沿此时B1高电平→向上计数B下降沿→忽略不计数一个周期只2即2倍频3、工作模式表格注意点1日常一律使用TIM_EncoderMode_TI12模式三4倍频2如果旋转时计数方向反了2种修改方案方案一硬件互换A、B两相接线方案二软件修改TIM_EncodeInterfaceConfig的极性参数翻转TI1或者TI2;3表格前提条件A、B两相不会同时跳变。正常正交编码器本身满足电机干扰出现同时跳变会造成计数误差需要加大输入滤波ICFilter。4、与输入捕获的关系1硬件结构TIM的CHI1、CH2引脚硬件本就是输入捕获通道引脚→滤波器(ICFilter→极性选择(CCxP→TI1FP1/TI2FP2。编码器没有独立的引脚通路需要共用捕获的前端电路。滤波、极性反转、信号选通都是输入捕获的配置寄存器所以都用到TIM_ICInit函数只是不用捕获功能。2配置区别TIM_ICInit只配置信号前端滤波、极性、直通TI只负责把引脚比如TIM3的复用引脚PA6/PA7的原始信号处理成干净的TI1FP1、TI2FP2传给后续编码器逻辑TIM_ICPSC_DIV1在编码器模式下无效赋值1即可。TIM_EncoderInterfaceConfig函数开启编码器计数逻辑定时器内部切换成正交编码器模式不再用输入捕获而是根据A/B相位差自动加减CNT3易混淆关键点普通输入捕获检测边沿存捕获值、进中断测脉冲周期/频率是一套信号预处理模块。编码器模式关闭捕获逻辑只用捕获的信号预处理电路硬件自动累加CNT不需要捕获中断等是一个计数判断模块。5、输入模式选择编码器引脚浮空输入、上拉输入都可以用上拉输入是工程常用方案。浮空电平由外部编码器决定推挽输出编码器最常用自带强高低电平驱动浮空完全适配理论上标准接法。但编码线很长、走线干扰大时悬空易引起杂波误计数内部上拉1编码器NPN集电极开路/OC输出必须用上拉否则静止时引脚电平不确定。2不会改变A/B相的相位先后不影响正反转判断、计数倍率。3兼容性强不会是推挽输出还是开路输出编码器内部上拉均兼容。3抗干扰强线束长、电磁干扰时上拉能固定静态电平减少毛刺导致的多计数。4必须浮空编码器已经外接了上下拉电阻如果再开内部上拉会分压改变电平阈值。三、代码1、Encoder.c文件#include stm32f10x.h void Encoder_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStructure.GPIO_PinGPIO_Pin_6|GPIO_Pin_7 ; GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz ; TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_InitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_InitStructure.TIM_Period 65536-1; TIM_InitStructure.TIM_Prescaler 0; TIM_InitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM3,TIM_InitStructure); TIM_ICInitTypeDef IC_InitStructure; IC_InitStructure.TIM_Channel TIM_Channel_1; IC_InitStructure.TIM_ICFilter 0xF; IC_InitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; IC_InitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; IC_InitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; TIM_ICInit(TIM3,IC_InitStructure); IC_InitStructure.TIM_Channel TIM_Channel_2; TIM_ICInit(TIM3,IC_InitStructure); //编码器模式最终确定极性覆盖上面IC里的极性配置 TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_Cmd(TIM3,ENABLE); } int16_t GetEncoderCounter() { return TIM_GetCounter(TIM3); }2、Encoder.h文件#ifndef __ENCODER_H #define __ENCODER_H void Encoder_Init(); int16_t GetEncoderCounter(); #endif3、main函数#include stm32f10x.h #include Delay.h #include OLED.h #include Encoder.h #include Timer.h int16_t Counter; int main() { OLED_Init(); Timer_Init(); Encoder_Init(); OLED_ShowString(1,1,Counter:); while(1) { OLED_ShowSignedNum(2,1,Counter,5); } } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) SET) { Counter GetEncoderCounter(); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }4、代码补充说明编码器测速一定要有定时中断编码器CNT一直在累加需要固定时间间隔读取计数值、算速度。比如10ms进一次中断本次读CNT500清零CNT代表10ms内编码器走了500个脉冲→换算速度如果不使用定时中断靠while循环读取读取间隔不确定速度算不准。5、干扰毛刺的处理编码器机械触点转动、齿轮咬合、导线受电磁干扰会在正常跳变沿附近出现很多快速高低跳变的杂脉冲即毛刺TIM硬件会把每一次跳变都当成有效计数计数器就会乱跳、多计数、正负来回跳、数值漂。处理方案1、输入滤波ICFilter寄存器TIM_CCMRx,0~15。短接线、干净环境3~5长线、电机旁边干扰大8~15原理连续N个定时器采样时钟都采到相同电平才认定电平真的翻转毛刺因持续时间短采不到稳定电平直接被过滤。采样时钟定时器时钟编码器PSC072MHz。ICF0xF需要连续15个采样周期电平不变才判定电平真的翻转。2、内部上拉浮空输入时毛刺易把悬空引脚电平拉乱内部上拉将引脚电平钳在高电平干扰不容易拉低电平硬件层面减少毛刺产生。3、硬件编码器A/B线用屏蔽线屏蔽层单端接地走线尽量短远离电机电源线、继电器大电流走线引脚并联1000pF小电容到GNDRC滤波吸收高频毛刺。本文完
返回列表