idf-esp32 PWM呼吸燈(LEDC頭文件)

相關宏和變量

#define LED_PIN         GPIO_NUM_3
#define LEDC_CHANNEL    LEDC_CHANNEL_0
#define LEDC_TIMER      LEDC_TIMER_0
#define LEDC_MODE       LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES   LEDC_TIMER_13_BIT  // 2^13 = 8192級亮度
#define LEDC_FREQUENCY  5000              // 5kHz頻率//呼吸燈效果
int direction = 1;  // 1: 漸亮, -1: 漸暗
int duty = 0;

1.通過ledc_timer_config_t配置PWM參數

下面是結構體源碼

/*** @brief Configuration parameters of LEDC timer for ledc_timer_config function*/
typedef struct {ledc_mode_t speed_mode;                /*!< LEDC speed speed_mode, high-speed mode (only exists on esp32) or low-speed mode */ledc_timer_bit_t duty_resolution;      /*!< LEDC channel duty resolution */ledc_timer_t  timer_num;               /*!< The timer source of channel (0 - LEDC_TIMER_MAX-1) */uint32_t freq_hz;                      /*!< LEDC timer frequency (Hz) */ledc_clk_cfg_t clk_cfg;                /*!< Configure LEDC source clock from ledc_clk_cfg_t.Note that LEDC_USE_RC_FAST_CLK and LEDC_USE_XTAL_CLK arenon-timer-specific clock sources. You can not have one LEDC timer usesRC_FAST_CLK as the clock source and have another LEDC timer uses XTAL_CLKas its clock source. All chips except esp32 and esp32s2 do not havetimer-specific clock sources, which means clock source for all timersmust be the same one. */bool deconfigure;                      /*!< Set this field to de-configure a LEDC timer which has been configured beforeNote that it will not check whether the timer wants to be de-configuredis binded to any channel. Also, the timer has to be paused first beforeit can be de-configured.When this field is set, duty_resolution, freq_hz, clk_cfg fields are ignored. */
} ledc_timer_config_t;

下面是配置

    // 定義 LEDC 定時器配置結構體,用于設置 PWM 信號的“時間基準”(頻率、精度等)ledc_timer_config_t ledc_timer = {.speed_mode = LEDC_MODE,          // LEDC 工作模式(如 LEDC_LOW_SPEED_MODE/LEDC_HIGH_SPEED_MODE)// 低速模式適合普通 GPIO,高速模式需配合特定引腳,由宏定義指定.duty_resolution = LEDC_DUTY_RES, // PWM 占空比分辨率(單位:bit)// 例:若設為 13bit,占空比范圍是 0~2^13-1=8191(數值越大精度越高).timer_num = LEDC_TIMER,          // 選擇 LEDC 定時器編號(如 LEDC_TIMER_0 ~ LEDC_TIMER_3)// 每個定時器可對應多個通道,實現多路 PWM 輸出.freq_hz = LEDC_FREQUENCY,        // PWM 信號的頻率(單位:Hz)// 例:設為 500Hz,即 PWM 周期為 2ms,人眼無閃爍感.clk_cfg = LEDC_AUTO_CLK,         // LEDC 時鐘源選擇(LEDC_AUTO_CLK 表示自動選擇最優時鐘源)// 也可手動指定(如 LEDC_USE_APB_CLK),自動模式更便捷};// 調用 API 將配置參數寫入 LEDC 定時器硬件寄存器,完成定時器初始化ledc_timer_config(&ledc_timer);

2.通過ledc_channel_config_t配置PWM通道

結構體源碼

/*** @brief Configuration parameters of LEDC channel for ledc_channel_config function*/
typedef struct {int gpio_num;                   /*!< the LEDC output gpio_num, if you want to use gpio16, gpio_num = 16 */ledc_mode_t speed_mode;         /*!< LEDC speed speed_mode, high-speed mode (only exists on esp32) or low-speed mode */ledc_channel_t channel;         /*!< LEDC channel (0 - LEDC_CHANNEL_MAX-1) */ledc_intr_type_t intr_type;     /*!< configure interrupt, Fade interrupt enable  or Fade interrupt disable */ledc_timer_t timer_sel;         /*!< Select the timer source of channel (0 - LEDC_TIMER_MAX-1) */uint32_t duty;                  /*!< LEDC channel duty, the range of duty setting is [0, (2**duty_resolution)] */int hpoint;                     /*!< LEDC channel hpoint value, the range is [0, (2**duty_resolution)-1] */ledc_sleep_mode_t sleep_mode;   /*!< choose the desired behavior for the LEDC channel in Light-sleep */struct {unsigned int output_invert: 1;/*!< Enable (1) or disable (0) gpio output invert */} flags;                        /*!< LEDC flags */} ledc_channel_config_t;

