絶賛ひきこもり生活中の中の人です。ひきこもっている間何してたかといえばGT6、Twitter巡回、Youtube再生業といった
STM32で複数のPWMを出そうとする時(唐突)、大体は
if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } while (1) { for (i = 0; i < 100; i++) { __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 100 - i); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 100 - i); } }
みたいにTIMの初期設定→PWMのduty比をテキトーに変えていく感じになりますよね。
まあこれでもいいんですが、CubeMXで設定欄を見ていたら
?
何なんだと、こいつもDMA設定あるのかよ...。
というわけで本題。(今までの前振りの時間を返せ!)
DMAを使ってPWMを吐き出してみましょう。まずはCubeMX側の設定で、TIM本体の設定は同じ。今回はTIM1を使用します。
次はプログラム側での話。どうやらdutyを設定する関数がなくて、PWMスタートとduty比設定が一緒って感じです。(求ム、有識者。コノ辺、ワカラン。)
while (1) { for (i = 0; i < 100; i += 2) { HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *) &i, 1); htim1.State = HAL_TIM_STATE_READY; HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_2, (uint32_t *) &j, 1); htim1.State = HAL_TIM_STATE_READY; HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_3, (uint32_t *) &j, 1); htim1.State = HAL_TIM_STATE_READY; } }
TIM1のStateをいじっているのは、duty比設定用の関数がHAL_TIM_STATE_READYの時のみduty比のセットを行えるため...らしい。
これで動くはず...です...。少なくとも僕のNucleoは動いたんだ...。
おまけ:
CeleronG3900 + 4GB RAM + GTX1060(6GB)って変態構成の自作PCをどうにかしたい(後赤く光るファンを追加したい)
©2018 shts All Right Reserved.