完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
最近用到编码器控制电机,因为编码器用到了定时器的输入捕获功能,初学时候没有认真去看,这边打算结合代码重新整理一遍。
编码器接口模式 1.选择编码器接口模式的方法是: 如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001; 如果只在TI1边沿计数,则置SMS=010; 如果计数器同时在TI1和TI2边沿计数,则置SMS=011。 通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性; 如果需要,还可以对输入滤波器编程。 两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号; 如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数, 同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。 编码器接口模式—基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计 数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。 在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1和TI2不同时变换 接下来配置一个计数器: ● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1) ● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2) ● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1) ● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2) ● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效). ● CEN=’1’ (TIMx_CR1寄存器,计数器使能) 这个图便是计数器操作的实例,结合表77其实就可以很好地理解为什么能通过TI1和TI2如何来检测编码器前进后退,频率则可以达到测速的效果 AB相的电平和跳变沿决定了CNT的加数和减数。 CNT增计数时: A上升沿,B逻辑低 B上升沿,A逻辑高 B下降沿,A逻辑低 A下降沿,B逻辑高 CNT减计数是: A下降沿,B逻辑低 B下降沿,A逻辑高 B上升沿,A逻辑低 A上升沿,B逻辑高 编码器配置源码如下 void Encoder_Init_TIM2(void) { RCC->APB1ENR|=1<<0; //TIM2时钟使能 RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFFFF00;//PA0 PA1 为编码器的ab相 GPIOA->CRL|=0X00000044;//浮空输入 (这边为什么使用浮空输入暂时不清楚,希望指点) /* 把定时器初始化为编码器模式 */ TIM2->PSC = 0x0;//预分频器 TIM2->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值 65535 TIM2->CCMR1 |= 1<<0; //输入模式,IC1FP1映射到TI1上 TIM2->CCMR1 |= 1<<8; //输入模式,IC2FP2映射到TI2上 TIM2->CCER |= 0<<1; //IC1不反向 捕获发生在上升沿 TIM2->CCER |= 0<<5; //IC2不反向 捕获发生在上升沿 TIM2->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效 TIM2->CR1 |= 0x01; //CEN=1,使能定时器 } TIM2->CCER |= 0<<1; //IC1不反向 TIM2->CCER |= 0<<5; //IC2不反向 从模式控制寄存器(TIMx_SMCR) smcr寄存器的sms位存在几种模式,如下 当sms为111时外部时钟源模式1被选中,计数器可以在选定输入端的每个上升沿 或下降沿计数 例:要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:
选定此模式的方法为:令TIMx_SMCR寄存器中的ECE=1 计数器能够在外部触发ETR的每一个上升沿或下降沿计数。 例:要配置在ETR下每2个上升沿计数一次的向上计数器,使用下列步骤:
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 08:11 , Processed in 0.551369 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号