The Negligible Lab

Astray in the forest of electrical and electronic circuits. Adrift in the gap between time and frequency domains. 独立独歩を是とする。

ブラシレスDCモータのホールセンサ付き120°通電制御

はじめに

モータ制御への思い

交流電動機の可変速制御──。私のごく個人的な思いに過ぎませんが,そう,それこそがパワエレの本家本元ではないでしょうか。 パワーエレクトロニクスを学び,(ある程度)実践してきた私ですが,モータ制御を理解していないことに後ろめたさを感じております。交流電動機の可変速制御を勉強したいとの思いはあったのですが,ついぞ,今年に入るまで,自堕落な数年間を過ごしてしまっていました。 とは言いながら,机上で教科書を勉強するのみで,モータを実際に触らないとなると,深い理解は得られないだろうとも思っていました。

機は熟す

一方,ARMマイコンC++言語で便利にプログラミングできる「Mbed」というクラウド開発環境が2009年にARMよりリリースされ*1,それに対応する各種マイコンボードがNXPやSTMicroelectronicsより売り出されるようになりました。国内でも秋月電子通商をはじめとして,各種の店舗や通販から容易に入手できるようになっています。

os.mbed.com

また,CQ出版社より,NXPのマイコンLPC1114/301を搭載した超小型のマイコンボード「MARY基板」を付録とする書籍[1]が2011に出版されました。私も2014年にMARY基板を使った温度・湿度・気圧ロガー,通称「MARY気象台」を作り,プログラムをMbedで作って遊んでいました*2

f:id:s-inoue2010:20201109033442j:plain:w480
図1: 通称MARY気象台

そんな中,STMicroelectronicsより,Mbedに対応した「Nucleo」と呼ばれるマイコンボードに,モータドライバ(三相インバータ)基板と小形のブラシレスDCモータをセットにしたモータ制御開発キットP-NUCLEO-IHM001がリリースされました。

www.st.com

Nucleoは秋月電子通商等でも千数百円で簡単に入手できるマイコン基板ですが,それにインバータとモータが付いても,5,000円前後で買えてしまいます。 さらにこの2020年,このP-NUCLEO-IHM001を用いたモータ制御の解説書として,CQ出版社より書籍[2]が発売されました。 これは勉強する好機かもしれない。また,今の私にはLTspice XVIIという強力な味方も付いています。 同じくCQ出版社よりホールIC等やワイヤハーネスを追加したキットが発売されており,私はそれを購入しました。

f:id:s-inoue2010:20201109035217j:plain:w480
図2: 購入したP-NUCLEO-IHM001

センサレスベクトル制御の理解と実装を目指しますが,本記事ではまず,いわゆるホールセンサ付き120°通電制御を実装して試してみます。 制御プログラムはSTMicroelectronicsの統合開発環境STM32CubeIDEを用いて自分で書くことにしました*3。 しかし…最初に立ちはだかる壁は,制御というよりはモータそのものの原理でした…💦

付属のブラシレスDCモータの回転原理

モータ諸元

STMicroelectronicsのモータ制御開発キットP-NUCLEO-IHM001は,以下の3点のセットです。

  • マイコン基板STM32 Nucleo Board F302R8
  • モータドライバ基板X-NUCLEO-IHM07M1
  • ブラシレスDCモータBR2804-1700KV

このうち,ブラシレスDCモータ(永久磁石同期電動機と呼んでも良いと思います)は,永久磁石のアウタロータを内側のコイルで駆動する方式のものでした。 STmicroelectronicsのホームページでも,本モータのメーカーBall-Running社のホームページでも,データシートを入手できないのですが, 主な諸元は表1のようになっています[2]。

表1: ブラシレスDCモータBR2804-1700KVの諸元

パラメータ
永久磁石ロータ極数14(7極対)
ステータスロット数(ティース数)12
定格電圧11.1 V
定格電流5.6 A
最高回転数18,000 rpm
連続運転回転数*412,540 rpm
直列抵抗0.11 Ω
インダクタンス18 μH
誘起電圧0.4 Vrms/krpm
起動トルク253 gcm

廻らない? 廻る?

表1のように,今回のブラシレスDCモータではステータ12スロット(12ティース),ロータ14極となっております。 ステータの方は1組の三相電流で1組のN極とS極(極対)を作るので,極数としては12スロット / 3 = 4極対 = 8極となりますね。 あれ? ステータとロータで磁極の数が違うけど,どうやって廻るんだろう?

