ショウのマイクロマウス研修

ショウのマイクロマウス制作-Part27

ショウのマイクロマウス研修

こんにちはショウです。前回は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が出力できるようになりました。

今回はここまでです。

タイトルとURLをコピーしました