初级会员

- 积分
- 60
- 金钱
- 60
- 注册时间
- 2018-9-10
- 在线时间
- 18 小时
|
1金钱
1.TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; /
TIM_TimeBaseStructure.TIM_Period = (ENCODER_PRE*4)-1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
请问ENCODER_PRE表示编码器每转一圈所产生的脉冲数,那么这个脉冲数为什么要乘以4,是因为AB相一个周期会有4个上升下降沿吗?
2.void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) ;
编码器中断服务函数表示溢出中断,也就是码盘每转一圈就会出现一次溢出中断吗?
3.stm32在编码器模式下会自动判断AB相得相位得出旋转方向感从而对CNT进行+1或者减1吗?
4.void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) ;
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
if ((TIM4->CR1 & 0x10) ==0x00)
{
Overflow1++;
}
if ((TIM4->CR1 & 0x10) ==0x10)
{
Overflow1--;
}
}
}
考虑正反转的话,在中断处理函数中就要判断是向上溢出还是向下溢出,因此需要读CR1寄存器的方向位进行判断?
5.脉冲数=【溢出事件数*(编码器线数*4)+定时器当前计数值】/4
pluse=(Overflow*((ENCODER_PRE*4)-1)+TIM_GetCounter(TIMx))/4;
这样计算脉冲数对吗?
烦请大神吗答疑了,小弟感激不尽!!!
|
最佳答案
查看完整内容[请看2#楼]
https://blog.csdn.net/wang328452854/article/details/50579832
这篇博客里面讲解的很清除
|