CQ出版社の書籍[2]のp. 65に記載の図9にモータの概略図があるのですが,これをいくら眺めてもまったく分かりませんでした。 そこで,固定子のそれぞれのティースに巻かれている巻線の電流がそのすぐ外側の永久磁石ロータの磁極に及ぼすトルクを描いてみることにしました。図3に結果を示します。

f:id:s-inoue2010:20201110013619p:plain:w450
図3: CQ出版社の書籍[2]のp. 65の図9に注記を追加

図3右中央付近の雲印で示したU相巻線の巻かれたティー*5に注目します。このティースがN極となった場合,すぐ外側の永久磁石ロータはN極とS極の境目なので, うまいことロータを時計方向に回転させるトルクを作ると考えられます。 図4に三相交流電流の概略図を示しますが,U相がプラスの電流のピークであってN極の最大の磁束を作る瞬間,V相とW相はS極でありそれぞれU相の半分の磁束を作るはずです。 そこで,V相とW相は小文字でsと書き入れることにし,同様にすぐ外側の永久磁石ロータに及ぼすトルクを描き入れます。

f:id:s-inoue2010:20201110152707p:plain
図4: 三相交流電流

すると…あれれ…? よく見るとすべてのトルクは打ち消し合ってしまう気がしますね…。これでは廻らないのでは? 最初に注目したU相巻線のティースの正反対側も同じくU相になっており,そのすぐ外側の永久磁石ロータも同じようにN極とS極の境目になっていますが,トルクは…最初に注目したティースが作るものとは…そう,正反対です…。 恐らく,この図は間違っているのではないかと推測しました。

f:id:s-inoue2010:20201110015844p:plain:w450
図5: 図3の巻線構成を変更

インターネットをいろいろ調べたり,Twitterでご助言を頂いたりしましたが,どうやら,ステータ12スロット(12ティース),ロータ14極という構成では,図5のように例えばU相であればすぐ隣にU'相(逆向きに巻いて磁極を逆にしたティース)を設けるような構成とすることで,モータを構成できるとの情報を得ました[3]。また,U相でプラスのピーク電流を迎えた後,図4に示すように,次はW相でマイナスのピーク電流を迎えます。したがって,U-U'の組の隣はW'-Wとし,全体では「U-U'-W'-W-V-V'-U'-U-W-W'-V'-V-」という順序でティースに巻いていくことでステータ巻線を構成します。図3と同じように図5にもトルクを描き入れると…何とほとんどすべてのティースにおいて,永久磁石アウタロータを時計方向に回転させるトルクとなりました。こりゃ行けるぞ!

ホールセンサの位置

CQ出版社の書籍[2]で取り扱っているキットに付属のホールセンサ基板では,3つのホールセンサの間隔を機械角で約17°としています。 これは,永久磁石ロータ側の14極(7極対)の1つの極対を3等分する(つまり,電気角360°を3等分する)ように配置されております。

360^\circ / 7~\mathrm{pole~pairs} / 3~\mathrm{phases} = 17.14^\circ \tag{1}

これもまた,あれれ…だぞ? ホールセンサはステータのティースとティースの間に置くんじゃないの? これで電気角を検出できるのだろうか?

結局,自分でInkscapeで図示して考えることにしました。 モータ断面図を円として描くのは難しいので,平面(直線状)に切り開いた形で検討します。 12と14の最小公倍数である84 mmを全体の長さとして,ロータ側は各極を84 / 14 = 6 mm,ステータ側は84 / 12 = 7 mmの小さな四角形として描いてみました。また,ホールセンサの間隔である機械角17°は,6 × 2 / 3 = 4 mmとなりますね。 このように正確に描いてみると,分からなかったことが見えてきました。

f:id:s-inoue2010:20201111132141p:plain
図6: ホールセンサ,永久磁石ロータ,固定子巻線の位置関係と120°通電制御のシーケンス

図6に示すように,結論から言うと,約17°の間隔をあけた3つのホールセンサで電気角を検出できるようです。 なお,図6では,上から下に時間が進んでいきます。 右端には120°通電制御での三相インバータのスイッチング状態(本記事では「セクタ」と呼びます)も示しています。 このままプログラムを実装すれば,120°通電制御ができそうな気がしてきました🎵 ここで,赤色はN極,青色はS極であり,黄色で塗った部分は,大きなトルクを作ると考えられる箇所です。 真ん中のホールセンサH2がN極を検出するのは,上からセクタ2, 3, 4ですが, 例えばN極がちょうどH2の真下に来るセクタ3の状態では,V相が大きなトルクを作ります。

