ロータリーエンコーダを読む
エンコーダは'AMT102-V'を使用した。
エンコーダを読むことで移動距離などを計算できる。エンコーダにはA相とB相を用いて回転方向と回転量をアナログ値として読み取ることができるらしい。
マイコンのピンのSPI◯_MISO
とSPI◯_MOSI
の機能を使用していると予想。タイマーのエンコーダモードを使用する。
[プロジェクト名].ioc
-Pinout & Configuration
-Timers
-TIM3
-Mode
-Combined Channels
をEncoder Mode
、Configuration
-Parameter Settings
-Counter Settings
-Counter Period
を8192
、Encoder
-Encoder Mode
をEncoder Mode TI1 and TIT2
に設定。今回はTIM3
を使用した。
printf
を使用する。
main.c
/* USER CODE BEGIN 0 */
int over;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim){
if(htim->Instance == TIM3){
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_IT_UPDATE);
if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3)){
over--;
}else{
over++;
}
}
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
STprintf(&huart2);
HAL_TIM_Encoder_Start(&htim3, TIMCH_ALL);
HAL_TIM_Base_Start_IT(&htim3);
int count;
over = 0;
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
// count = TIM3 -> CNT;
count = (long)(over * 8192) + (long)TIM3 -> CNT;
printf("%d\r\n",count);
HAL_Delay(100);
/* USER CODE END WHILE */
エンコーダの回転量をTIM3 -> CNT
でゲットし表示する。ただ8192
を上回るまたは0
を下回ると8192
から0
にまたは0
から8192
に飛ぶ。
それを解決するためにオーバーフローを検知しその回数を記録しcount
に反映させる。HAL_TIM_PeriodElapsedCallback
関数はオーバーフローが起こった時に実行される関数であるため、そこにオーバーフローの回数を記録する。一回転が8192
であるからover * 8192
で増分を増やす。一回転が8192
であるのはエンコーダのデータシートに記載されていて内部のディップスイッチが1
~4
までが全て0
になっている場合、一回転は2048 * 4
の8192
になると書かれている。
角度を求めてみる
回転量から回転回数や基準からの角度などを求められる。((float)count / 8192) * 360
で1周360°
になる。ただしcount
はもともとint
型なので計算結果を少数にするためにfloat
型にキャスト変換する。また、以下のコードで角度を0°
~360°
にすることで何周しても同じ角度になるようにすることができる。
以下のコード
while(deg > 360){
deg = deg - 360;
}
while(deg < 0){
deg = deg + 360;
}
また、スイッチが押されたらその場所を基準としてそこからの角度を表示できるようにすると良いかもしれない。するとすればover
とTIM3->CNT
をそれぞれ0
にする必要がある。