マイコン内蔵フルカラーLEDのOSTW3535C1Aの制御について。

HALとCubeMXを使い、PWM出力を生成するためのプログラムを見ていく。CubeMXの設定については前回の記事を見ていただきたい。

プログラムコードは以下のようになる。

  1.     pwm_buf[0] = 3;
  2.     pwm_buf[1] = 7;
  3.     pwm_buf[2] = 7;
  4.     pwm_buf[3] = 3;
  5.     pwm_buf[4] = 0;
  6.     HAL_DMA_Start_IT(&hdma_tim1_ch1,(uint32_t)pwm_buf,(uint32_t)&TIM1->CCR1, 5); // DMAの開始
  7.     __HAL_TIM_ENABLE_DMA(&htim1,TIM_DMA_CC1); // TIM1のDMAを有効にする
  8.     HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); // TIM1のPWM出力の開始

 

バッファには4つ分のパルスのデータを入れており、順に出力されることになる。最後に入れている0については、後述する。

まずDMAを開始する。バッファのアドレス、読み込むサイズを指定している。パルスは4つ分だが、最後の0を読ませるためにサイズは5としている。

PWM出力するタイマに対し、DMAを有効化する。これで、タイマの更新ごとにバッファの内容が読み込まれていくようになる。

そして、PWMの出力を開始する。後は自動的にパルスが出力される。

図が実際の出力をロジアナで見たものである。バッファに入れたデータの順に、パルスが出力されていることがわかる。

ここで注意が必要なのは、バッファから読み込まれる前の最初のパルスとして、あらかじめセットされているパルスが出力されてしまうことである。

上の図の出力では、CubeMXの方で初期値として「0」をセットしているため、余計なパルスが出ていない。

たとえばCubeMXで別の値をセットした例が次の図である。出力したいパルスの前に、余計なパルスが出てしまっていることがわかる。

もう一点、DMAの終了時にも注意が必要である。バッファに入れた最後のデータが読み込まれた後も、PWMの出力は動作し続けている。しかし、データは更新されないため、最後に読み込まれた値のままパルスが出力され続けることになる。

これが、バッファの最後に0を置いている理由である。出力したいパルスの後に0を一つ加えて、それも読み込ませるようにしなければならない。

最後の0を入れず、サイズを4にして実行した場合、図のように、最後に読み込まれたパルスが繰り返される。

まとめ

以上のようにして、任意のパルスを任意の個数で出力することが確認できた。

次は、LEDの制御に必要な実際のパルス列をバッファにセットして、出力する。