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