启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考
提示:啟明智顯專為智能產品提供一站式彩屏顯示+連接+云端服務+APP軟件開發、維護等解決方案,幫廠商快速實現硬件的智能化。作為啟明云端旗下方案公司,我們用心整理了開發小伙伴在開發過程中可能會遇到的問題以及快速上手的簡明教程,同時也用心整理了連接+顯示應用的新方案!希望你能第一時間了解并快速用上好的方案和產品!
參考文獻
https://xuhong.blog.csdn.net/article/details/80417430
https://blog.csdn.net/weixin_43677266/article/details/121694652
PWM叫脈沖寬度調制,通過編程控制輸出方波的頻率和占空比(高電平的比例),廣泛應用在測量,通信,功率控制與變換等各種領域(呼吸燈,電機)。
PWM其實就是模擬方式穩定輸出,通過調節PWM的占空比和周期來調節電壓電流大小
占空比:就是輸出的PWM中,高電平保持的時間與該PWM的時鐘周期的時間之比。如一個PWM的頻率是1000 Hz,那么它的時鐘周期就是1000 us,如果高電平出現的時間是200 us,那么低電平的時間肯定是800 us,那么PWM的占空比就是200 : 1000,也就是1 : 5
分辨率:就是占空比最小能達到多少。如8位的PWM,理論的分辨率就是1:255(單斜率),16位的的PWM理論就是1 : 65535(單斜率)。可見,雙斜率的計數時間多了一倍,所以輸出的PWM頻率就慢了一半,但是分辨率卻是1:(80+80) =1 :160,就是提高了一倍。
雙斜率/單斜率:假設一個PWM從0計數到80,之后又從0計數到80,這個就是單斜率;一個PWM從0計數到80,之后從80計數到0,這個就是雙斜率
PWM由定時器驅動,定時器的周期就是PWM的周期,為了控制高低電平的比例,會在定時器的基礎上加上一個比較寄存器,同時需要和GPIO口集合輸出PWM波
PWM波的高低電平的順序是由極性,PWM模式和計數模式共同決定。極性決定有效電平(默認電平),PWM模式指的是一個周期內有效電平和無效電平的順序。
LED PWM控制器
LED_PWM 主要用于控制 LED 的亮度和顏色,也可以產生 PWM 信號用于其他用途。LED_PWM 有16路通道, 即8路高速通道和8路低速通道。PWM 控制器還能夠自動逐漸增加或減少占空比,LED_PWM 還支持小數分頻。
下面是LED_PWM基本架構圖
高速通道和低速通道各有4個時鐘模塊,可以從中任選一個 h/l_timerx
低速通道的分頻器相對于高速通道的分頻器來說有以下 2 點區別
常用配置頻率及精度
主要函數
ledc_channel_config()
LEDC 通道配置
esp_err_t ledc_channel_config (const ledc_channel_config_t* ledc_conf) ledc_channel_config_t typedef struct{ int gpio_num; ledc_mode_t speed_mode; //速度 ledc_channel_t channel; //通道 ledc_intr_type_t intr_type; //中斷使能 ledc_timer_t timer_sel; //定時器通道 uint32_t duty; //占空比 }ledc_channel_config_t;ledc_fade_func_install()
安裝 LEDC 淡入淡出功能
esp_err_t ledc_fade_func_install(int intr_alloc_flags) /* intr_alloc_flags: 用于分配中斷的標志 */ledc_set_fade_with_time()
有時間限制的設置LEDC淡入淡出功能
esp_err_t ledc_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_fade_time_ms) /* speed_mode: 選擇指定速度模式的 LEDC 通道組 channel: LEDC 通道號,從 ledc_channel_t 中選擇 target_duty: 衰落的目標占空比 max_fade_time_ms:衰落的最大時間(毫秒) */ledc_fade_start()
開始LED漸變
esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode) /* speed_mode: 選擇指定速度模式的 LEDC 通道組 channel: LEDC 通道號 fade_mode: 是否阻塞直到淡入淡出完成 */LED呼吸燈代碼
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/ledc.h" #include "esp_err.h"#define LEDC_HS_TIMER LEDC_TIMER_0 //定時器序號(LEDC_TIMER_0) #define LEDC_HS_MODE LEDC_HIGH_SPEED_MODE // 定時器模式(高速模式) #define LEDC_HS_CH0_GPIO 2 // IO 映射(GPIO2) #define LEDC_HS_CH0_CHANNEL LEDC_CHANNEL_0 // PWM 通道0 #define LEDC_HS_CH1_GPIO 18 // IO 映射(GPIO18) #define LEDC_HS_CH1_CHANNEL LEDC_CHANNEL_1 // PWM 通道1 #define LEDC_HS_CH2_GPIO 19 // IO 映射(GPIO19) #define LEDC_HS_CH2_CHANNEL LEDC_CHANNEL_2 // PWM 通道2 #define LEDC_TEST_DUTY 8000 //漸變變大的最終目標的占空比 #define LEDC_TEST_FADE_TIME 3000 //變化時長3秒 //定義配置PWM的結構體 ledc_channel_config_t ledc_channel_R, ledc_channel_G, ledc_channel_B; void LEDC_Init(void) { //定時器配置結構體 ledc_timer_config_t ledc_timer = {.duty_resolution = LEDC_TIMER_13_BIT, // PWM占空比分辨率(1~15) .freq_hz = 5000, // PWM信號頻率 .speed_mode = LEDC_HS_MODE, // 定時器模式(速度模式) .timer_num = LEDC_HS_TIMER // 定時器序號(LEDC_TIMER_0)};ledc_timer_config(&ledc_timer); // 設置定時器 PWM 模式 //配置ledc_channel_Rledc_channel_R.channel = LEDC_HS_CH0_CHANNEL; // PWM 通道0 ledc_channel_R.duty = 0; // 占空比為0 ledc_channel_R.gpio_num = LEDC_HS_CH0_GPIO; // IO 映射(GPIO18) ledc_channel_R.speed_mode = LEDC_HS_MODE; // 定時器模式(速度模式) ledc_channel_R.timer_sel = LEDC_HS_TIMER; // 定時器序號(LEDC_TIMER_0) ledc_channel_config(&ledc_channel_R); //配置 PWM //配置ledc_channel_G ledc_channel_G.channel = LEDC_HS_CH1_CHANNEL; // PWM 通道0 ledc_channel_G.duty = 0; // 占空比為0 ledc_channel_G.gpio_num = LEDC_HS_CH1_GPIO; // IO 映射(GPIO18) ledc_channel_G.speed_mode = LEDC_HS_MODE; // 定時器模式(速度模式) ledc_channel_G.timer_sel = LEDC_HS_TIMER; // 定時器序號(LEDC_TIMER_0)ledc_channel_config(&ledc_channel_G); //配置 PWM //配置ledc_channel_B ledc_channel_B.channel = LEDC_HS_CH2_CHANNEL; // PWM 通道0 ledc_channel_B.duty = 0; // 占空比為0 ledc_channel_B.gpio_num = LEDC_HS_CH2_GPIO; // IO 映射(GPIO18) ledc_channel_B.speed_mode = LEDC_HS_MODE; // 定時器模式(速度模式)ledc_channel_B.timer_sel = LEDC_HS_TIMER; // 定時器序號(LEDC_TIMER_0)ledc_channel_config(&ledc_channel_B); //配置 PWM // 使能 ledc 漸變 ledc_fade_func_install(0); }void app_main() { LEDC_Init(); while (1) {printf("1. PWM逐漸變大的周期目標 = %d\n", LEDC_TEST_DUTY);// ledc 漸變至 100%,時間 LEDC_TEST_FADE_TIMEledc_set_fade_with_time(ledc_channel_R.speed_mode, ledc_channel_R.channel,LEDC_TEST_DUTY,LEDC_TEST_FADE_TIME); ledc_fade_start(ledc_channel_R.speed_mode,ledc_channel_R.channel,LEDC_FADE_NO_WAIT);vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); //延時3秒 // ledc 漸變至 100%,時間 LEDC_TEST_FADE_TIMEledc_set_fade_with_time(ledc_channel_G.speed_mode,ledc_channel_G.channel,LEDC_TEST_DUTY,LEDC_TEST_FADE_TIME);ledc_fade_start(ledc_channel_G.speed_mode,ledc_channel_G.channel,LEDC_FADE_NO_WAIT);vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); //延時3秒 // ledc 漸變至 100%,時間 LEDC_TEST_FADE_TIMEledc_set_fade_with_time(ledc_channel_B.speed_mode,ledc_channel_B.channel,LEDC_TEST_DUTY,LEDC_TEST_FADE_TIME); ledc_fade_start(ledc_channel_B.speed_mode,ledc_channel_B.channel,LEDC_FADE_NO_WAIT);vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); //延時3秒 printf("2. PWM逐漸變小的周期目標 = 0\n"); // ledc 漸變至 0%,時間 LEDC_TEST_FADE_TIMEledc_set_fade_with_time(ledc_channel_R.speed_mode,ledc_channel_R.channel,0,LEDC_TEST_FADE_TIME);ledc_fade_start(ledc_channel_R.speed_mode,ledc_channel_R.channel,LEDC_FADE_NO_WAIT); vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); //延時3秒// ledc 漸變至 0%,時間 LEDC_TEST_FADE_TIMEledc_set_fade_with_time(ledc_channel_G.speed_mode,ledc_channel_G.channel,0, LEDC_TEST_FADE_TIME); ledc_fade_start(ledc_channel_G.speed_mode,ledc_channel_G.channel,LEDC_FADE_NO_WAIT); vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); //延時3秒 // ledc 漸變至 0%,時間 LEDC_TEST_FADE_TIMEledc_set_fade_with_time(ledc_channel_B.speed_mode,ledc_channel_B.channel,0,LEDC_TEST_FADE_TIME); ledc_fade_start(ledc_channel_B.speed_mode,ledc_channel_B.channel,LEDC_FADE_NO_WAIT);vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); //延時3秒 } }MCPWM篇(電機控制PWM)
ESP32 有兩個 MCPWM 單元,可用于控制不同類型的電機。每個單元具有三對 PWM 輸出。
下面是MCPWM的詳細框圖,每個 A/B 對可由三個定時器 Timer 0、1 和 2 中的任何一個提供時鐘。同一個定時器可用于為一對以上的 PWM 輸出提供時鐘。每個單元還能夠收集輸入,例如檢測電機過電流或過電壓
總結
以上是生活随笔為你收集整理的启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启明云端分享|A133核心板SOM130
- 下一篇: 启明智显分享| 关于ESP32-S3系列