こんにちは。koraです。
今回は、指示した通りにマウス本体を動かせるようにモータを制御するモジュールを追加します。
CubeMXの設定
左右のモータを制御できるように、2つのPWMを出力できるようにします。使用するタイマをTIM3として、チャンネル1と2をPWM出力に設定します。
PWMのクロックにはAPB1 Timer clockが供給されるらしいので、108MHzになります。
以前使用していたHM-StarterKitでは48MHzで240階調 = 200kHz周期のPWMを出力していました。同じモータとモータドライバを使っているので、周期を同じにするため108MHzで200kHzになるよう539(540階調 – 1)に設定します。
PWMを出力
HALを使ってPWMのパルス幅を変更するには、TIM_OC_InitTypeDefという構造体を使用します。この構造体のメンバPulseに0~539の値を設定してHAL_TIM_PWM_ConfigChannel関数に渡すことで、パルス幅が変わります。
TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); }
設定をするだけではPWM出力が開始されるわけではありません。開始するには以下のHAL_TIM_PWM_Start関数を呼び出します。
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
モータ制御モジュールの追加
指定される目標速度と目標角速度に対して、エンコーダとジャイロで測定される車体の速度と角速度を一致させるよう、モータに掛ける電圧を調整します。単純なPID制御を使って実装しました。
テスト
実際にスラロームの軌道に追従させてみました。あまりなめらかな動きとは言えませんが、一応意図した動作はしてくれているようです。