2

STM32F4DISCOVERY ボードの直交エンコーダ入力に TIM4 を使用しようとしています。これが私のコードです:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);

/* Configure the timer */
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

/* TIM4 counter enable */
TIM_Cmd(TIM4, ENABLE);

悲しいことに、エンコーダーを回しても TIM4->CNT カウンターが動きません。私はTIM8で完璧に動作します。動作する TIM8 と動作しない TIM4 の完全なコードは次のとおりです: https://gist.github.com/nraynaud/5082298

エンコーダーを手で動かした後、gdb で rT2() を出力して確認します。

4

3 に答える 3

4

STM32F407 を使用して、3 つの光学式エンコーダーからエンコーダー カウントを読み取りました。ChibiOS RTOSを使っているのでSTペリフェラルライブラリのタイマー構造体とはタイマー構造体が若干異なりますが、基本的には同じ情報です。実際のタイマーのレジスタを構成する方法は次のとおりです。

stm32_tim_t * encoderTimers[3] = {STM32_TIM8, STM32_TIM3, STM32_TIM4};
for (auto timer : encoderTimers) {
  timer->SMCR = 3;          // Encoder mode 3
  timer->CCER = 0;          // rising edge polarity
  timer->ARR = 0xFFFF;      // count from 0-ARR or ARR-0
  timer->CCMR1 = 0xC1C1;    // f_DTS/16, N=8, IC1->TI1, IC2->TI2
  timer->CNT = 0;           // Initialize counter
  timer->EGR = 1;           // Generate an update event
  timer->CR1 = 1;           // Enable the counter
}

また、RCC の APB1 または APB2 レジスタでタイマー ペリフェラルを有効にしてください。何かのようなもの:

RCC->APB1ENR |= ((1 <<  2)  // TIM4  --  Front wheel angle measurement
             |   (1 <<  1));// TIM3  --  Steer angle measurement

最後に、GPIO 設定が正しく構成されていることを確認する必要があります。これは、代替機能用に GPIO を構成することを意味します。

于 2013-05-15T22:48:21.850 に答える
2

外部抵抗を使用する場合やエンコーダに電源を供給する場合を除き、入力にプルアップを使用する必要がある場合があります。私は通常、エンコーダーをグランドに接続し、内部プルアップを使用してアイドル状態を設定します。

于 2013-04-20T20:01:54.200 に答える