はしもとの自作マウス研修

DCモータを回す – はしもとの自作マウス研修 Part9

はしもとの自作マウス研修

はしもとの自作マウス研修一覧

こんにちは!はしもとです。

前回は、フォトトランジスタを使ってセンサ値を確認しました。
今回はSTM32F446を使って、DCモータの動作確認を行っていきます。
モータ自体は電圧を与えれば回りますが、今回はPWM制御を使ってモータの回転速度を指令していきたいと思います。

使用する部品

マイコン

  • STM32F446
    こちらは、前回のブログから使用しているものと同じです

DCモータ

  • FAULHABER 1717T003SR-3V
    こちらは、DCモータにあらかじめエンコーダも付いています。
    マイクロマウス競技ではよく使用されているモータです。
    こちらのブログを参考にすると、コネクタの各ピンは以下の機能を持っています。

モータドライバ

  • DRV8835

    DRV8835の取扱説明書(https://akizukidenshi.com/download/ds/akizuki/AE-DRV8835-S_20210526.pdf)より抜粋

    1つのモータドライバで2つのモータを制御できるモータドライバです。
    各ピンの機能は以下のとおりです。

    DRV8835のデータシートより抜粋

    データシートによると、モード設定では2種類(IN/IN・PHASE/ENABLE)の信号付与方式が選択できます。下記の動作モードに記載の通り、PHASE/ENABLEモードでは、1つのピン(xPHASE)でモータの方向を決め、もう一つのピン(xENABLE)でその出力の強さを決めることができます。

    製造元の販売ページ(https://www.pololu.com/product/2135/)より抜粋

    一方IN/INモードでは、より細かい制御が可能です。
    下記の表を見て頂くとわかる通り、PHASE/ENABLEモードと大きく異なる点は、 Coast (空転)という状態があることです。
    モータを空転させることで、車体の慣性や摩擦を使い緩やかに加減速できますが、マイクロマウス競技では正確に止まる、走るができたほうが良いと思うので、今回はPHASE/ENABLEモードを使います。

    製造元の販売ページ(https://www.pololu.com/product/2135/)より抜粋

ピン機能を設定

以下の3つのピン機能をSTM32に設定していきます。

  • モータドライバのモード選択
  • モータの回転方向指示
  • モータの回転速度指示

まずモータドライバのモード選択は、GPIOピン(PA9)を使用します。
下記画像のように、PA9をクリック後GPIO_Outputを選択してください。

モータの回転方向指示も同様に、GPIOピン(PB1)を使用します。
最後のモータの回転速度指示のためのピン(PA8)は、PWM制御のために以下のような設定が必要です。

  1. Pinout & ConfigurationからTIM1を選択
  2. Clock SourceをInternal Clockを選択
  3.  Channel1をPWM Generation CH1を選択

画像内の④~⑤については、PWM周波数を設定することでパラメータを決めます。
今回はPWM周波数が1kHzになるように各パラメータを設定します。
PWM周波数の算出式は以下のとおりです。

PWM周波数[Hz] = Clock Source[Hz]/(Prescaler*Counter Period)

まずは、Clock Sourceを設定します。
Clock Configurationを開き、CPUクロック(HCLK)の最大周波数を確認します。
STM32F446は180MHzまで設定できるので、180MHzに設定しました。
そうすると、APB1 Timers Clocksが90MHzに設定されます。さきほどTIM1のClock SourceをInternal Clockに設定したので、上記の式中のClock Sourceは90MHzです。

次に、PrescalerとCounter Periodを設定します。
Prescaler(分周器)はClock Sourceに対する分周です。
何クロックごとにタイマーのCNTをカウントアップするかを設定できます。
Counter Periodは、カウンタ値の上限で、この値を上回るときにカウンタが一周し、値をクリアします。
今回は、Prescalerを90-1、Counter Periodを1000-1に設定しました。

PWM周波数[Hz] = Clock Source[Hz]/(Prescaler*Counter Period) 
        = 90[MHz]/(90*1000)
       = 1kHz

回路

前述したピン機能をもとに配線した結果は以下のとおりです。
モータドライバDRV8835のMODE選択用にNucleoのPA9を指定しました。
また、AIN1、AIN2はそれぞれPB1、PA8に接続しました。

モータドライバの出力側のピンAOUT1、AOUT2はそれぞれモータコネクタの+−につなげています。
モータ電源やロジック電源、GNDは以下のように配線しました。

コード

まず前述したピン機能の設定が終われば、コードを自動生成します。
そして、モータを回すためにmain関数に以下のようにコードを追記します。
使用したHALの関数については、こちらの記事を参考にしてください。

/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOA, Mode_Pin, 1); // モード選択、1だとPhase/Enable Mode
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOB, Direction_Pin, 1); // 回転方向指示
__HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, 100); // デューティー比を設定
HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1);
HAL_GPIO_WritePin(GPIOA, LD2_Pin, GPIO_PIN_SET); //LEDを点灯
HAL_Delay(1000);

HAL_TIM_PWM_Stop(htim1, TIM_CHANNEL_1);
HAL_GPIO_WritePin(GPIOA, LD2_Pin, GPIO_PIN_RESET); //LEDを消灯
HAL_Delay(1000);
/* USER CODE END WHILE */
}

動作確認

最後にNucleoに書き込みすると、動画のようにモータが1秒回って1秒止まるを繰り返すことが確認できました。

まとめ

今回は、以下の内容についてまとめました。

  • 今回使用する部品の紹介
  • STM32にPWM制御に必要なピン機能を設定
  • 配線を済ませ、プログラムを追記・実行することで、PWM制御を使ったDCモータの動作確認ができた

次回は、モータに付いているエンコーダの値を確認しようと思います。
それでは!

参考資料

タイトルとURLをコピーしました