こんにちは!はしもとです。
前回は、フォトトランジスタを使ってセンサ値を確認しました。
今回は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制御のために以下のような設定が必要です。
- Pinout & ConfigurationからTIM1を選択
- Clock SourceをInternal Clockを選択
- 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モータの動作確認ができた
次回は、モータに付いているエンコーダの値を確認しようと思います。
それでは!