LoginSignup
1
4

More than 3 years have passed since last update.

STM32  モーター制御 X-Cube-MCSDKを使おう API編

Posted at

STM32  モーター制御 X-Cube-MCSDKを使おう STM32CubeIDE編の続きです。
STM32マイコン体験セミナー(モータ制御編))で最後に触れていたAPIについて説明します。
https://qiita.com/usashirou/items/d8205bee17d12e81b025

資料は以下PDFを参照ください。

4.2 Motor control API

作成したコードにAPIを追加してみます。
\F302-ihm7-motor1\Aplication\User\main.cを開きます。
その中から

while (1)

を探します。

記述する場所は、必ずUSER CODE BEGINとUSER CODE ENDの中にします。

 /* USER CODE BEGIN  */
 /* USER CODE END */

image.png

セミナーテキストを引用
©STマイクロエレクトロニクス株式会社

タスク:次の手順を実行するシーケンスコードを作成

1、Start 5 秒間で最大 6000rpm に到達する起動ランプ
2、Stay 5 秒間、 6000rpmをキープして、その後モータが停止
3、Wait 5 秒後、前の始動ランプで反対向きに動き出す
4、Stay 5 秒間、 6000rpm をキープして、その後モータが停止
5、Wait 5 秒、以前のすべてのポイントを何度も繰り返す

image.png

MC_ProgramSpeedRampMotor1を使用してプログラムを作ります。
MC_ProgramSpeedRampMotor1についてはmc_api.cを参照します。

__weak void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms )
{
    MCI_ExecSpeedRamp( pMCI[M1], hFinalSpeed, hDurationms );
}

MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms )
のhFinalSpeedは6000rpmですがrpmの値は6で割る必要があるため、6000/6=1000となります。
また、時間は1000で1秒です。
よって、hDurationmsは5000ですね。
MC_StartMotor1でモーターを動作させます。
一定時間後に、MC_StopMotor1でモーターを停止します。
停止しないで逆回転すれば、Faultになると思います。

以下プログラムになります

    /* USER CODE BEGIN 3 */
      MC_ProgramSpeedRampMotor1 (6000/6,5000);
      MC_StartMotor1 ();

      HAL_Delay(10000); //delay contains the start up time and 5 second run  10000 ms
      MC_StopMotor1();
      HAL_Delay(5000);

      MC_ProgramSpeedRampMotor1 (-6000/6,5000);
      MC_StartMotor1 ();

      HAL_Delay(10000); //delay contains the start up time and 5 second run  10000 ms
      MC_StopMotor1();
      HAL_Delay(5000);
  }
  /* USER CODE END 3 */

image.png

起動させると、上の動作をすると思います。

注意:モーターが動作しても影響がない場所で動作させてください。

スイッチで動くプログラムへ

正直、ちょっとうるさいので、スイッチを押すと、動作するプログラムにしてみましょう。
(チャタリング対策等入っておらず時々暴走します)

0、スイッチを押されたら以下動作をする
1、Start 5 秒間で最大 6000rpm に到達する起動ランプ
LEDがトグルする
2、Stay 5 秒間、 6000rpmをキープして、その後モータが停止
3、Wait 5 秒後、前の始動ランプで反対向きに動き出す
LEDがトグルする
4、Stay 5 秒間、 6000rpm をキープして、その後モータが停止
5、Wait 5 秒、以前のすべてのポイントを何度も繰り返す

if文を書きます。
もし、スイッチを押したら、動作するとします。
今回スイッチ(B1)がPC13なので、GPIOC, GPIO_PIN_13に
LED(LD2)はPB13なのでGPIOB, GPIO_PIN_13となります。
*B1やLD2と入れてもコンパイルできません。
詳しくは「STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (2)」を参照ください
https://qiita.com/usashirou/items/c49a0b14c1fc6df22e5d

image.png

    /* USER CODE BEGIN 3 */

      if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)==0){
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
      MC_ProgramSpeedRampMotor1 (6000/6,5000);
      MC_StartMotor1 ();

      HAL_Delay(10000); //delay contains the start up time and 5 second run  10000 ms
      MC_StopMotor1();
      HAL_Delay(5000);

      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
      MC_ProgramSpeedRampMotor1 (-6000/6,5000);
      MC_StartMotor1 ();

      HAL_Delay(10000); //delay contains the start up time and 5 second run  10000 ms
      MC_StopMotor1();
      HAL_Delay(5000);
      }
  }
  /* USER CODE END 3 */

image.png

起動させます。
スイッチを押すまで、何も起こりませんが、スイッチを押すと、モーターが回り始め、正方向、一時停止、逆方向に回った後、終了します。
また、スイッチを押すと、同じ動きをします。
回転中にスイッチを押すと停止し、再度スイッチを押すと、元の状態から1サイクルし終了します。
なお、暴走した場合は、スイッチを押すと、停止します。
ダメな時はリセットボタンを押してください。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4