さらに,図6から言えることは,電気角の1周期(360°)の間に,永久磁石ロータは360° / 7 = 51.4°回転するということですね。 不思議なことに,ステータ側の「12」という数は登場しません。 なるほど…それでCQ出版の書籍[2]にしてもインターネット上の様々な情報にしても,永久磁石ロータ側の極数に注目しても, ステータ側のスロット数やティース数にはあまり注意を払わず,巻線構成を(推測ですが)誤っていても気にならないのですね…。 モータ制御インバータから見れば,U相,V相,W相をその相順である周波数で励磁すれば,ステータ巻線構成に関わらず,その1 / 7の回転数で回転するという訳です。 それにしても,ステータ12スロット,ロータ14極で,モータとして成立することを考え付いた人は天才ではないかと思います。

制御プログラムを作る

ポーリングでホールセンサを監視する単純なアルゴリズム

さて,実はP-NUCLEO-IHM001には工場出荷時に既にモータ制御プログラムが書き込まれています。 私も開封直後にこのプログラムで付属のブラシレスDCモータを廻してみました。 これでは当然面白くないので,自分で制御プログラムを作ることにします。

図6では,インバータの各スイッチング素子*6は,オンしている状態ではオンさせたままであるかのように描いていますが,図6でオンしているスイッチング素子のある2つのレグのいずれか一方をPWMすることで,モータ巻線に印加する電圧を調節することもできます[2]。 ここでは,図6で上側の素子をオンさせているレグ(モータに電流を流し込んでいる相)をPWMすることとし,そのデューティをX-NUCLEO-IHM001が具備する青い可変抵抗器で設定できるようにします。

3つのホールセンサの出力をwhileループ内のポーリングで監視し,その組み合わせをswitch case文で判別して図6の6つのセクタのいずれかを選びます。選ばれたセクタに応じて,U, V, W相の各レグについて,(i) 可変抵抗器で決まるデューティでPWMするか,(ii) 下側の素子をオンさせたままにするか(デューティを0に設定),(iii) そのレグをゲートブロックするか,を決定します。 Nucleoの青いユーザボタンが押されると,インバータのゲートデブロック(DEB)とゲートブロック(GB)を切り替えます。

CQ出版社のキットに付属のホールセンサはMelexis Microelectronic SystemsのUS1881LUAです[2]。このセンサは(今回のような表面実装タイプの場合),S極を感知すると"high",N極を感知すると"low"となる(オープンドレイン出力ですが,基板内で3.3 kΩでプルアップされています)ので,図6における「N極を感知すると"1"になる」という想定と逆になります。そこで,プログラム中でセクタを選択するswitch case文のcaseで0と1を反転させた値と比較・判定するようにしています。

速度や位置を制御しないので,ただこれだけの処理が走るオープンループ制御となりますが,青い可変抵抗器をひねるとPWMのデューティ,ひいては電圧が変わりますので,可変速運転はできるはずです。

また,デバッグ用に,3つのホールセンサで決まる6つのセクタを意図した順序で通っているのかどうか,switch case文の中でNucleoからアナログ出力することにしました。

STM32CubeIDEでの実装

今回はMbedではなく,STMicroelectronics提供の統合開発環境であるSTM32CubeIDEを用いました。 STM32CubeIDEでは,マイコンの各ピンの入出力や割り当てる機能,つまりペリフェラル(周辺回路)の設定を何とGUIでできてしまうのです。 GUIでの設定に従って,使用するペリフェラルの初期化コードを含む「main.c」を自動的に作ってくれます*7。 そのmain.cの中には/* USER CODE BEGIN 3 *//* USER CODE END 3 */等と書かれた箇所があり,モータ制御等ユーザ側の処理をその中に書くことになります。

