锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

编码器原理及使用STM32任意位置确定

时间:2021-11-22 23:28:00

车轮地位简直定是在制造小车的过程当中必弗成少的部件,幸亏STM32中包含了硬件的编码器。但应用的过程当中却存在诸多不方便。上面由我逐一道来:

1、编码器道理

甚么是正交?假如两个旌旗灯号相位相差90度,则这两个旌旗灯号称为正交。因为两个旌旗灯号相差90度,是以能够依据两个旌旗灯号哪一个先哪一个起初判别偏向、依据每一个旌旗灯号脉冲数目的几何及全部编码轮的周长就能算出以后行走的间隔、假如再加上定时器的话还能够计算出速率。

2、为何要用编码器

“”

从上图能够看出,因为TI,T2一前一后有个90度的相位差,以是当涌现这个相位差时就暗示轮子旋转了一个角度。但有人会问了:既然都是脉冲,为何不消一般IO中缀?实际上如果是轮子始终失常扭转当然没有题目。子细视察上图,假如涌现了毛刺呢?这便是需求咱们在软件中编写算法举行矫正。因而,咱们就会想到如果有个硬件可以或许处置这类情形那不是挺好吗?

3、STM32编码器

“”

仍是适才那张图,但这时咱们看到STM32的硬件编码器仍是很智能的,当T1,T2脉冲是继续发生的时间计数器加一或减一一次,而当某个接口产生了毛刺或颤动,则计数器计数稳定,也就是说该接口可以或许答应颤动。在STM32中,编码器应用的是定时器接口,经由过程数据手册可知,定时器1,2,3,4,5和8有编码器的性能,而其他没有。编码器输出旌旗灯号TI1,TI2经由输出滤波,边际检测发生TI1FP1,TI2FP2接到编码器模块,经由过程设置编码器的事情模式,即可以对编码器举行正向/反向计数。假如用的是定时器3,则对应的引脚是在PA6和PA7上。依据stmn32手册上编码器模式的解释,有6中组合计数体式格局,见下表。

“”

由此可知,经由过程抉择能够肯定应用定时器的哪类体式格局来得到咱们所要的效果。STM32编码器的应用也异常简略,其基础步调和开辟STM32其余部件的操纵同等,都是关上时钟,设置接口,设置模式,假如要用中缀则关上中缀。详细能够参考如下代码(这里应用的是TIM4,引脚接纳GPIOA 11和GPIOA12):

bool EncodeInit(u8 none1,u32 period){  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;    TIM_ICInitTypeDef TIM_ICInitStructure;    GPIO_InitTypeDef GPIO_InitStructure;  NVIC_InitTypeDef NVIC_InitStructure;  EXTI_InitTypeDef   EXTI_InitStructure;  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//??TIM3??  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//??GPIOA??  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  GPIO_Init(GPIOA, &GPIO_InitStructure);   GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_10);  GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_10);   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);  TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling   TIM_TimeBaseStructure.TIM_Period = 1333;   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);  TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);    TIM_ICStructInit(&TIM_ICInitStructure);    TIM_ICInitStructure.TIM_ICFilter = 10;    TIM_ICInit(TIM4, &TIM_ICInitStructure);  // Clear all pending interrupts  TIM_ClearFlag(TIM4, TIM_FLAG_Update);  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counter  TIM_SetCounter(TIM4,0);  TIM_Cmd(TIM4, ENABLE);      return 0;}

4、编码器的中缀

因为编码器是基于定时器的,以是编码器的中缀实际上便是定时器的中缀啦。也就是说定时器是每隔必定时候加一个数(或减一个数 ),当数抵达预设值时就发生中缀,而编码器是每个无效脉冲就加一个数(或减一个数 ),当数抵达预设值时就发生中缀。若预设值为1000则编码器与定时器中缀分歧的是,当编码器反转时价抵达999发生一次中缀,而当编码器正转抵达0时异样发生一次中缀。在硬件上这两个中缀是无法区别的,这也就造成了有种情形的误判。

5、STM32编码器没有思量的情形

设想一下,假如编码器的预设值为1000,当某次咱们使得编码器正转产生中断后,即时反转则又该怎么办呢?依据下面的说法,这时会发生两次同样的中缀。如果在算法上没有处置的话,极有大概认为是行走了两次正向。但实际上并无。以是这个时间必需连系方历来判别行走的情形(判别偏向应用的是DIR寄存器位)或许在发生中缀后读一次count寄存器位(看看是999仍是0,以此来判别以后的偏向)。惟独上一次为正且这一次异样为正,间隔才是相加的。
详细中缀处置函数代码以下:

void TIM4_IRQHandler(void){    temp=(TIM_GetCounter(TIM4)&0xffff);    if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  {            if(temp==9999)            {                  count--;                if(predir惟独以后一次是负向走,这一次仍是负向走才上传数据                {                    upcount--;                }else{                    predir暗示往负向走                    }            }else if(temp==0)            {              count  ;                if(predir惟独以后一次是正向此次又是正向走才上传数据                {                    upcount  ;                }else{                    predir暗示往正向走                }            }            TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  }else{        #ifdef DEBUG         printf("ENCODE TIMER INTERRUP ERROR! n");    #endif        while(1)        {            ;        }

u32 EncodeGetMileage(u8 none1,u8 none2){        u8 i=0;      temp=(TIM_GetCounter(TIM4)&0xffff);                if(count<0)                {                     temp_mileage=(abs(count)-1)*1000  (1000-temp);                }else{                    temp_mileage=count*1000  temp;                }        } return temp_mileage前往编码器的脉冲个数,一个脉冲相当于125/1333妹妹,这个返回值用于本次里程计较,给总里程用。

每次中缀的次数记载上去而后再把间隔前次中缀共走了多少个脉冲,再把二者相加即可。 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章