STM32之TIM编码器接口
创始人
2025-06-01 21:06:24

 

编码器简介:

 

例子讲解:正交编码器有两个输出,一个A相,一个B相,AB接口输出正交信号。然后接入STM32的定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减,比如初始化之后,CNT初始值为0,然后编码器右转,CNT就++,右转产生一个脉冲,CNT就加一次,比如右转产生10个脉冲(上升沿或者下降沿)之后,停下来,那么这个过程CNT就由0自增到10,停下来,编码器右=左转,CNT--,左转产生一个脉冲,CNT减一次,比如编码器再左转产生5个脉冲,那就在原来10的基础上自减5,停下来。
这个编码器接口,其实就相当于是一个带有方向控制的外部时钟,它同时控制这CNT的计数时钟和计数方向,这样的话,CNT的值就表示了编码器的位置,如果我们每隔一段时间取一次CNT的值,再把CNT清零,是不是每次取出来的值就表示了,编码器的速度,由上一篇笔记中的测频法和测周法的知识,这个编码器就是测频法测正交脉冲的频率,CNT计次然后每隔一段时间去一次计数值,只不过这个编码器接口更加高级,它能根据旋转方向,不仅可以自增计次,还可以自减计次,是一个带方向的测速
编码器接口资源比较紧张,如果一个定时器被配置成编码器接口模式,那它基本上就干不了其他的活了(如STM32F103C8T6只有4个定时器,所以最多只能接4个编码器),如果编码器不够用的话就要考虑一下资源够不够用,也可通过使用EXTI外部中断这就是用软件资源弥补硬件资源
每个定时器的CH3和CH4不能接编码器
 

正交编码器:

 

用正交信号的好处:

a、正交信号精度更高,因为A、B相都可以计次,相当关于计次频率提高了一倍

b、其次正交信号可以以抗噪声,因为正交信号两个信号必须是交替跳变的,可以设计一个抗噪声电路,如果一个信号不变,另一个信号连续跳变,也就是产生了噪声,这时计次值是不会变化的

编码器接口的设计逻辑:

首先把A相和B相的所有边缘,作为计数器的计数时钟,出现边缘信号时就计数自增或自减,增还是减由另一相的高低电平决定。

 

编码器接口有使用CH1和CH2的输入捕获滤波器和边沿检测(高低电平是否反转,也就是TI,T2是否反相),编码器接口没有使用后面的是否交叉、预分频器、CCR寄存器与编码器接口无关

编码器接口的输出部分:相当于从模式控制器,去控制CNT的计数时钟和计数方向

注:在这里,我们并不会使用72M内部时钟和在时基单元初始化设置的计数方向,因为此时计数时钟和计数方向都处于编码器接口托管的状态,计数器的自增和自减手编码器控制

编码器接口基本结构示意图

 

 整体工作模式:

 

注:1、正转的状态都向上计数,反转的状态都向下计数

        2、一般选择第三个模式(在TI1和TI2上计数),精度高

 

实例讲解以及正交信号抗噪声原理:

TI1和TI2都不反向

 

TI1反相,TI2不反相(相当于把T1的信号取反再依据表格里的规则进行计数)

 若发现正转自减、反转自增,则应该把某个极性反相,就能反转计数方向,或者TI1\TI2调换

 

编码器接口测速实验


1、功能:每隔一段时间去计数值,就能得到编码器旋转的速度
        向右旋转:计数为正,想左旋转,计数为负,大小均为速度

        现在:通过定时器的编码器接口,自动计次(节约软件资源)

        之前:触发外部中断,在中断函数中自动计次

原理图:

 

步骤:

第一步:RCC开启时钟,开启GPIO和定时器的时钟

第二步:配置GPIO,PA6和PA7配置成输入模式

第三步:配置时基单元,预分频器选择不分频,自动重装,一般给最大65535,只需要给CNT执行计数即可

第四步:配置输入捕获单元(只有滤波器和极性两个参数)

