秋月で売っている、このロータリーエンコーダーを使って、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 件のコメント:
コメントを投稿