今回は,マイコン基板Nucleo F302R8とモータドライバ基板X-NUCLEO-IHM001の接続を回路図から読み取り(何故かピン割り当ての資料が見つかりませんでした),

  • インバータの各レグのPWM信号であるIN1, IN2, IN3をTMR1を用いたPWM出力に
  • 同じく各レグのゲートブロック/デブロックを設定するEN1, EN2, EN3をGPIOの出力に
  • ホールセンサからの信号を受け取るH1, H2, H3等をGPIOの入力に
  • セクタの情報を出力するピンをアナログ出力に
  • Nucleo基板上の青いユーザボタンのチャタリング防止処理(定周期スキャン)のため,TMR6の割り込みを有効に

それぞれ設定しました。 また,PWMに使うTMR1はプリスケーラ(分周期)なしで,振幅(カウントアップの最大値)を1,023に設定しました*8。 この場合,クロック周波数は64 MHzですので,カウンタのアップとダウンを考慮すると,キャリア周波数は64 MHz / 1,024 / 2 = 31.25 kHzとなります。

STM32マイコンやSTM32CubeIDE,いやむしろプログラミング全般について私はド素人なので,画面の雰囲気だけお伝えしたいと思います。 図7にペリフェラルの設定風景,図8にwhileループ内の処理の冒頭部を示します。

f:id:s-inoue2010:20201111014605p:plain
図7: STM32CubeIDEでのペリフェラルの設定風景

f:id:s-inoue2010:20201111144057p:plain
図8: main.cのwhileループ内処理の冒頭部

そういえば,STM32CubeIDEではターゲットとしてSTM32マイコン単体としてのSTM32F302R8ではなく,ボードとしてのNucleo F302R8を選択したのですから,図7ではLQFP64パッケージの足ではなく,Nucleoのピンヘッダを表示してくれると良いですね。

実験準備

プラットフォーム

デバッグや予備実験をしているうちに,付属モータのリード線をオシロスコープのプローブで千切ってしまうことがありました。ただでさえ短いリード線を消費(?)してしまうと後々困ります。また,Nucleoもモータも配線で繋がっているだけでブラブラしています。そこで,図9のように,中継端子台を設けてモータのリード線をオシロスコープで直接触らないようにし,また,各部品を別の基板上に固定して実験用のプラットフォームとすることにしました。

f:id:s-inoue2010:20201111140509j:plain:w480
図9: プラットフォーム

なお,付属のブラシレスDCモータにはホールセンサは内蔵されておりません。CQ出版社のキットに含まれている3つのホールセンサを搭載した基板をモータの下部の基板との隙間に配置しています[2]。

オシロスコープとパソコンの接続

モータ制御には直接関係ないのですが,私は10年前に秋月電子通商でお手頃なオシロスコープのOWON PDS5022Sを購入していました。前掲のMARY気象台のデバッグ等でも活躍しています。PDS5022Sには,USBケーブルでパソコンと接続して波形の数値データやオシロスコープ画面の画像データを取得できる機能があります。しかしこの便利な機能を使ったことはありませんでした。何故か──それは,USB type A オス-オスのケーブルが必要だからです! そんなケーブル持ってないよ! 今回は一念発起(というほどでもありませんが),オス-オスのケーブルを入手し,パソコンに接続することにしました。

f:id:s-inoue2010:20201111020619j:plain:w480
図10: お手頃オシロスコープPDS5022Sとパソコンの接続

接続すると,図10のようなイメージになります。なかなか良いですね。

実験結果

回転の様子

今回はオープンループの120°通電制御なので,回転数が何rpmになるのか,やってみないと分からないところがあります。 静止画ではよく分からないので,まずは動画をご覧下さい*9。 なお,直流電源には12 Vではなく9 Vを入力しています。

youtu.be

小さなモータですが,最高回転数ではまるで離陸直前の飛行機のような迫力です。このモータは本来はドローン用とのことですので,プロペラを付ければ本当に飛ぶのでしょう。 あまりに強い回転の反作用で,プラットフォームとして使ったユニバーサル基板が廻り始めています💦 後述のように,最高回転数は約13,000 rpmとなりました。

波形

それでは波形を見てみましょう。 図11, 12はいずれも中速域(PWMのデューティ0.6程度)での波形です。 U相に対してV相が約120°遅れており,正しく回転していることが分かります。

f:id:s-inoue2010:20201111140945p:plain
図11: U相とV相の出力電圧(U-N間,V-N間)実験波形

