打印
[STM32F1]

stm32正交编码器方向判断

[复制链接]
3676|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quray1985|  楼主 | 2017-10-23 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用stm32F103的正交编码器接收手动脉冲发生器的脉冲,正交编码器计数没有问题,但是我需要知道手脉转动的方向。利用TIM1->CR1 & 0x10或者判断计数值是否是0或者最大值都会有误判存在,大家有遇到这种问题的吗,是怎么解决的?贴出我的代码。还有一个问题是,当计数值计到零,如果这时候不转手脉,计数值就一直为零,那么总是进中断,所以我手动修改计数值,是否我某个地方设置的不对?
void TIM1_UP_IRQHandler(void)
{        
//        uint16_t temp;
        temp = TIM_GetCounter(TIM1) & 0xfff;
        if(temp == 0)
                TIM_SetCounter(TIM1,1);
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
                if(auto_ctr == 1)
                {                       
                        handcctr = handctrScan();
        //                if(temp ==0)//ÊÖÂöÕýת
                        if((TIM1->CR1 & 0x10) == 0)
                        {
                                //if(predir == 1)
                                //{
                                        GPIO_SetBits( GPIOC, GPIO_Pin_11 );//µç»úÕýת
                                        switch(handcctr)
                                        {
                                                case 0x01:
                                                                                TIM_SetAutoreload(TIM2,12); //N = 4800·¢ËÍÂö³å¸öÊý  ÊÖÂöһȦ¶ÔÓ¦µç»ú0.16Ȧ
                                                                                TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
                                                                                TIM_Cmd(TIM2, ENABLE);
                                                                                break;
                                                case 0x02:
                                                                                TIM_SetAutoreload(TIM2,120); //N = 4800·¢ËÍÂö³å¸öÊý  ÊÖÂöһȦ¶ÔÓ¦µç»ú1.6Ȧ
                                                                                TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
                                                                                TIM_Cmd(TIM2, ENABLE);
                                                                                break;
                                                case 0x03:
                                                                                TIM_SetAutoreload(TIM2,1200); //N = 4800·¢ËÍÂö³å¸öÊý  ÊÖÂöһȦ¶ÔÓ¦µç»ú16Ȧ
                                                                                TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
                                                                                TIM_Cmd(TIM2, ENABLE);
                                                                                break;
                                                default:
                                                                                break;
                                        }

                                //}
                                //else
                                //{
                                //        predir = 1;
                                //}
                        }
                        //else if(temp == 400)//ÊÖÂö·´×ª
                        else if((TIM1->CR1 & 0x10) == 0x10)
                        {
                                //if(predir == 0)
                                {
                                        GPIO_ResetBits( GPIOC, GPIO_Pin_11 );//µç»ú·´×ª
                                        switch(handcctr)
                                        {
                                                case 0x01:
                                                                                TIM_SetAutoreload(TIM2,12); //N = 4800·¢ËÍÂö³å¸öÊý  ÊÖÂöһȦ¶ÔÓ¦µç»ú0.16Ȧ
                                                                                TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
                                                                                TIM_Cmd(TIM2, ENABLE);
                                                                                break;
                                                case 0x02:
                                                                                TIM_SetAutoreload(TIM2,120); //N = 4800·¢ËÍÂö³å¸öÊý  ÊÖÂöһȦ¶ÔÓ¦µç»ú1.6Ȧ
                                                                                TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
                                                                                TIM_Cmd(TIM2, ENABLE);
                                                                                break;
                                                case 0x03:
                                                                                TIM_SetAutoreload(TIM2,1200); //N = 4800·¢ËÍÂö³å¸öÊý  ÊÖÂöһȦ¶ÔÓ¦µç»ú16Ȧ
                                                                                TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
                                                                                TIM_Cmd(TIM2, ENABLE);
                                                                                break;
                                                default:
                                                                                break;
                                        }

                                }
                                //else
                                //{
                                //        predir = 0;
                                //}
                        }

                }
   
  }

}


沙发
643757107| | 2017-10-23 14:51 | 只看该作者
论坛搜STM32 正交编码器 就出来一堆例子。

使用特权

评论回复
板凳
wanduzi| | 2017-10-23 15:50 | 只看该作者
可能会循环一周后,然后就这样统计错误了。

使用特权

评论回复
地板
mmuuss586| | 2017-10-23 21:33 | 只看该作者
16的有符号技术;
找个电机带编码器接口的,自己手转下,看下数据规律;
自己写个函数好了

使用特权

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

本版积分规则

156

主题

1488

帖子

5

粉丝