STM32F407 增量型编码器 计数不准

2019-12-16 22:35发布

STM32F407采用TIM2-5编码器计数模式脉冲计数不准。

1.电路已经做了差分信号传输-AM26LS31/32;
2.预分频设置对采样精度有什么影响?
3.(边沿计数,向上计数)大约1个小时候能明显看出1度到2度的积累误差,从哪里下手考虑?
4.溢出也考虑过了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
38条回答
中星讯达
1楼-- · 2019-12-17 02:49
//STM32F407ZGT6
//部分设置贴出来,大家讨论讨论
下面的两条语句谁明白?
1.  TIM_ICInitStructure.TIM_ICFilter = 6;
2. TIM_EncoderInterfaceConfig(TIMx, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
static void Encoder_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
       
//        #ifdef TIM2_ON
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOB, &GPIO_InitStructure);       
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_TIM2);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_TIM2);

//        #endif
       
//        #ifdef TIM3_ON
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);

//        #endif       
       
//        #ifdef TIM4_ON
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
       
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);

//        #endif

}

char EncoderConfig(TIM_TypeDef* TIMx, uint16_t TIM_Period, uint16_t TIM_Prescaler)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;


  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  
  TIM_TimeBaseStructure.TIM_Prescaler =TIM_Prescaler-1; // No prescaling
  TIM_TimeBaseStructure.TIM_Period = TIM_Period-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
  
  TIM_EncoderInterfaceConfig(TIMx, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
       
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;
  TIM_ICInit(TIMx, &TIM_ICInitStructure);
  
  // Clear all pending interrupts
// TIM_ClearFlag(TIMx, TIM_FLAG_Update);
// TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);

        //TIM_UpdateRequestConfig( TIM7, TIM_UpdateSource_Regular);  ²éÒ»²é
  
  TIM_Cmd(TIMx, ENABLE);
       
       

        return 0;
}
中星讯达
2楼-- · 2019-12-17 06:15
brumby 发表于 2015-11-18 14:11
计数值溢出了吧? 应该还有个处理的,在毫秒中断中比较计数器的值(上次和本次的值),推断编码器的方向, ...

这个考虑过了,我计数到60000是重新装载的,EncoderConfig(TIM2, 60000, 1);       
下面是得到一个编码器的值的过程

NextCnt = TIM_GetCounter(TIM2);
                        Cnt = NextCnt - LastCH1Cnt;
                        if(Cnt>30000)
                        {
                                Cnt -= 60000;       
                        }
                        else if(Cnt<-30000)
                        {
                                Cnt += 60000;       
                        }

                        LastCH1Cnt = NextCnt;

                        CH1EncoderCnt += Cnt;
中星讯达
3楼-- · 2019-12-17 07:28
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 0x0f;
  TIM_ICInit(TIMx, &TIM_ICInitStructure);
滤波设置很重要,现在测试4小时来回正弦运动2HZ两度约2*1000*4(线)*5.5(传动比,或8.6)/360,肉眼分辨不丢了。明天测试下高速运转状态下结果。
话说回来,谁知道这个滤波是如何算的?看懂下面连接的,回复下,这个滤波还是很重要的。
http://wenku.baidu.com/link?url= ... nJDXgngm7b7fhMJUiY3
中星讯达
4楼-- · 2019-12-17 07:53
 精彩回答 2  元偷偷看……
Flyback
5楼-- · 2019-12-17 10:01
编码器换向频繁吗
中星讯达
6楼-- · 2019-12-17 15:31
频繁,这个编码器模式应该对这个反向做处理了把?

一周热门 更多>