NUCLEO-F302R8 BEMFのAD変換 PWMと同期

前回、ソフトウェアのトリガでAD変換を行うプログラムを作成しました。

今回はTIM1 PWMのOFFタイミングと同期してAD変換を行うプログラムを実装します。

リファレンス

AD変換タイミング

PWMのOFFタイミングでAD変換を行います。電流を流さない相でAD変換を行うことで、正確なBEMFを測定できます。

ただし、OFFタイミングといっても、ONからOFFの立下りではなく、OFFからONの立上りでAD変換のトリガを出力します。ONからOFFの立下りだと、BEMFと一緒にPWMの立下りもAD変換結果に含まれしまったためです。

AD変換結果はAD変換の完了割込みで読み出します。

AD変換タイミング

AP: Figure 6. BEMF sampling at end of PWM OFF

HW構成

モータドライバーボードの製品シートに記載されているBEMFの回路図です。

BEMF回路

  • BEMFは10KΩと2.2KΩの抵抗により分圧されます。2.2KΩはGPIO_BEMF(PC9)をHighにすることで無効化できます。
  • BEMFはマイコンポートのPC3,PB0,PA7に接続されています。
  • AD変換のリファレンス電圧はVref-: 0V, Vref+: 3.3Vです。

IHM
Page4 BEMF detection - six step
Page5 BEMF six-step

AD変換 HWトリガ(TIM1_TRGO2 event)

TIM1 TRGO2の設定

TRGO2(Triger Output 2)を設定します。

TRGO2にOC1REFCを設定します。OC1REFCにはPWMの設定をしています。

  • TIM1_CR2
    • MMS2: 0011b: Compare Pulse
      • Compare PulseはCC1Fがセットされるタイミングでトリガを出力します。CMSレジスタで立上り、立下りを設定できます。
      • MMS2には以下の記載があり、TRGO2はADCのトリガとして用意されています。
      • These bits allow the information to be sent to ADC for synchronization (TRGO2) to be selected.

      • MMSには以下の記載があり、TRGOはスレーブタイマのトリガです。
      • These bits allow selected information to be sent in master mode to slave timers for synchronization (TRGO)

  • CC1Fのタイミングチャート
    • RM: Figure 167. Center-aligned PWM waveforms (ARR=8)
  • CR2レジスタ
    • RM: 20.4.2 TIM1 control register 2 (TIM1_CR2)

ADCでHWトリガを有効化

ADCのデフォルトはソフトウェアトリガのみで、ADSTARTに1を書き込むとAD変換を開始します。

EXTENを設定することで、HWトリガが有効になります。

EXTSELで使用するHWトリガを選択します。HWトリガはTIMイベントまたは外部ポート(EXTI)を選択できます。

  • ADCx_CFGR
    • EXTEN: 01b: Hardware Trigger with detection on the rising edge
      • HWトリガの立下りエッジをトリガにします。PWMのOFF出力中にAD変換するためです。
    • EXTSEL: 1010b: TIM1_TRGO2 event
      • 前章で設定したTRGO2をトリガにします。

最後にADSTARTに1を設定すると、HWトリガでAD変換が実行されます。ADSTARTが0だとHWトリガは無視されて、AD変換が実行されません。

  • ADCx_CR
    • ADSTART: 1b
      • HWトリガでAD変換を実行します。ADSTPに1を設定するまで、ADSTARTは1のままです。
    • ADSTP: 1b
      • HWトリガによるAD変換を止める場合はADSTPに1を設定します。ADSTARTが0になります。

RM: 15.3.18 Conversion on external trigger and trigger polarity (EXTSEL, EXTEN, JEXTSEL, JEXTEN)

EOC(AD変換の完了による割込み)の設定

EOCの割込みを設定して、割込みでAD変換結果を読み出します。

AD変換の割込みはベクターテーブルのPositon = 18です。

RM: 13.1.3 Interrupt and exception vectors

  • NVIC_ISERx
    • SETENA[18]: 1b
      • Armのレジスタです。AD変換の割込みを有効にします。
      • PM: 4.3.2 割込みセット・イネーブル・レジスタ(NVIC_ISERx)

  • ADCx_IER
    • EOCIE: 1b
      • EOCの割込みを有効にします。

startup.sに定義しているベクターテーブルにAD変換結果を読み出す割込みハンドラを登録します。

コード

今回の対応をコミットしたリビジョンです。

https://github.com/ohmusso/NUCLEO-F302R8/commit/3e58f4e5804c2d03b63b257a6bdcff01dc3fc6f2

動作確認

1step(U: High, V: Low, W: High-Z)だけPWMを駆動させて、W相のBEMFを測定した結果です。

測定結果

下の動画のように、手でモータを回転前の位置に戻し、PWM出力でコイルの磁界に引っ張られてモータが回転した時のAD変換結果を確認をしました。

次回

  • 各ステップでBEMFを測定して、フィードバック制御を行います。