打印
[STM32F1]

STM32 定时器TIM1编码器模式下溢无中断

[复制链接]
9347|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chb080042|  楼主 | 2014-7-3 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chb080042 于 2014-7-3 16:34 编辑

请教各位,我在做编码器数据采集时遇到一个问题:
1、TIM1,正交编码数据上溢时有中断,通过CR1->DIR位可以判断为上溢;但是在编码器反转,计数器下溢时,没有中断产生。
2、TIM2没有上述问题,上溢下溢均有中断,通过CR1->DIR可以区分。
代码片段如下:
/*************************定时器配置*********************************/
void TIM_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  
   /* Timer configuration in Encoder mode */
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  TIM_TimeBaseStructure.TIM_Period = 65535;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;
  TIM_ICInit(TIM1, &TIM_ICInitStructure);
  
// Clear all pending interrupts
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM1->CNT = 0;

  TIM_Cmd(TIM1, ENABLE);
  
   /* Timer configuration in Encoder mode */
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  TIM_TimeBaseStructure.TIM_Period = 65535;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
  
// Clear all pending interrupts
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM2->CNT = 0;

  TIM_Cmd(TIM2, ENABLE);
  
}
/*************************NVIC配置*********************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* Enable the TIM1 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  /* Enable the TIM2 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  
}
/*************************TIM1中断程序*********************************/
void TIM1_UP_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//计数溢出中断
  {  
    if( TIM1->CR1 & 0x0010)//向下计数溢出
    {
      y_Counter_plus -= 65536;
    }
    else//向上计数溢出
    {
      y_Counter_plus += 65536;
    }
    TIM_ClearFlag(TIM1, TIM_IT_Update);
  }
}
/*************************TIM2中断程序*********************************/
void TIM2_IRQHandler(void)//50ms
{
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//计数溢出中断
  {  
    if( TIM2->CR1 & 0x0010)//先下计数溢出
    {
      x_Counter_plus -= 65536;
    }
    else//向上计数溢出
    {
      x_Counter_plus += 65536;
    }
    TIM_ClearFlag(TIM2, TIM_IT_Update);
  }
}
沙发
chb080042|  楼主 | 2014-7-3 22:37 | 只看该作者

使用特权

评论回复
板凳
chb080042|  楼主 | 2014-7-5 12:49 | 只看该作者
期待回复啊

使用特权

评论回复
地板
huzi2099| | 2014-7-5 23:18 | 只看该作者
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET
这个判断是不需要的,不过这个应该不影响.
估计还是初始化的哪里不对,具体没看出来.
给你个建议,码盘模式时溢出中断用处不大,因为码盘在转动过程中经常会有丢步的情况特别是在高速转动时,所以转几圈以后可能就不准了,最好还是使用码盘的0位置信号产生回0位置比较可靠.

使用特权

评论回复
5
llyyff1636| | 2016-1-29 13:30 | 只看该作者
应该不会有错误,实际中有没有下溢呢

使用特权

评论回复
6
Double-明| | 2017-4-5 15:57 | 只看该作者
楼主你用的是F1的什么芯片啊?

使用特权

评论回复
7
jschenyao| | 2019-4-29 20:25 | 只看该作者
TIM1为高级定时器TIM_TimeBaseStructure.TIM_RepetitionCounter=0;             //************高级定时器专用***********   
必须加入否则会TIM_RepetitionCounter 初始值不定,TIM1编码器模式下溢无中断就是其中一个不正产现象。
TIM2则不会,供大家参考

使用特权

评论回复
8
caoenq| | 2019-4-30 08:42 | 只看该作者
我以前调试正交编码器的时候也遇到了同样的问题,弄了2天也没找到原因,后来改用了HAL库就好了,最后其实也没找到原因,我怀疑是不是标准库还有隐形的bug,不确定。

使用特权

评论回复
9
821005008| | 2019-6-27 09:41 | 只看该作者
HAL库也有  我这里 DIR 没有 0 1交替变化

使用特权

评论回复
10
waveforms| | 2019-6-27 11:13 | 只看该作者
会不会是TIM0中断模式配置没有弄好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