図12では,V相の出力電圧の代わりに,Nucleo F302R8の唯一のアナログ出力(PA_4)から出力したセクタ信号を測定しました。 想定通りに上り階段状となっており*10,1 ~ 6の各セクタに相当するcase文を通っていることが分かります。 また,U相ではセクタ6, 1において,可変抵抗器で決まるデューティ比でPWM,セクタ2でゲートブロック,セクタ3, 4で下側の素子をオンさせたままにし,セクタ5で再びゲートブロックという一連の流れが読み取れます。 電流測定用のシャント抵抗(0.33 Ω)やL6230自体のMOSFETのオン抵抗がかなり大きいため(モータの巻線抵抗よりも大きい)に電圧降下が見えること,またレグ毎にゲートブロックする瞬間がある等,いわゆる普通のインバータのスイッチング波形とは趣を異にしますね。

f:id:s-inoue2010:20201111141411p:plain
図12: U相出力電圧(U-N間)とアナログ出力したセクタ信号の実験波形

次に青い可変抵抗器を目いっぱいひねった最高回転数の場合を見てみましょう。

f:id:s-inoue2010:20201111142453p:plain
図13: 最高回転数での実験波形

カーソルを用いて,図13のように3周期分の時間を測ってみますと,1.960 ms (= 510.2 Hz)となりました。 これより,ブラシレスDCモータの回転数Nは,

N = 510.2~\mathrm{Hz}  \times 3 \times 60~\mathrm{s/min} / 7~\mathrm{pole~pairs} = 13,119~\mathrm{rpm} \tag{2}

となり,約13,000 rpmに達しました。

LTspiceによるモデル化とシミュレーション

モデルの構築

今回のブラシレスDCモータ駆動システムをLTspiceでモデル化することにしました。 と言うのも,図11 ~ 13に示した波形が妥当なのかどうか,別の切り口から確認したかったためです。

f:id:s-inoue2010:20201111181811p:plain
図14: LTspiceによるインバータ・モータモデル

図14に,LTspiceによるインバータ・モータモデルを示します。モータドライバIC L6230の内蔵パワーMOSFETのオン抵抗RDS(on)は25°Cのtyp.値で0.73 Ωあり,125°Cでは1.18 Ωとなります。環流ダイオードの順電圧降下は,typ.値で1.15 V,max.値で1.3 Vになります。また,前述のように0.33 Ωの電流測定用のシャント抵抗が下側MOSFETと直流リンクの間に挿入されております。 LTspiceではMOSFETのRDS(on) = 1.18 Ωとして模擬し,環流ダイオードの順電圧降下を1.15 Vとして模擬しました。

ブラシレスDCモータ,すなわち永久磁石同期電動機の等価回路はd-q座標系で表現し,三相回路側にd-q座標系からの電流を流す制御電流源,d-q座標系の等価回路側に三相回路からの電圧を印加する制御電圧源を置いてインタフェースとすることにしました。 なお,LTspiceでは電気と信号の区別がなく,全てが電気回路として扱われます。 このため,ブロック図に直接に抵抗器やインダクタがつながっているような一見すると奇妙な回路図/ブロック図でも問題ありません。

機械モデル側ではトルクの式

 T = P_{n} \{K_{e} i_{q} + (L_{d} - L_{q}) i_{d} i_{q} \} \tag{3}

積分して角速度ωm,さらにそれを積分して機械角θm,電気角θeを計算します。 電気角θeは,モータ等価回路のd-q座標系の基準として用います。

また,電気角θeから6つのセクタや3つのホールセンサの"1", "0"の信号を作っています(セクタの信号がホールセンサの信号と独立してしまっています。この作り方は少し失敗しました…)。 インバータのスイッチングは,ホールセンサからの信号に基づいて,実機のプログラムと同じように制御します。 PWMの三角波キャリアの周波数も実機と同じく31.25 kHzとしています。

ここまでモデルを作るのに,思ったより時間は掛かりませんでした。 LTspiceに慣れてきたことと,自作制御ライブラリContrailleが充実してきたためと考えられます。

電気角θeが分かるのであれば,d軸,q軸電流を制御するベクトル制御は,系統連系変換器と同様に可能ではないかとイメージが湧きますね。

零速度からの立ち上げ

さて,モータを静止状態から起動できるのか試してみることにします(コギングトルクや静止摩擦をモデル化できていないので,アルゴリズムの確認だけになります)。 ここではPWMのデューティを0.6に固定しています。

