Hobby Lab 趣味のモノ作り実験のサイトです。
部品 プロセッサー他 CH32V 203_test_TIME_Encoder
1 TIMのエンコーダモードを使う
 1.1 ロータリーエンコーダ
 1.1.1 概容
 1.1.2 エンコード出力
 1.1.3 検出方法
 1.1.4 使用するエンコーダ
 1.2 プログラム
 1.2.1 概容
 1.2.2 プログラムの注意事項
2 プログラム

Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735
PrO:オペアンプ  LM324
 LM358
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Old Processor他

1 TIMのエンコーダモードを使う

 1.1 ロータリーエンコーダ

 1.1.1 概容

ロータリーエンコーダは、回転軸の機械的な位置、角度、速度、回転方向を検出し、それを電気信号(パルスなど)に変換するセンサです。
モータの速度制御、ロボットの関節角度検出、産業用機械の精密な位置決めなどに幅広く使用されています。
今回は受信機の周波数設定などに使用してみたいと言うことで確認していきます。

 1.1.2 エンコード出力

インクリメンタル形:

回転に応じてパルスを出力します。回転量や速度を測るのに適していますが、電源を切ると現在位置を忘れてしまうため、起動時に原点復帰が必要です。
今回はこの方式を使います。

アブソリュート形:

回転角に応じた絶対的な「位置データ(コード)」を出力します。電源を切っても現在の位置を保持できるのが特徴です。

 1.1.3 検出方法

今回使用したエンコーダ

光学式:

スリットの入った円板に光を当て、その透過・遮断をフォトセンサで読み取ります。高精度なのがメリットです。

磁気式:

磁石の回転による磁界の変化を読み取ります。油や埃に強く、環境が厳しい場所での使用に向いています。

機械式(接点式):

物理的な接点の開閉で信号を送ります。安価で家庭用電子機器によく使われます。今回のプログラムはこの方式のロータリーエンコーダを使用します。

 1.1.4 使用するエンコーダ

安価なものなので、実際の波形はAとBを比べると信号の幅が多少違っている。光学式ならもっと綺麗な位相波形になっていると思います。右図が確認した波形です。
5年前にRotary Encoder Switch EC11 10個(送料込)で466円でした。

 1.2 プログラム

 1.2.1 概容

ロータリーエンコーダのA、Bの立ち上がり、立ち下がり信号を用いて、正転なら加算、逆転なら減算をするプログラムが考えられるが、TIMのエンコーダモードを使用することによりCPUの負荷を無しにすることができる。
回路としては、ロータリーエンコーダのAをPB6、BをPB7に、CをGNDに接続します。
TIM関係のRemap 一覧表
またこのロータリーエンコーダは軸を押すと接点が閉じるスイッチも付いているので、PB10とGNDに接続します。
このスイッチでエンコーダの値をリセットするプログラムを作成します。
なおTIMのエンコードモードは マニュアルのADTM高度な制御タイマー 14.3.9 または GPTM汎用タイマー 15.3.7 を参照下さい。

 1.2.2 プログラムの注意事項

Remap:

目的の機能を別のピンに変更する時に GPIO_PinRemapConfig を使用するが、今回のPAを他の機器を制御するため、PBにエンコーダを接続したかった。
このためTIM3でPB4,PB5を使用するように設定したが、使用することはできなかった。 なおエンコーダモードは各TIMのCH1とCH2が使用でき、CH3やCH4などでは使用できないので注意下さい。





2 プログラム

エンコーダ値

エンコーダ値は USART1 で情報を送っているので WCH-LinkEエミュレーター の Rx を CH32V203 の PA9 に接続する。

GPIO_Mode_IPU:

エンコーダ信号がオープンコレクタの場合にプルアップ抵抗を有効にします。

TIM_EncoderMode_TI12:

TIM4_CH2の両方を使って1回転あたりのカウント数を4倍にします。
コメントアウトしている _TI1は、2倍にするものです

TIM_ICFilter:

ロータリエンコーダのチャタリング(ノイズ)が多い場合は、この値を大きくすると安定します。

Get_Encoder_Count:

int16_tにキャストすることで、逆回転時に負の値(65535, 65534...)が正しく負の数(-1, -2...)として扱われます。




































更新日 2026/03/21 15:51  管理者 平林 剛Hirabayashi Takeshi