STM32F4正交编码器模式使用读取编码器计数

    本人大二学生一枚,寒假在家没事学习一下闭环控制,理论看的头大做点实际的东西放松一下,因此需要搭建一个带反馈的系统,编码器就是一个很好的例子,这里对于编码器的大致原理和使用做一个自己的总结,之前一直是做伸手党,今天也写点东西试试。

    一般的光电编码器都有A相B相,这两根线有什么作用呢?说白了就是编码器转动时每过一定角度A相和B相就分别发出一系列的方波信号,这两道方波信号之间不是同步的,而是相差90°的相位差,转一圈A相(或者B相)发出的方波的个数叫做编码器线数,显然,这个数字越大表明编码器精度越高,。为什么要有一个相位差呢,我们可以根据这个来判断编码器转动的方向。举个例子:

   当A相为上升沿时,B相有两种状态,高电平或者低电平,通过读取B的电平状态就可以确定编码器的转向。这种方法可以通过外部中断实现。

    但是我在这里说的是正交编码器模式,既然32提供了这么好用的东西为什么闲着不用呢2333,话不多说,直接贴代码

void TIM4_EncoderInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef        TIM_ICInitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;    
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
    
    TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
  TIM_TimeBaseStructure.TIM_Period = 65535;         //预装载值,根据配置的计数方式直接设成编码器线数乘一个整数
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
    
  TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
    
    TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 10; 
  TIM_ICInit(TIM4, &TIM_ICInitStructure);
  TIM_ClearFlag(TIM4, TIM_FLAG_Update); 
  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
        
  TIM4->CNT = 0;
  TIM_Cmd(TIM4, ENABLE);
}

亲测能用,但菜鸡能力还是有限,不能对其中更深的原理进行解释,先写下来留着坑,以后再来填。

 

你可能感兴趣的:(单片机学习)