2022年8月9日火曜日

PWMの理解ーーその1:雰囲気ランプ

■ESP32-C3開発ボード

 ESP32-C3LEDコントローラーが持っています。これを使って、簡単に雰囲気ランプ効果ができます。

今回は、ESP-C3-32開発ボードを利用します。下記ようなものです。

赤枠で、開発ボードで一つRGB LEDがあります。次は、このRGB LEDをコントロールしてみます。
■GPIO情報

上図をみると、IO3IO4IO5のいずれもRGB LEDを繋がっています(それぞれはRG、Bです)から、サンプルとして、今回はIO3(赤色)を利用しましょう。

■PWMコントロール
PWMとは、Pulse Width Modulationの略で、波長のような制御を行います。

PWMをコントロールするために、下記設定が必要です:

1、タイマーを配置: のDuty比率を指定する

2、チャネルを配置:PWMデータ出力のGPIO

3、ハードウェアのFadeOn機能を利用し、LEDの明るさを変更する

楽鑫は相応の構造体を提供しました。提供している構造体を利用してやりやすいです。

ledc_timer_config_t  ⇒ タイマー配置用

ledc_channel_config_t ⇒ チャネル配置用

■プログラム

ledcはESP32のLED用高精度PWM機能です。通常のPWMだけでなく、ledc_set_fade_with_timeとledc_fade_startを使えば自動的に指定秒数でfadeしてくれて大変便利。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/ledc.h"
#include "sdkconfig.h"
#include "driver/ledc.h"
#define BLINK_GPIO_R 3
#define BLINK_GPIO_G 4
#define BLINK_GPIO_B 5
#define LEDC_TEST_DUTY 1000
#define LEDC_TEST_FADE_TIME 2000
ledc_timer_config_t   ledc_timer;
ledc_channel_config_t ledc_channel;
void setup() {
  ledc_timer.duty_resolution = LEDC_TIMER_10_BIT; // PWM Duty
  ledc_timer.freq_hz = 1000; // PWM信号の周波数
  ledc_timer.speed_mode = LEDC_LOW_SPEED_MODE; // タイマーモード(低速)
  ledc_timer.timer_num = LEDC_TIMER_0; // タイマー インデックス
  ledc_timer_config(&ledc_timer);
  ledc_channel.channel = LEDC_CHANNEL_0;
  ledc_channel.duty = 0;
  ledc_channel.gpio_num = BLINK_GPIO_R;
  ledc_channel.speed_mode = LEDC_LOW_SPEED_MODE;
  ledc_channel.timer_sel = LEDC_TIMER_0;
  ledc_channel_config(&ledc_channel);
  
  ledc_fade_func_install(0);
}
void loop() {
  ledc_set_fade_with_time(ledc_channel.speed_mode, ledc_channel.channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME);
  ledc_fade_start(ledc_channel.speed_mode, ledc_channel.channel, LEDC_FADE_NO_WAIT);
  vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);
  ledc_set_fade_with_time(ledc_channel.speed_mode, ledc_channel.channel, 0, LEDC_TEST_FADE_TIME);
  ledc_fade_start(ledc_channel.speed_mode, ledc_channel.channel, LEDC_FADE_NO_WAIT);
  vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);
}

■最終結果


 ■RGBを同時コントロールの場合、構造体はこのような実装する

  ledc_channel_config_t ledc_channel[3];
  ledc_channel[0].channel = LEDC_CHANNEL_0;
  ledc_channel[0].duty = 0;
  ledc_channel[0].gpio_num = BLINK_GPIO_R;
  ledc_channel[0].speed_mode = LEDC_LOW_SPEED_MODE;
  ledc_channel[0].timer_sel = LEDC_TIMER_0;
  ledc_channel[1].channel = LEDC_CHANNEL_1;
  ledc_channel[1].duty = 0;
  ledc_channel[1].gpio_num = BLINK_GPIO_G;
  ledc_channel[1].speed_mode = LEDC_LOW_SPEED_MODE;
  ledc_channel[1].timer_sel = LEDC_TIMER_1;
  ledc_channel[2].channel = LEDC_CHANNEL_2;
  ledc_channel[2].duty = 0;
  ledc_channel[2].gpio_num = BLINK_GPIO_B;
  ledc_channel[2].speed_mode = LEDC_LOW_SPEED_MODE;
  ledc_channel[2].timer_sel = LEDC_TIMER_2;
  ledc_channel_config(&ledc_channel[0]);
  ledc_channel_config(&ledc_channel[1]);
  ledc_channel_config(&ledc_channel[2]);

0 件のコメント:

コメントを投稿

シンプルロボットカーセットの使い方

■ マイコン :ESP3266-CH340  シンプルの案として、マイコンは安いESP8266-CH340開発ボードを選びました。該当マイコンもWIFI機能があります。  ドライバーダウンロード場所:    https://sparks.gogo.co.nz/ch340.html...