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

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

資料は以下PDFを参照ください。
###4.2 Motor control API
https://www.st.com/content/ccc/resource/technical/document/user_manual/group1/48/e6/91/f4/66/ea/48/a1/DM00490980/files/DM00490980.pdf/jcr:content/translations/en.DM00490980.pdf

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

```
while (1)
```
を探します。

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

```
 /* USER CODE BEGIN  */
 /* USER CODE END */
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4d954dad-56ed-e094-b57e-1a6c6d8c408f.png)

セミナーテキストを引用
©STマイクロエレクトロニクス株式会社
###タスク：次の手順を実行するシーケンスコードを作成
１、Start 5 秒間で最大 6000rpm に到達する起動ランプ
２、Stay 5 秒間、 6000rpmをキープして、その後モータが停止
３、Wait 5 秒後、前の始動ランプで反対向きに動き出す
４、Stay 5 秒間、 6000rpm をキープして、その後モータが停止
５、Wait 5 秒、以前のすべてのポイントを何度も繰り返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/05b04c51-694a-da54-0a08-6cdfbe05ccc5.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/45fc65e5-5c7d-0641-c1cc-cede44b6e61f.png)

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

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

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

０、スイッチを押されたら以下動作をする
１、Start 5 秒間で最大 6000rpm に到達する起動ランプ
LEDがトグルする
２、Stay 5 秒間、 6000rpmをキープして、その後モータが停止
３、Wait 5 秒後、前の始動ランプで反対向きに動き出す
LEDがトグルする
４、Stay 5 秒間、 6000rpm をキープして、その後モータが停止
５、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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d29956e8-62d8-ac19-3bd0-934b619a2b19.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ddfa8d3b-ffda-c761-fa0c-c580dc06e778.png)

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