1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CubeMX+LL APIでSTM32マイコンのPWM出力

Last updated at Posted at 2018-07-07

CubeMX + LL API で TIM1 から PWM 出力が出ない?

 STM32マイコン、はじめました。躓きました。
 あまりメジャーでなさそうな組み合わせの、CubeMXとLL APIでPWM信号を出力しようとしたのですが、まる一日悩んでしまいました。
 結論としては、原因はTIM1が他のタイマと一部異なる設定が必要なことで、LL_TIM_EnableAllOutput関数を呼ぶと(BTDRレジスタのMOEビットを立てると)解決しました。LL APIのサンプルはこの関数を呼んでいないので、もしかするともっと根本的な解決方法があるかもしれません。

(HAL APIだとちゃんとPWM信号を出せるのですが、内部にある大量のif文と引数チェックを見てアレルギーを起こしました。もっと高級なプログラム書く様になったら使います。)

環境

  • STM32F334R8 + ST-Link v2 (Nuculeo Boardのやつ)
  • STM32CubeMX (version 4.26.0)
  • STM32Cube V1.0

CubeMXの設定

image.png

2018-07-08 (4).png

image.png

プログラム

 CubeMXが生成したプロジェクトの main.c 内、下の様に書き加えました。理由はまだ分かっていないのですが、LL_TIM_EnableAllOutputs()関数を呼ばないと、カウンタが動いていてもPWM出力がされないみたいです。

今分かっていること 2018/07/08 タイマ設定用レジスタの一つ、BDTRのMOEビットが間接的な原因になっていると考えています。Referenceでこのビットが出力をOn/Offする機能を持っていることが触れられていま。LL_TIM_EnableAllOutputs()はこのビットを立てる関数です。 この例ではTIM1を使っていたのですが、サンプルではTIM2を使っていたためMOEビットの扱いがよく分からなかったのかもしれません。。こちらの記事に、TIM1とTIM15を特別扱いしなければいけない例がありました。 https://qiita.com/kanehara/items/119b554703bf4273d35b こちらにも有りました。これを見て原因が大分分かったかも。 http://blueeyes.sakura.ne.jp/2017/12/29/729/
main.cの一部
/* USER CODE BEGIN 2*/

LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1);
LL_TIM_EnableCounter(TIM1);

LL_TIM_EnableAllOutputs(TIM1); // これが無いと動かない

/* USER CODE END 2 */

この追加部分は、STM32Cube内のサンプルプログラムを参考にしました。Windowsであれば、
C:\Users\(ユーザ名)\STM32Cube\Repository\(該当するライブラリ)\Projects\(該当するボードやマイコン)\Examples_LL\TIM\TIM_PWMOutput
あたりに入っています。

結論→LL_TIM_EnableAllOutputs()を使うと何故か動く

一応動いた訳ですが...一体何が原因なのか...
もし知っている方がいらっしゃったら、コメントで教えて下さると嬉しいです。僕の睡眠の質が格段にアップします...

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?