0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STM32FでDCブラシレスモーター用のPWMで非駆動時にLを出す方法

Posted at

開発する環境

DCブラシレスモーターを駆動するため、3つのチャンネルをPWMに設定して使います。
マイコンボードはNUCLEO-F302R8、モータドライバ用基板はX-NUCLEOIHM07M1を使います。
CQ出版のサイトから購入しました。
モータードライバICはSTのL6230が搭載されています。
基板、ボリュームのホルダーは3Dプリンタで作りました。
IMG_0305.jpg

L6230で矩形波駆動する場合に必要なPWM信号

下記のように駆動時はPWM波形、非駆動時はLを出す制御が必要です。
簡単に出せそうですが、非駆動時にLを出すことが容易ではありませんでした。

image.png

普通にPWMを設定してみる

PWM信号の生成はSTM32F302のTIM1を使用します。
CH1〜3を使って、3相分の信号を作ります。
スクリーンショット 2025-01-10 11.04.39.png
CH Idle Stateという設定があり、これがきっとPWMを使ってない時の端子の論理なんだろう...と思い、L(Reset)にしました。デフォルトでL(Reset)になってました。

この設定でPWMを動作させるため、HALで定義されている関数を利用します。
CH1を動かすなら下記の通りです。

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);

全体の制御はこんな感じです。
スクリーンショット 2025-01-10 11.11.43.png

時間軸を拡大するとこんな感じ。
スクリーンショット 2025-01-10 11.12.13.png

そう、CH Idle StateをL(Reset)にしても、非駆動時はLになりません
CH1ではなく、CH1Nを使えば非駆動時はLになりますが、相補PWM用に用意されている端子機能です。

X-NUCLEOIHM07M1ではモータードライバICにはCH1/2/3が接続されているため、改造して相補PWM用の反転端子を接続する手段もあります。
が、できれば手を加えたくない...ということで、モータードライバICにあったPWMを作る方法を調べました。

PWM出力端子を非駆動時は強制的にLにする!

PWM用のタイマーを停止すると端子状態はH(Set)になるのは、HALの仕様なのでやむなし。
そこで、タイマーのレジスタを調べると、出力端子を強制的にH、Lにする機能がありました。
CH1とCH2はCCMR1レジスタに、CH3はCCMR2レジスタに端子機能の設定ビットがあります。
これをタイマーを動作させたまま、PWMと強制Lを切り替えれば実現できます。

スクリーンショット 2025-01-10 11.20.27.png
スクリーンショット 2025-01-10 11.21.22.png

相切り替えのタイミングで端子機能を変更してみる

無事実現できました!
タイマーは動作させたままでOKです。
CCMRレジスタの変更だとマイコンが変わった時に移植性が悪いので、専用の関数を作った方が良さそうです。

スクリーンショット 2025-01-10 11.28.49.png

スクリーンショット 2025-01-10 11.29.30.png

参考になるサイト

このサイトで同じ話題が出ていました。
"Idle State" Not Respected after PWM on STM32

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?