—
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 版のクラス化
続けたい方向を教えてくれれば、さらに深掘りしていくよ。