[Arduino]STM32U585(Arduino UNO Q)で TIM2 ハードウェアエンコーダを使うための技術まとめ

1. ハードウェア構成の基本

STM32U585 は内部の TIM2 を使ってロータリーエンコーダの A/B 相をハードウェアでカウントできる。
エンコーダモード(Encoder Interface Mode)は以下を自動処理する:

  • A/B 相の立ち上がり/立ち下がりの位相判定
  • 方向検出(CW/CCW)
  • 1×/2×/4× カウント
  • ノイズ除去フィルタ
  • カウンタ値の保持(TIMx->CNT)

UNO Q でも STM32U585 の TIM2 を直接利用できる。


2. Arduino UNO Q のピンマッピング(TIM2)

UNO Q のピン配置は Arduino UNO と異なるため、MCU ピンと Arduino ピンの対応を正確に把握する必要がある。

TIM2 のエンコーダ入力に使うべきピンは以下の通り:

| エンコーダ信号 | Arduino ピン | MCU ピン | タイマ機能 |

|—————-|————–|———-|————|

| A 相(CHA) | A0 / D14 | PA4 | TIM2_CH1 |
| B 相(CHB) | D2 | PB3 | TIM2_CH2 |

この 2 本をエンコーダの A/B 相に接続すれば、TIM2 のエンコーダモードが利用可能。


3. Arduino IDE での扱い方

Arduino UNO Q の Arduino Core は TIM2 のエンコーダモードを Arduino API として提供していない。
そのため、Arduino IDE で TIM2 を使うには:

→ STM32 HAL を直接呼び出す必要がある

Arduino IDE では HAL がリンクされているため、スケッチ内で HAL 関数を直接使用できる。


4. GPIO 設定(TIM2 用)

TIM2 のエンコーダモードでは以下の設定が必要:

● PA4(TIM2_CH1)

  • モード:AF_PP
  • プル:NOPULL
  • AF:GPIOAF1TIM2

● PB3(TIM2_CH2)

  • モード:AF_PP
  • プル:NOPULL
  • AF:GPIOAF1TIM2

5. TIM2 の設定(Encoder Mode)

TIM2 をエンコーダモードで動かすための主要設定:

  • EncoderMode = TIMENCODERMODETI12
  • IC1/IC2 Polarity = RISING
  • IC1/IC2 Filter = 0〜15(ノイズに応じて調整)
  • Period = 0xFFFF(16bit カウンタ最大)

6. クラス化したエンコーダドライバ構成

Arduino IDE で扱いやすいように、以下の 2 ファイルに分離:

stm32_enc.h stm32_enc.cpp

● 提供する API

関数 説明
begin() GPIO + TIM2 の初期化
getCount() 現在のカウンタ値を取得
reset() カウンタを 0 にリセット

● スケッチ側は非常にシンプル

`cpp
STM32Encoder enc;

void setup() {
enc.begin();
}

void loop() {
Serial.println(enc.getCount());
}
`


7. ノイズ対策のポイント

エンコーダ入力はノイズの影響を受けやすい。以下を推奨:

  • ICFilter を 3〜10 程度に設定(ケーブル長に応じて調整)
  • 外部プルアップ抵抗(10kΩ)
    ※エンコーダがオープンドレインの場合
  • シールドケーブル使用
  • GND を確実に共有

8. エンコーダの分解能とカウント方式

STM32 のエンコーダモードは 4×カウントが標準。

例:エンコーダが 100PPR の場合
→ 4× で 400カウント/回転

角度計算:

[
\theta = \frac{\text{CNT}}{\text{CPR}} \times 360^\circ
]

速度計算:

[
\omega = \frac{\Delta \text{CNT}}{\Delta t}
]

9. Arduino IDE と Zephyr の違い

項目 Arduino IDE Zephyr
HAL 利用 直接呼び出し可能 CONFIGUSESTM32HALTIM=y が必要
エンコーダ API なし(HAL 直叩き) なし(HAL 直叩き)
設定方法 スケッチ内で完結 DeviceTree + HAL

どちらも HAL を直接使うのが唯一の方法。


10. まとめ

  • UNO Q の TIM2 エンコーダ入力は A0/D14(PA4) と D2(PB3) に確定
  • Arduino IDE では HAL を直接呼び出す必要がある
  • クラス化によりスケッチ側は簡潔にできる
  • ノイズ対策とフィルタ設定が重要
  • 速度・角度計算も容易に拡張可能

必要であれば、次の追加資料も作成できます:

  • 速度計算クラスの追加
  • オーバーフロー補正ロジック
  • TIM2 の割り込み版(高速応答)
  • Zephyr 版のクラス化

続けたい方向を教えてくれれば、さらに深掘りしていくよ。