你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32编码器模式计数问题

[复制链接]
wisar 提问时间:2024-9-26 10:38 / 未解决

stm32f103c8t6,编码器模式在keil的debug调试时,手动把编码器的计数器置为一个数500(比如计数器溢出值是4000),然后在在让编码器继续开始输出,此时计数器的计数变为原来正常的两倍了,直到计数器溢出一次就变正常了

收藏 评论3 发布时间:2024-9-26 10:38

举报

3个回答
xmshao 回答时间:2024-9-26 13:57:01
你是使用TIMER作为正交编码计数器吧。


你手动把编码器的计数值设置为500,是指修改TIMx->CNT的值吗? 如果是,


不是很明白你所说的ARR=4000,计数器初始值为500,计数器的计数变为正常的两倍是什么意思?


计数快慢是正常的两倍 还是计数周期变为原来两倍? 另外你的两倍是怎么统计出来的,还是说只是大概感觉?


CNT的确可以手动修改,不过当TIMER对编码信号做向上计数时,如果你给定的初始CNT值比ARR大的话,是会发生


计数器要一直计数到硬件默认满量程,比如16位TIMER的话就是记到0xffff才会调头,不过这个时间段跟正常计数时


间段就未必一定是两倍关系,这点你要注意。
wisar 回答时间:2024-9-26 14:15:02
xmshao 发表于 2024-9-26 13:57
你是使用TIMER作为正交编码计数器吧。

你好是的,我的意思就是CNT设置为500,arr设置为40000,计数速度变为原来的两倍,计数最大值没变,(两倍是我用另一个恩利浦的角度传感器测的),技术速度确实快了两倍,比如应该1s计数增加或减少200,结果增加或减少了400。而且我发现只要计数器计数到4000溢出一次就正常了,我是在编码器停止转动的时候改的CNT的值,而且我发现不在keildebug模式下调试,就正常下进去程序运行的话,不会出现这种情况

这是代码***************************************************/
void ENCODER_Init()
{
//端口配置
RCC->APB2ENR |= 1<<2;                                                                                /*开启PA时钟*/
GPIOA->CRL &= 0x0000FFFF;
GPIOA->CRL |= 0x44880000;                                                                        /*PA6和PA7浮空输入*/
GPIOA->ODR |= 1<<4;
GPIOA->ODR |= 1<<5;
//EXTI配置
RCC->APB2ENR |= 1<<0 ;                                      /*使能io复用时钟*/
AFIO->EXTICR[ 1 ] &= 0xFFF0 ;
EXTI->IMR |= 1<<4 ;                                         /*清除原来的设置*/
EXTI->FTSR |= 1<<4 ;                                        /*下降沿触发*/
MY_NVIC_Init( 2, 2, EXTI4_IRQn, 2 ) ;
//定时器3配置
RCC->APB1ENR |= 1<<1 ;                                                                                /*开启TIM3时钟*/
TIM3->PSC = 1;                                              /*精确度y预分频*/
TIM3->ARR = 39999 ;                                                                                        /*重装值0  65535*/
TIM3->CCMR1 |= 1<<0 ;                                                                                /*输入端IC1映射到TI1上*/
TIM3->CCMR1 |= 1<<8 ;                                                                                /*IC2FP2映射到TI2*/
TIM3->CCMR1 |= 3<<4 ;                                                                                /*输入捕获1滤波器*/
TIM3->SMCR |= 3<<0 ;                                                                                /*编码器模式3:所有的输入均在上升沿和下降沿有效*/
TIM3->DIER |= 1<<6 ;                                                                                /*允许捕获中断*/
TIM3->DIER |= 1<<0 ;                                                                                /*允许更新中断*/
TIM3->CR1 |= 1<<0 ;                                                                                        /*使能定时器3*/
TIM3->CNT = 0;
MY_NVIC_Init( 2, 0, TIM3_IRQn, 2 ) ;                        /*抢占2,子优先级0,组2*/
}
xmshao 回答时间:2024-9-26 14:41:38

wisar 发表于 2024-9-26 14:15
你好是的,我的意思就是CNT设置为500,arr设置为40000,计数速度变为原来的两倍,计数最大值没变,(两倍 ...

哦。

可以肯定,CNT是可以修改的,但它肯定没法影响计数速率,因为计数速率完全由硬件决定的,

即你外部输入脉冲的速率没变,实际计数速率就不会变。

你看看是否哪里计算搞误会了。比方:你现在临时调整了计数初值,并非从0一路自然计数过来的,

在做计算时是否注意到这点了。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版