日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

發(fā)布時(shí)間:2024/10/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提示:啟明智顯專為智能產(chǎn)品提供一站式彩屏顯示+連接+云端服務(wù)+APP軟件開(kāi)發(fā)、維護(hù)等解決方案,幫廠商快速實(shí)現(xiàn)硬件的智能化。作為啟明云端旗下方案公司,我們用心整理了開(kāi)發(fā)小伙伴在開(kāi)發(fā)過(guò)程中可能會(huì)遇到的問(wèn)題以及快速上手的簡(jiǎn)明教程,同時(shí)也用心整理了連接+顯示應(yīng)用的新方案!希望你能第一時(shí)間了解并快速用上好的方案和產(chǎn)品!


參考文獻(xiàn)
https://xuhong.blog.csdn.net/article/details/80417430
https://blog.csdn.net/weixin_43677266/article/details/121694652

PWM叫脈沖寬度調(diào)制,通過(guò)編程控制輸出方波的頻率和占空比(高電平的比例),廣泛應(yīng)用在測(cè)量,通信,功率控制與變換等各種領(lǐng)域(呼吸燈,電機(jī))。

PWM其實(shí)就是模擬方式穩(wěn)定輸出,通過(guò)調(diào)節(jié)PWM的占空比和周期來(lái)調(diào)節(jié)電壓電流大小

占空比:就是輸出的PWM中,高電平保持的時(shí)間與該P(yáng)WM的時(shí)鐘周期的時(shí)間之比。如一個(gè)PWM的頻率是1000 Hz,那么它的時(shí)鐘周期就是1000 us,如果高電平出現(xiàn)的時(shí)間是200 us,那么低電平的時(shí)間肯定是800 us,那么PWM的占空比就是200 : 1000,也就是1 : 5

分辨率:就是占空比最小能達(dá)到多少。如8位的PWM,理論的分辨率就是1:255(單斜率),16位的的PWM理論就是1 : 65535(單斜率)。可見(jiàn),雙斜率的計(jì)數(shù)時(shí)間多了一倍,所以輸出的PWM頻率就慢了一半,但是分辨率卻是1:(80+80) =1 :160,就是提高了一倍。

雙斜率/單斜率:假設(shè)一個(gè)PWM從0計(jì)數(shù)到80,之后又從0計(jì)數(shù)到80,這個(gè)就是單斜率;一個(gè)PWM從0計(jì)數(shù)到80,之后從80計(jì)數(shù)到0,這個(gè)就是雙斜率

PWM由定時(shí)器驅(qū)動(dòng),定時(shí)器的周期就是PWM的周期,為了控制高低電平的比例,會(huì)在定時(shí)器的基礎(chǔ)上加上一個(gè)比較寄存器,同時(shí)需要和GPIO口集合輸出PWM波


PWM波的高低電平的順序是由極性,PWM模式和計(jì)數(shù)模式共同決定。極性決定有效電平(默認(rèn)電平),PWM模式指的是一個(gè)周期內(nèi)有效電平和無(wú)效電平的順序。


LED PWM控制器

LED_PWM 主要用于控制 LED 的亮度和顏色,也可以產(chǎn)生 PWM 信號(hào)用于其他用途。LED_PWM 有16路通道, 即8路高速通道和8路低速通道。PWM 控制器還能夠自動(dòng)逐漸增加或減少占空比,LED_PWM 還支持小數(shù)分頻。

下面是LED_PWM基本架構(gòu)圖

高速通道和低速通道各有4個(gè)時(shí)鐘模塊,可以從中任選一個(gè) h/l_timerx

