RISC-V技术论坛
直播中

abcd7471

9年用户 62经验值
擅长:嵌入式技术
私信 关注

【乐鑫ESP32-C3 RISC-V处理器IoT开发板试用体验】输出PWM波形控制LED亮度

本帖最后由 abcd7471 于 2021-8-12 13:42 编辑

  阅读官方文档,发现有个LED控制器,可以输出PWM波形,LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实现亮度和颜色渐变。官方文档如图所示:


微信截图_20210812105846.png

通过阅读官方文档可知,欲使用该功能,主要设置3样东西,

1:定时器,指定 PWM 信号的频率和占空比分辨率。
2:绑定定时器和输出 PWM 信号的 GPIO。
3:改变 PWM 信号 输出 PWM 信号来驱动 LED。

焊接一个LED灯连接在GPIO5和GND之间,如图所示:

微信截图_20210812133643.png
接下来基于官方的示例工程,创建一个PWM改变LED亮度的工程。首先打开eclipse,然后创建一个工程,把创建的工程默认自带的全部删掉!然后把示例工程ledc_basic的代码全部复制到创建的工程里,如图所示:

微信截图_20210812112209.png

阅读此代码,可知,当前设置占空比为50%,如图所示:

微信截图_20210812113216.png

根据官方文档指示:调用函数 ledc_set_duty() 可以设置新的占空比。之后,调用函数 ledc_update_duty() 使新配置生效。
有了这个基础之后,就可以调用函数自己编写一些东西,让LED亮度来回改变了,
搞一个while循环,然后再使用vTaskDelay延迟就可以实现了。

核心代码如下:

  1. void app_main(void)
  2. {
  3.     // Set the LEDC peripheral configuration
  4.     example_ledc_init();

  5.     while(1)
  6.     {
  7.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 256));
  8.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  9.         vTaskDelay(300 / portTICK_PERIOD_MS);

  10.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 1024));
  11.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  12.         vTaskDelay(300 / portTICK_PERIOD_MS);

  13.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 2048));
  14.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  15.         vTaskDelay(300 / portTICK_PERIOD_MS);

  16.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 3072));
  17.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  18.         vTaskDelay(300 / portTICK_PERIOD_MS);

  19.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 4095));
  20.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  21.         vTaskDelay(300 / portTICK_PERIOD_MS);

  22.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 6143));
  23.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  24.         vTaskDelay(300 / portTICK_PERIOD_MS);


  25.         ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 8191));
  26.         ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));

  27.         vTaskDelay(300 / portTICK_PERIOD_MS);

  28.     }

  29. }
编辑好代码后,编译,下载如图所示:

微信截图_20210812120058.png
下载完成后,就可以看到LED灯亮度一直在循环改变了,效果如视频所示:



WeChat_20210812133956

更多回帖

发帖
×
20
完善资料,
赚取积分