NUCLEO-F302R8 BEMFのAD変換 PWMと同期
前回、ソフトウェアのトリガでAD変換を行うプログラムを作成しました。
今回はTIM1 PWMのOFFタイミングと同期してAD変換を行うプログラムを実装します。
リファレンス
- マイコンのRM(リファレンスマニュアル)
- マイコンのDS(データシート)
- DS: https://www.st.com/resource/en/datasheet/stm32f302r6.pdf
- マイコンのPin配置やポートの機能一覧、HW特性
- マイコンのPM(プログラミングマニュアル)
- モータドライバーボードの製品シート
- IHM: https://www.st.com/resource/en/data_brief/x-nucleo-ihm07m1.pdf
- マイコンとの接続が分かる回路図
- センサーレス制御のアプリケーションノート
AD変換タイミング
PWMのOFFタイミングでAD変換を行います。電流を流さない相でAD変換を行うことで、正確なBEMFを測定できます。
ただし、OFFタイミングといっても、ONからOFFの立下りではなく、OFFからONの立上りでAD変換のトリガを出力します。ONからOFFの立下りだと、BEMFと一緒にPWMの立下りもAD変換結果に含まれしまったためです。
AD変換結果はAD変換の完了割込みで読み出します。
AP: Figure 6. BEMF sampling at end of PWM OFF
HW構成
モータドライバーボードの製品シートに記載されている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)
- MMS2: 0011b: Compare Pulse
- 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をトリガにします。
- EXTEN: 01b: Hardware Trigger with detection on the rising edge
最後に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になります。
- ADSTART: 1b
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)
- SETENA[18]: 1b
- ADCx_IER
- EOCIE: 1b
- EOCの割込みを有効にします。
- EOCIE: 1b
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を測定して、フィードバック制御を行います。