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 */
セミナーテキストを引用
©STマイクロエレクトロニクス株式会社
タスク:次の手順を実行するシーケンスコードを作成
1、Start 5 秒間で最大 6000rpm に到達する起動ランプ
2、Stay 5 秒間、 6000rpmをキープして、その後モータが停止
3、Wait 5 秒後、前の始動ランプで反対向きに動き出す
4、Stay 5 秒間、 6000rpm をキープして、その後モータが停止
5、Wait 5 秒、以前のすべてのポイントを何度も繰り返す
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 */
起動させると、上の動作をすると思います。
注意:モーターが動作しても影響がない場所で動作させてください。
スイッチで動くプログラムへ
正直、ちょっとうるさいので、スイッチを押すと、動作するプログラムにしてみましょう。
(チャタリング対策等入っておらず時々暴走します)
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
/* 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 */
起動させます。
スイッチを押すまで、何も起こりませんが、スイッチを押すと、モーターが回り始め、正方向、一時停止、逆方向に回った後、終了します。
また、スイッチを押すと、同じ動きをします。
回転中にスイッチを押すと停止し、再度スイッチを押すと、元の状態から1サイクルし終了します。
なお、暴走した場合は、スイッチを押すと、停止します。
ダメな時はリセットボタンを押してください。