配置

    // 定義 LEDC 通道配置結構體,用于將“定時器生成的時鐘”與“具體 GPIO 引腳”綁定,輸出 PWM 信號ledc_channel_config_t ledc_channel = {.speed_mode = LEDC_MODE,          // 必須與定時器的工作模式一致(低速/高速模式需匹配).channel = LEDC_CHANNEL,          // 選擇 LEDC 通道編號(如 LEDC_CHANNEL_0 ~ LEDC_CHANNEL_7)// 一個定時器可對應多個通道,實現“同一頻率、不同占空比”的多路 PWM.timer_sel = LEDC_TIMER,          // 綁定的定時器編號(需與上方配置的 LEDC_TIMER 一致)// 表示該通道使用此定時器生成的 PWM 基準時鐘.intr_type = LEDC_INTR_DISABLE,   // 中斷使能配置(LEDC_INTR_DISABLE 表示禁用中斷)// 若需占空比更新完成后觸發中斷,可設為 LEDC_INTR_ENABLE.gpio_num = LED_PIN,              // 輸出 PWM 信號的 GPIO 引腳(如 GPIO_NUM_2)// 需確保該引腳支持 LEDC 功能(參考芯片手冊的引腳功能表).duty = 0,                        // 初始占空比(需與定時器分辨率匹配,此處初始為 0,LED 熄滅)// 例:分辨率 13bit 時,0 表示占空比 0%(全滅),8191 表示 100%(全亮).hpoint = 0                       // PWM 高電平起始點(單位:定時器計數周期)// 默認為 0,即定時器計數從 0 開始時輸出高電平,無需特殊調整};// 調用 API 將配置參數寫入 LEDC 通道硬件寄存器,完成通道初始化(此時 GPIO 已開始輸出 PWM)ledc_channel_config(&ledc_channel);

實現

    while (1) {  ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);duty += direction * 100;if (duty >= 8191) { duty = 8191;     direction = -1; }else if (duty <= 0) { duty = 0;        direction = 1;   }vTaskDelay(10 / portTICK_PERIOD_MS);}

流程

一:先配置目標PWM的參數

二:然后配置定時器的PWM輸出到哪個引腳

三:編寫呼吸燈的漸變

四:實現

#include <stdio.h>
#include "driver/ledc.h"
#include "esp_log.h"// 硬件配置定義
#define LED_PIN         GPIO_NUM_3
#define LEDC_CHANNEL    LEDC_CHANNEL_0
#define LEDC_TIMER      LEDC_TIMER_0
#define LEDC_MODE       LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES   LEDC_TIMER_13_BIT  // 2^13 = 8192級亮度
#define LEDC_FREQUENCY  5000               // 5kHz頻率static const char *TAG = "BREATHE_LED";/*** @brief 應用程序入口*/
void app_main(void)
{printf("ESP32 Breathe LED Demo Started!\n");printf("LED Pin: GPIO %d\n", LED_PIN);printf("PWM Frequency: %d Hz\n", LEDC_FREQUENCY);printf("PWM Resolution: 13-bit (0-8191)\n");// -------------------------- 1. 配置 LEDC 定時器 ---------------------------ledc_timer_config_t ledc_timer = {.speed_mode = LEDC_MODE,.duty_resolution = LEDC_DUTY_RES,.timer_num = LEDC_TIMER,.freq_hz = LEDC_FREQUENCY,.clk_cfg = LEDC_AUTO_CLK,};ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));// -------------------------- 2. 配置 LEDC 通道 ---------------------------ledc_channel_config_t ledc_channel = {.speed_mode = LEDC_MODE,.channel = LEDC_CHANNEL,.timer_sel = LEDC_TIMER,.intr_type = LEDC_INTR_DISABLE,.gpio_num = LED_PIN,.duty = 0,.hpoint = 0};ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));ESP_LOGI(TAG, "Breathe LED initialized on GPIO %d", LED_PIN);// 呼吸燈變量int direction = 1;  // 1: 漸亮, -1: 漸暗int duty = 0;// -------------------------- 3. 呼吸燈主循環 ---------------------------while (1) {// 設置占空比并立即生效(推薦使用這個函數)ESP_ERROR_CHECK(ledc_set_duty_and_update(LEDC_MODE, LEDC_CHANNEL, duty, 0));// 調整占空比duty += direction * 100;// 邊界檢查if (duty >= 8191) {duty = 8191;direction = -1;printf("Reached maximum brightness, starting to fade out...\n");} else if (duty <= 0) {duty = 0;direction = 1;printf("Reached minimum brightness, starting to fade in...\n");}// 簡單的延時(使用空循環實現,不依賴FreeRTOS)// 注意:這種方法會阻塞CPU,在實際應用中建議使用vTaskDelayfor (volatile int i = 0; i < 10000; i++) {// 空循環延時}}
}