f:id:s-inoue2010:20201111185505p:plain
図15: LTspiceによるモータ起動時のシミュレーション波形

図15にシミュレーション波形を示します。 最上段に示した回転数は,0 rpmからスタートして,200 msの解析時間の終わりにはほぼ10,000 rpmに到達していますね。 電流は最大でも約2.5 Aであり,モータの定格内で運転しています。ただし,モータドライバIC L6230の電流耐量はギリギリかもしれませんね…。 実験では電流を測っていないので,実際どうなのか,今後の検討課題です。

実験との比較(図12 vs. 図16)

図16に時刻t = 98 ms付近の拡大波形を示します。ここではU相の出力電圧(U-N間)とセクタを表す信号のみを抽出しました。また,背景を黒色にしています。

f:id:s-inoue2010:20201111190109p:plain
図16: 時刻t = 98 ms付近の拡大波形

そう! 実験の図12と同じ波形を表示しています! おおぉ…図16は図12にとても近い…🎵

で…でもよく見ると,U相がゲートブロックするセクタ2やセクタ5での電圧の様相が,図12と図16ではかなり異なりますね…。 また,下側MOSFETをオンしたままにするセクタ3,セクタ4での電圧波形の傾きも何だか逆になっている気がします。

この違いについて,何日か考え続けたり,LTspiceで検討してみたりしましたが, もしかすると,ホールセンサの位置や順序が合ってない(そもそも図6の位置に,H1,H2,H3の順序で取り付けられているのか分からない)かもしれないので,それが原因かもしれません。 これ以上考え続けても仕方がないので,いったん先に進み(正弦波駆動に行くか,センサレスでの120°通電制御に行くか…),後から振り返ることにします。

まとめ

ブラシレスDCモータの120°通電制御について,12スロット14極のモータの回転原理,ホールセンサの信号からのセクタ選択とインバータ制御について検討しました。また,Nucleo F302R8用の制御プログラムをSTM32CubeIDEで書き,実際にモータを廻してみました。

本ブログではLTspiceを活用してきましたが,今回もLTspiceでこの実験系を再現するモデルを構築し,挙動を比較しました。 大きな枠では実験とLTspiceは一致したと言えそうですが,波形を細かく見ると,どうも一致しているとは言い難い状況で,これは今後の検討課題です。

さて,今年初めに掲げた「可変速電動機制御を理解する」という目標への最初の一歩を踏み出すことができました😅 浅い理解に基づく拙い記事が続くと思いますが,今後ともよろしくお願い申し上げます。 また,文献[1],[2]の著者の皆さま,モータ制御に関して様々な助言を下さいましたTwitterの各位に感謝申し上げます。

参考文献

  1. 圓山宗智:「2枚入り!組み合わせ自在!超小型ARMマイコン基板」,CQ出版社,2011年,https://shop.cqpub.co.jp/hanbai/books/48/48291.html
  2. 大黒昭宜:「STマイコンで始めるブラシレス・モータ制御」,CQ出版社,2020年,https://shop.cqpub.co.jp/hanbai/books/48/48011.html
  3. Things in Motion: How to model a BLDC (PMSM) motors Kv (velocity constant) and Kt (torque constant) in FEMM

*1:今はさらにMbed OSと呼ばれるRTOSがあって,初期のMbedライブラリ(Mbed OS 2.0)とは区別されているようです。私の知識もアップデートが必要です。

*2:本来はmbedに対応する基板ではありませんが,MARY基板にはNXPのLPC1114/301と接続するUSB-シリアル変換ICが搭載されており,Mbedで作成したプログラムを,別途用意したツールからUSBケーブル経由で書き込むと,プログラムがきちんと動作します。

*3:Mbedに移行するかもしれません。

*4:定義不明。そもそも定格トルクも定格出力も分からない…。

*5:単数ならトゥース(tooth)では…とツッコミたくなりますね💦

*6:図6ではIGBTの記号で描いていますが,X-NUCLEO-IHM001に搭載されているモータドライバIC L6230はもちろんパワーMOSFETを使っています。

*7:かつては,ペリフェラルの設定はCubeMXという独立したツールだったようです。

*8:0から始まるので実質は1,024です。

*9:ここに至るまでのデバッグも長かったです…。

*10:ただし,初期条件に依存するのか起動方法が悪いのか,場合によっては逆回転してしまい,下り階段状になることがあります…。