低速通道的分頻器相對(duì)于高速通道的分頻器來(lái)說(shuō)有以下 2 點(diǎn)區(qū)別

  • 高速定位器的時(shí)鐘源采用了 REF_TICK 或 APB_CLK,低速定位器采用了 REF_TICK 或 SLOW_CLOCK。(置位 LEDC_APB_CLK_SEL 寄存器, SLOW_CLOCK 的頻率為 80 MHz,否則為 8 MHz。)[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-e8FFtNar-1647928339609)(C:\Users\SNKjxn\AppData\Roaming\Typora\typora-user-images\image-20220106165924752.png)]
  • 當(dāng)修改了高速通道計(jì)數(shù)器的最大值或分頻系數(shù)時(shí),輸出信號(hào)的更新將會(huì)在下一次溢出中斷之后生效。而低速通道在置位 LEDC_LSTIMERx_PARA_UP之后,立刻更新計(jì)數(shù)器的計(jì)數(shù)范圍參數(shù)和分頻器的分頻系數(shù)。
  • 常用配置頻率及精度

    主要函數(shù)

    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; //定時(shí)器通道 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: 用于分配中斷的標(biāo)志 */

    ledc_set_fade_with_time()

    有時(shí)間限制的設(shè)置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 通道號(hào),從 ledc_channel_t 中選擇 target_duty: 衰落的目標(biāo)占空比 max_fade_time_ms:衰落的最大時(shí)間(毫秒) */

    ledc_fade_start()

    開(kāi)始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 通道號(hào) 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 //定時(shí)器序號(hào)(LEDC_TIMER_0) #define LEDC_HS_MODE LEDC_HIGH_SPEED_MODE // 定時(shí)器模式(高速模式) #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 //漸變變大的最終目標(biāo)的占空比 #define LEDC_TEST_FADE_TIME 3000 //變化時(shí)長(zhǎng)3秒 //定義配置PWM的結(jié)構(gòu)體 ledc_channel_config_t ledc_channel_R, ledc_channel_G, ledc_channel_B; void LEDC_Init(void) { //定時(shí)器配置結(jié)構(gòu)體 ledc_timer_config_t ledc_timer = {.duty_resolution = LEDC_TIMER_13_BIT, // PWM占空比分辨率(1~15) .freq_hz = 5000, // PWM信號(hào)頻率 .speed_mode = LEDC_HS_MODE, // 定時(shí)器模式(速度模式) .timer_num = LEDC_HS_TIMER // 定時(shí)器序號(hào)(LEDC_TIMER_0)};ledc_timer_config(&ledc_timer); // 設(shè)置定時(shí)器 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; // 定時(shí)器模式(速度模式) ledc_channel_R.timer_sel = LEDC_HS_TIMER; // 定時(shí)器序號(hào)(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; // 定時(shí)器模式(速度模式) ledc_channel_G.timer_sel = LEDC_HS_TIMER; // 定時(shí)器序號(hào)(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; // 定時(shí)器模式(速度模式)ledc_channel_B.timer_sel = LEDC_HS_TIMER; // 定時(shí)器序號(hào)(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逐漸變大的周期目標(biāo) = %d\n", LEDC_TEST_DUTY);// ledc 漸變至 100%,時(shí)間 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); //延時(shí)3秒 // ledc 漸變至 100%,時(shí)間 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); //延時(shí)3秒 // ledc 漸變至 100%,時(shí)間 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); //延時(shí)3秒 printf("2. PWM逐漸變小的周期目標(biāo) = 0\n"); // ledc 漸變至 0%,時(shí)間 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); //延時(shí)3秒// ledc 漸變至 0%,時(shí)間 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); //延時(shí)3秒 // ledc 漸變至 0%,時(shí)間 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); //延時(shí)3秒 } }

    MCPWM篇(電機(jī)控制PWM)

    ESP32 有兩個(gè) MCPWM 單元,可用于控制不同類型的電機(jī)。每個(gè)單元具有三對(duì) PWM 輸出。


    下面是MCPWM的詳細(xì)框圖,每個(gè) A/B 對(duì)可由三個(gè)定時(shí)器 Timer 0、1 和 2 中的任何一個(gè)提供時(shí)鐘。同一個(gè)定時(shí)器可用于為一對(duì)以上的 PWM 輸出提供時(shí)鐘。每個(gè)單元還能夠收集輸入,例如檢測(cè)電機(jī)過(guò)電流或過(guò)電壓

    總結(jié)

    以上是生活随笔為你收集整理的启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。