第五步:配置编码器接口模式(调用库函数)

最后,调用TIM_Cmd开启定时器

电路初始化后,CNT会随着编码器旋转而自增自减
若想测量编码器的位置:直接读出CNT即可
测量编码器的速度和方向:需要每隔一段固定的闸门时间,取出一次CNT,然后再把CNT清零,这是测频法测量速度,需要用到定时器功能。


 

 

4、代码:

Encoder.c

#include "stm32f10x.h"                  // Device headervoid Encoder_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);  //设置默认值TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //这里的上升沿不代表上升沿有效,仅仅代表高低电平极性不反转。TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //这里的上升沿不代表上升沿有效,仅仅代表高低电平极性不反转。TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);//编码器接口配置TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//TIM_EncoderMode_TI12:根据TI1FP1和TI2FP2边的计数//TIM_ICPolarity_Rising:这里的上升沿不代表上升沿有效,仅仅代表高低电平极性不反转。Rising:极性不反转TIM_Cmd(TIM3, ENABLE);
}int16_t Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIM3);  //读取计次值TIM_SetCounter(TIM3, 0);   //清零计次值return Temp;
}

 Timer.c(1秒触发一次中断)

#include "stm32f10x.h"                  // Device headervoid Timer_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2, ENABLE);
}/*
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
*/

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"int16_t Speed;int main(void)
{OLED_Init();Timer_Init();Encoder_Init();OLED_ShowString(1, 1, "Speed:");while (1){OLED_ShowSignedNum(1, 7, Speed, 5);}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){Speed = Encoder_Get();TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

相关内容

热门资讯

网上说的sm是啥意思,sm指的... 网上说的sm是啥意思目录什么是SM?sm指的什么分别指的什么 什么是SM?SM是指“性施虐癖”(S)...
怎么查自己电脑宽带的余额,联通... 怎么查自己电脑宽带的余额目录怎么查自己电脑宽带的余额联通怎么查宽带余额?怎么查电脑宽带里剩下多少钱如...
什么叫潮汐和潮汐能 极速百科网... 什么叫潮汐和潮汐能目录什么叫潮汐和潮汐能什么叫潮汐和潮汐能潮汐能是什么?什么叫潮汐和潮汐能什么叫潮汐...
借呗额度为什么会降低,支付宝借... 借呗额度为什么会降低目录借呗额度为什么会降低支付宝借呗降额原因有哪些蚂蚁借呗额度怎么降低了 蚂蚁借呗...
河南豫剧边玉洁多大了,河南豫剧... 河南豫剧边玉洁多大了目录河南豫剧边玉洁多大了河南豫剧边玉洁多大了(河南豫剧边玉洁的老公)边玉洁的介绍...
大轮毂薄胎和小轮毂厚胎哪个比较... 今天给各位分享大轮毂薄胎和小轮毂厚胎哪个比较好?总结一下它们各自...的知识,其中也会对汽车轮毂大轮...
北奔汽车怎么样(北奔属于哪个集... 今天给各位分享北奔汽车怎么样的知识,其中也会对北奔属于哪个集团进行解释,如果能碰巧解决你现在面临的问...
世界全部山脉高度排名,世界十大... 世界全部山脉高度排名目录世界全部山脉高度排名世界十大山脉排名世界前三的高的山脉分别是什么?世界十大山...
蚺怎么读(红尾蚺怎么读) 蚺怎... 本篇文章极速百科给大家谈谈蚺怎么读,以及红尾蚺怎么读对应的知识点,希望对各位有所帮助,不要忘了收藏本...
车载清洗汽车机好用吗(汽车清洗... 本篇文章极速百科给大家谈谈车载清洗汽车机好用吗,以及汽车清洗机器对汽车有好处吗对应的知识点,希望对各...
锐志2.5v马力多少匹?(锐志... 今天给各位分享锐志2.5v马力多少匹?的知识,其中也会对锐志25功率进行解释,如果能碰巧解决你现在面...
...列车时刻表查询,从大理到... 今天给各位分享...列车时刻表查询,从大理到丽江高铁火车最新消息的知识,其中也会对大理到丽江的高铁票...
天赋异禀什么意思,天生异禀是什... 天赋异禀什么意思目录天赋异禀什么意思天生异禀是什么意思天赋异禀是什么意思?天赋异禀是什么意思?禀字拼...
个人宣言简短,个人宣言简短有哪... 个人宣言简短目录个人宣言简短个人宣言简短有哪些?有什么可以作为座右铭,简洁有力的句子,用以激励自己求...
关于叶圣陶的资料(关于叶圣陶的... 本篇文章极速百科给大家谈谈关于叶圣陶的资料,以及关于叶圣陶的资料了解到了什么对应的知识点,希望对各位...
国徽的由来和象征意义(国徽的由... 今天给各位分享国徽的由来和象征意义的知识,其中也会对国徽的由来和象征意义100字进行解释,如果能碰巧...
夜天子第二季什么时候播,夜天子... 夜天子第二季什么时候播目录夜天子第二季什么时候播夜天子第二部什么时候播出CLANNAD的第二季什么时...
玄武岛怎么去,天龙玄武岛镜怎么... 玄武岛怎么去目录玄武岛怎么去天龙玄武岛镜怎么去天龙八部里的玄武岛到怎么走天龙八部里面的玄武岛,即圣兽...
绝世武神修为分为哪几个境界,绝... 绝世武神修为分为哪几个境界目录绝世武神修为分为哪几个境界绝世武神修为分为哪几个境界 绝世武神修为境界...
下线车是什么意思(下线车是什么... 今天给各位分享下线车是什么意思的知识,其中也会对下线车是什么意思可以买吗进行解释,如果能碰巧解决你现...
如何用usb连接音响,笔记本如... 如何用usb连接音响目录如何用usb连接音响笔记本如何连外置音箱?电脑音响怎么连接到电脑上?如何用u...
怎么在qq上设置密码锁,如何设... 怎么在qq上设置密码锁目录怎么在qq上设置密码锁如何设置qq密码锁怎么在登QQ设置密码怎样给QQ设置...
1英镑等于多少人民币,1英镑多... 1英镑等于多少人民币目录1英镑等于多少人民币1英镑多少人民币一英镑等于多少人民币100英镑等于多少人...
织围巾怎么收针(织围巾怎么收针... 本篇文章极速百科给大家谈谈织围巾怎么收针,以及织围巾怎么收针教程对应的知识点,希望对各位有所帮助,不...
2023中国国际商用车展(武汉... 本篇文章极速百科给大家谈谈2023中国国际商用车展(武汉车展)展览会时间表,以及武汉商用车展延期对应...
新鲜羊睪丸怎么做好吃,新鲜羊睪... 新鲜羊睪丸怎么做好吃目录吃羊睾丸害处 吃羊睾丸的功效作用新鲜羊睪丸怎么做好吃?羊睾丸叫什么菜名 吃羊...
重庆大学弘深学院如何,重庆大学... 重庆大学弘深学院如何目录重庆大学弘深学院如何重庆大学弘深班计算机怎么样通过本科评估的三本学校会怎么样...
标准正态分布表怎么使用,标准正... 标准正态分布表怎么使用目录标准正态分布表怎么使用标准正态分布表是如何使用的?请问:标准正态分布表的使...
斯巴鲁翼豹sti是后驱吗(斯巴... 本篇文章极速百科给大家谈谈斯巴鲁翼豹sti是后驱吗,以及斯巴鲁翼豹wrc对应的知识点,希望对各位有所...
矩阵的2次方怎么求,三阶矩阵的... 矩阵的2次方怎么求目录矩阵的2次方怎么求三阶矩阵的2次方怎么求题对2求一个矩阵次方怎么运算?如何计算...