こんにちはショウです。前回はLEDとスイッチの確認をしたので、今回はモータの動作確認をしていきます。
動作確認
走行モータ
モータを動かすためのタイマーのプログラムを準備していきます。レジスタの説明などはPart7に書いてあります。
モータはこの段階でははんだ付けしていなかったので、オシロスコープを使って波形の確認をしていました。
使用しているモータドライバDRV8836には2つの動作モードがありますが、今回はphase-enableモードを使用しています。
phase-enableモードを使用するために、1チャネルあたりPWMを1本、GPIOを1本となり、2チャネル使うので、PWMを2本、GPIOを2本をモータドライバにつないでいます。
MOTがGPIO、PWMがPWMピンです。
phase-enableモードはenableピンがHIGHになるとモータドライバから出力され、phaseピンの入力値で正転、逆転が切替わるようになっています。そのため、phaseピンにGPIO、enableピンにPWMを入力して、モータの回転速度を制御しています。

DRV8836データシートより
ピンはPB3,5をPWMに、PB4,PA15をGPIOに設定しています。
タイマーはTIM2,3を使用しています。duty比を制御するためにCCRレジスタにARRレジスタの以下の値を入れます。そのため、細かく制御するために、Part7よりもARRの値が大きくなるようにPrescalerとARR(Counter Period)の値を変更しています。
CCRの値で直接制御すると直感的に分かりにくいので、関数を作ってduty比を指示するようにしています。
void Set_DutyTIM2(uint16_t duty){ uint16_t compare = (float)duty/1000.0*849.0; if(compare>849){ compare = 849; } LL_TIM_OC_SetCompareCH2(TIM2,compare); }
また、タイマーの初期化をまとめてするためのInit関数を用意して、タイマーのスタートなどの初期化関数をまとめておきます。
初期化するためのLLライブラリ関数はPart7と同じです。
void TIMER_init(void) { //motor LL_TIM_CC_EnableChannel(TIM2, LL_TIM_CHANNEL_CH2); LL_TIM_EnableCounter(TIM2); LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH2); LL_TIM_EnableCounter(TIM3); }
プログラムの準備ができたらInit関数を実行してから適当なDutyをタイマーに与えてみてモータが回転するか確認するか、オシロで波形を確認をします。
吸引ファン
吸引ファンの方も同じように設定します。
吸引ファンはPB9、TIM8で設定しています。
TIM2,3と同じように初期化をしたところ、PWMの出力が発生しなかったので、データシートを確認したところ。TIM8の初期化にはTIM2,3とは別のレジスタの設定が必要な事がわかりました。TIM8にはMOEビットというレジスタが設定されており、LL_TIM_EnableALLOutputsという関数で設定して、TIM8を動作させることができました。
LL_TIM_EnableALLOutputs(TIM8)をInit関数に追加することでPWMが出力できるようになりました。
今回はここまでです。