RISC-V
本帖最后由 abcd7471 于 2021-8-12 13:42 编辑
阅读官方文档,发现有个LED控制器,可以输出PWM波形,LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实现亮度和颜色渐变。官方文档如图所示:
通过阅读官方文档可知,欲使用该功能,主要设置3样东西,
1:定时器,指定 PWM 信号的频率和占空比分辨率。
2:绑定定时器和输出 PWM 信号的 GPIO。
3:改变 PWM 信号 输出 PWM 信号来驱动 LED。
焊接一个LED灯连接在GPIO5和GND之间,如图所示:
接下来基于官方的示例工程,创建一个PWM改变LED亮度的工程。首先打开eclipse,然后创建一个工程,把创建的工程默认自带的全部删掉!然后把示例工程ledc_basic的代码全部复制到创建的工程里,如图所示:
阅读此代码,可知,当前设置占空比为50%,如图所示:
根据官方文档指示:调用函数 ledc_set_duty() 可以设置新的占空比。之后,调用函数 ledc_update_duty() 使新配置生效。
有了这个基础之后,就可以调用函数自己编写一些东西,让LED亮度来回改变了,
搞一个while循环,然后再使用vTaskDelay延迟就可以实现了。
核心代码如下:
- void app_main(void)
- {
- // Set the LEDC peripheral configuration
- example_ledc_init();
- while(1)
- {
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 256));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 1024));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 2048));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 3072));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 4095));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 6143));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 8191));
- ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
- vTaskDelay(300 / portTICK_PERIOD_MS);
- }
- }
编辑好代码后,编译,下载如图所示:
下载完成后,就可以看到LED灯亮度一直在循环改变了,效果如视频所示:
更多回帖