2015年5月16日土曜日

STM32F4 エンコーダ入力


秋月で売っている、このロータリーエンコーダーを使って、STM32のエンコーダー入力を試してみる。

参考にしたのは、以下のサイト。

・ロータリエンコーダによる角度検出
・Encoder Interfaceについて(ちょろまつ製作記)

以下は、STM32F4 discoveryで試したソース。
エンコーダの1クリックで、カウントが2つ変化するのは、B相の立上がりと立下りの両方でカウントしているのだろうか?ちょっとよく分からない。

ソースコードは以下。




// PB4 : encoder input(A)
// PB5 : encoder input(B)
void tim3_encoder_init(void){
    /* GPIOA Periph clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource4 , GPIO_AF_TIM3);
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource5 , GPIO_AF_TIM3);

    /* Configure PA0 PA1*/
    GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* TIM3 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    /* TIM3 encoder mode enable*/
    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI2
         ,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
    TIM_Cmd(TIM3, ENABLE);  


}

int32_t enc1_Read(void)
{
    return TIM3->CNT;
}

void enc1_Clear(void)
{
    TIM3->CNT = 0;
}

int main(void)
{
  /* structure to initialize GPIO */
//  GPIO_InitTypeDef GPIO_InitStructure;
  int32_t enc1_data = 0;

  SystemInit();
  stm32f4_init();

  spi2_init();
  uart2_init(9600);
  tim3_encoder_init();
  enc1_Clear();

  delay(10000);
  printf2("\r\n");
  printf2("SPI test");

  mcp23s17_init(SPI2);
  mcp23s17_wr(SPI2,MCP23S17_IODIRA,0x00);  // GPA output 
  mcp23s17_wr(SPI2,MCP23S17_GPIOA,~0x00);    delay(100000);
  while(1){
   enc1_data = enc1_Read() / 2;
   enc1_data %= 0xFF;
      mcp23s17_wr(SPI2,MCP23S17_GPIOA,(uint16_t)~enc1_data);    delay(1000);
   
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){
      //ボタンが押されて1になっていたら以下を実行
      GPIO_SetBits(GPIOD,GPIO_Pin_13);       // 点灯
   while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0));  // ボタンを放したら以下を実行
   
    }else{
      GPIO_ResetBits(GPIOD,GPIO_Pin_13);     // 消灯
    }
  }
  return 0;
}

0 件のコメント:

コメントを投稿