說明

esp32的ledc庫專門負責PWM信號的生成

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98309.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98309.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PLC_博圖系列?基本指令”S_ODTS:分配保持型接通延時定時器參數并啟動“

PLC_博圖系列?基本指令”S_ODTS&#xff1a;分配保持型接通延時定時器參數并啟動“ 文章目錄PLC_博圖系列?基本指令”S_ODTS&#xff1a;分配保持型接通延時定時器參數并啟動“背景介紹S_ODTS&#xff1a; 分配保持型接通延時定時器參數并啟動說明參數脈沖時序圖示例關鍵字&a…

OneCode 可視化揭秘系列(三):AI MCP驅動的智能工作流邏輯編排

OneCode 可視化揭秘系列&#xff08;三&#xff09;&#xff1a;AI MCP驅動的智能工作流邏輯編排 引言 在前兩篇系列博文中&#xff0c;我們詳細探討了OneCode可視化動作的基礎配置與界面設計&#xff0c;以及組件交互與數據流管理。在本篇文章中&#xff0c;我們將深入剖析邏輯…

TypeORM、Sequelize、Hibernate 的優缺點對比:新手常見 SQL 與 ORM 踩坑總結

1. ORM 與關系型數據庫&#xff08;MySQL、PostgreSQL&#xff09; 的使用 SQL 語句編寫&#xff08;JOIN、GROUP BY、索引使用、事務控制&#xff09;與 ORM 映射&#xff08;如 Sequelize、TypeORM、Hibernate&#xff09;之間的差異會讓新手非常糾結&#xff1b;尤其是理解…

JavaScript 創建型設計模式詳解

1. 單例模式1.1. 使用場景在前端開發中&#xff0c;全局狀態管理、配置信息、數據庫連接等往往需要在應用中只存在一個實例&#xff0c;避免多次實例化帶來的數據不一致性。例如&#xff0c;在一個前端應用中&#xff0c;全局的 loading 狀態通常需要一個單例模式來確保其唯一性…

k8s除了主server服務器可正常使用kubectl命令,其他節點不能使用原因,以及如何在其他k8s節點正常使用kubectl命令??

kubectl 并不是“只能”在主節點&#xff08;Control Plane Node&#xff09;使用&#xff0c;而是因為它需要訪問 Kubernetes 的 kube-apiserver&#xff0c;而 kube-apiserver 通常只在主節點上運行并監聽內部網絡。簡單來說kubectl 需要連接 kube-apiserver&#xff01;&…

Custom SRP - Complex Maps

https://catlikecoding.com/unity/tutorials/custom-srp/complex-maps/1 創建材質球我們的材質已經支持光照,并且支持 Albedo 和 Emission 貼圖.創建材質球,并應用下面的電路板的圖分別作為 albedo emission設置材質球的金屬度為 1 , 光滑度為 0.952 Mask Map在 albedo 圖上的不…

repo 學習教程

你現在會用 git 了&#xff0c;接下來學 repo&#xff08;Google 推出來的多倉庫管理工具&#xff09;&#xff0c;其實就是在 Git 的基礎上做了一層封裝&#xff0c;方便同時管理很多 Git 倉庫。像 Android 源碼、Rockchip 全套 SDK 都是靠 repo 來拉取和管理的。 我給你分幾個…

[SWERC 2020] Safe Distance題解

[SWERC 2020] Safe Distance 題意 給定 NNN 個點與一個坐標 (X,Y)(X,Y)(X,Y)&#xff0c;求從點 (0,0)(0,0)(0,0) 到點 (X,Y)(X,Y)(X,Y) 規劃一條路線&#xff0c;不能走出 (0,0)(0,0)(0,0) 與 (X,Y)(X,Y)(X,Y) 間形成的矩形&#xff0c;使得通過這條路線時距離最近的點的距離…

Rewind-你人生的搜索引擎

本文轉載自&#xff1a;Rewind-你人生的搜索引擎 - Hello123工具導航 ** 一、&#x1f50d; Rewind 是什么&#xff1f;你的數字記憶增強神器 Rewind 是一款人工智能驅動的個人記憶助手&#xff0c;就像為你配備了一個「數字第二大腦」。它能自動記錄、保存并索引你在電腦和手…

