モータ制御のためのTIM/ADC設定(STM32・CubeMX編)

①概要

モータ制御をするためには、PWMを出力するだけではなく、ADCで適切なタイミングで状態を読み取る必要があります。
(適当な電圧出力だけでも回りはしますが、”それはモータ制御なのか?…”と問われると違うと思います。)

一例として、以下の画像のようなタイミングで動作させることが、今回の目標です。

画像を説明すると、TIMを利用して、75%,50%,25% DutyのPWMと、100%タイミングで、
ADC用のトリガ信号を出力します。また、このトリガ信号を利用して、ADCを動かしてみます。
“なぜこのタイミングでADCを動作させるか”というと実際の(3シャント方式電流検出の)モータドライバの回路は以下のようになっています。

モータから流れる電流が、橙の丸で囲ったシャント抵抗に流れる電流を測定するには、ローサイド側のMOSFETが下がっている時しか(流れないので)検出できないのです。
そのため、確実にFETがOFFになるタイマ100%時にADCを動作させます。

以下が今回執筆時環境です。

IDE
STM32CubeIDE
Version: 1.2.0
Build: 5034_20200108_0926 (UTC)

CubeMX
Version: 5.4.0

Board
NUCLEO-G431RB

②PWM設定

次のようにPWMを設定します。

TIM1 Mode and Configuration – Mode
Channel1 PWM Generation CH1
Channel2 PWM Generation CH2
Channel3 PWM Generation CH3
Channel4 PWM Generation CH4
と設定していきます。

TIM1 Mode and Configuration – Configuration – Parameter Setting
Counter Setting
  Counter Mode Center Aligned mode 1
Trigger Output(TRGO) Parameters
  Trigger Event Selection TRGO Update Event
  Trigger Event Selection TRGO2 Output Compare(OC4REF)
と設定していきます。

今回は設定しませんでしたが、Prescalerに値を設定するとカウントを分周します。
≒カウント動作が遅くなります。

Counter Period がカウント周期です。
本来はここに10000などの値を設定しますが肝心な箇所なので、
こんなコーダーに任せるよりも自分でソース内に記述したほうがいいよね???
の精神で、今回は後で触ります。

Center Aligned mode1を選ぶことによって、は山のようなカウンタの動作をします。 
(本記事の一番上の画像・Tim Counter参照)

TRGOの設定は、TRGO2にCH4のカウンタ値との比較の出力を出します。
このTRGO2を利用して、今回はADCを動かしていきます。

Break And Dead Time management – BRK Configuration
  設定無し
Break And Dead Time management – BRK2 Configuration
  設定無し
Break And Dead Time management – Output Configuration
  設定無し
Clear Input
  設定無し
Pulse On Compare ( Common for Channel 3 and 4)
  設定無し

PWM Generation Channel 1
  Mode PWM mode 1
PWM Generation Channel 2
  Mode PWM mode 1
PWM Generation Channel 3
  Mode PWM mode 1
PWM Generation Channel 4
  Mode PWM mode 2

PWM Generation ChannelのPulseには、数値を入れることで、TIMのカウントと比較して、カウントよりもPulseの値が大きいときは出力をONにします。
PWM mode2にすることで負論理になります。

こちらも、Counter Periodと同様、ソース内で変更します。覚えておいてください。

TIM1 Mode and Configuration – Configuration – NVIC Setting
すべてにチェックをいれます。

割り込みの設定です。とりあえず使わなくても特に損しないのでチェックを入れておきます。

以上がPWM設定です。次にADCの設定に移ります。

③ADC設定

次のように設定します。

ADC1 Mode and Configuration – Mode
IN1 IN1 Single-ended
IN7 IN7 Single-ended
IN6 IN6 Single-ended

と設定していきます。
図中では、IN2,IN12にもSingle-endedで使っていますが、モータの電流測定は上記3種の予定で、実際には以下のものを観測することを想定しております。
IN1 – モータU相電流
IN7 – モータV相電流
IN6 – モータW相電流
IN2 – VBUS電圧
IN12 – ポテンショメータ出力
(ADC2) IN8 – IC温度出力

なので、今回は駆動用の電流検出のみに目をむけて、ADC1のIN1,7,6のみ説明致します。

ADC1 Mode and Configuration – Configuration – Parameter Settings
ADCs_Common_Settings ~ ADC_Regular_ConversionMode
  設定無し
ADC_Injected_ConversionMode
Enable Injected Conversions Enable
Number Of Conversions 3
External Trigger Source Timer 1 Trigger Out event 2
External Trigger Conversion Edge Trigger detection on the rising edge
Rank 1 Channel Channel 1
Rank 2 Channel Channel 7
Rank 3 Channel Channel 6

とりあえず設定項目が非常に多いので、大切な事だけ書きました。
Injected_ConversionModeは割り込み要求用のADC設定です。
Timer1のTRGO2から、立ち上がりエッジで割り込みがかかり、Ch1,Ch7,Ch6の順に変換します。

この3チャンネルだけはこのようにタイマに連動した割り込みの設定が必要ですが、他のチャンネルはRegular_ConversionModeなどに入れて、適当に使えばよいです。

ADC1 Mode and Configuration – Configuration – NVIC Settings
チェックをいれます。

以上が、ADCの設定の説明でした。
あとは自分が使いたいものを増やしたりして、コードを生成すれば良いです。

コード記述編へ続く。