開發小點 - 存

開發小點 1.Req注解 EqualsAndHashCode(callSuper true) Data public class BillSituationReq extends BillQueryReq {/*** Whether to display the ring ratio, default is not displayed*/ApiModelProperty("Whether to Display YoY Comparison")private Boolean …

只會npm install?這5個隱藏技巧讓你效率翻倍!

原文鏈接&#xff1a;https://mp.weixin.qq.com/s/nijxVWj-E5U08DX2fl3vgg最近有個剛學前端的小伙伴問我&#xff1a;“為什么我的node_modules這么大&#xff1f;為什么別人裝依賴那么快&#xff1f;npx到底是啥玩意兒&#xff1f;” 相信不少人都跟他一樣&#xff0c;對npm的…

(二).net面試(static)

文章目錄項目地址一、基礎501.1 new keyword1.2 static class vs. static method1. static class2. static method3. static constructor 靜態構造函數4. 靜態成員的生命周期1.3 LinQ1.what is LinQ2. List<T>、IEnumerable<T>、IQueryable<T>3. 在數據庫里用…

docker,本地目錄掛載

理解Docker本地目錄掛載的基本概念Docker本地目錄掛載允許容器與宿主機共享文件或目錄&#xff0c;實現數據持久化和實時交互。掛載方式分為bind mount和volume兩種&#xff0c;前者直接映射宿主機路徑&#xff0c;后者由Docker管理存儲路徑。本地目錄掛載的核心方法bind mount…

IO多路復用相關知識

select、poll、epoll 在傳入的性能差異是不是體現在&#xff0c;當有新的連接過來&#xff0c;此時需要將新的fd傳入到內核中&#xff0c;但是poll/select需要出入整個數組&#xff0c;而epoll方式只需要出入單個fd&#xff1f; 1. select/poll 的情況它們沒有內核中“長期保存…

【CF】Day139——雜題 (絕對值變換 | 異或 + 二分 | 隨機數據 + 圖論)

B. Meeting on the Line題目&#xff1a;思路&#xff1a;數形結合首先考慮如果沒有 t 的影響該怎么寫顯然我們就是讓最大時間最小化&#xff0c;那么顯然選擇最左端點和最右端點的中間值即可&#xff0c;即 (mi mx) / 2&#xff0c;那么現在有了 t 該怎么辦我們不妨考慮拆開絕…

在 Ubuntu 上安裝和配置 PostgreSQL 實錄

一、查看ubuntu版本 lsb_release -a postgresq盡量安裝在新的穩定版本的ubuntu上 二、安裝postgresql 2.1 直接安裝 sudo apt install postgresql 結果如下 2.2 使用PPA源安裝 Ubuntu官方源提供了PostgreSQL的PPA(Personal Package Archive),通過PPA源安裝可以確保獲取…

WebGIS三維可視化 + 數據驅動:智慧煤倉監控系統如何破解煤炭倉儲行業痛點

目錄 一、項目背景&#xff1a;煤炭倉儲管理的痛點與轉型需求 二、建設意義&#xff1a;從 “被動管理” 到 “主動掌控” 的價值躍遷 三、項目核心&#xff1a;技術架構與核心目標的深度融合 四、數據與技術&#xff1a;系統穩定運行的 “雙支柱” &#xff08;一&#x…

使用 Spring Security 實現 OAuth2:一步一步的操作指南

前言 OAuth 是一種授權框架&#xff0c;用于創建權限策略&#xff0c;并允許應用程序對用戶在 HTTP 服務&#xff08;如 GitHub 和 Google&#xff09;上的賬戶進行有限訪問。它的工作原理是允許用戶授權第三方應用訪問他們的數據&#xff0c;而無需分享他們的憑證。本文將指導…

VMware共享文件夾設置

啟用共享文件夾 編輯虛擬機設置-選項-共享文件夾&#xff0c;上面的選項選擇啟用下面點擊添加一個路徑&#xff0c;跟著向導走 設置共享文件夾在主機的路徑&#xff0c;和文件夾名稱添加完成后可以點擊這個共享文件夾條目&#xff0c;查看屬性虛擬機里安裝vm-tools sudo apt up…

華為云昇騰云服務

華為云&#xff0c;一切皆服務共建智能世界云底座面向未來的智能世界&#xff0c;數字化是企業發展的必由之路。數字化成功的關鍵是以云原生的思維踐行云原生&#xff0c;全數字化、全云化、AI驅動&#xff0c;一切皆服務。華為云將持續創新&#xff0c;攜手客戶、合作伙伴和開…