ESP32-S3學習筆記<8>:LEDC的應用

ESP32-S3學習筆記<8>:LEDC的應用

  • 1. 頭文件包含
  • 2. LEDC的配置
    • 2.1 配置定時器
      • 2.1.1 speed_mode/設置速度模式
      • 2.1.2 duty_resolution/設置占空比分辨率
      • 2.1.3 timer_num/選擇定時器
      • 2.1.4 freq_hz/設定PWM頻率
      • 2.1.5 clk_cfg/選擇LEDC的外設時鐘源
      • 2.1.6 deconfigure/撤銷定時器配置
    • 2.2 配置通道
      • 2.2.1 gpio_num/設置PWM輸出的GPIO
      • 2.2.2 speed_mode/速度模式
      • 2.2.3 channel/選擇通道
      • 2.2.4 intr_type/是否使能中斷
      • 2.2.5 timer_sel/選擇通道綁定定時器
      • 2.2.6 duty/占空比選擇
      • 2.2.7 hpoint/設置高電平切換點
      • 2.2.8 output_invert/指定輸出是否需要反相
  • 3. 軟件控制PWM占空比
  • 4. 示例

1. 頭文件包含

#include "driver/ledc.h"

2. LEDC的配置

配置LEDC生成PWM波,主要分為2個步驟完成:

  1. 配置LEDC的定時器。定時器決定了PWM的一些基礎特性,例如頻率。
  2. 配置LEDC的通道,并將通道綁定到定時器。通道可以配置和控制PWM占空比。

2.1 配置定時器

使用如下代碼配置定時器。LEDC外設內一共有4個定時器,8個通道。通道可以綁定在任意一個定時器上。定時器決定了PWM的頻率,因此綁定在一個定時器上的所有通道都具有相同的PWM頻率。

esp_err_t ledc_timer_config(const ledc_timer_config_t *timer_conf);

參數 timer_conf 的定義為:

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;

2.1.1 speed_mode/設置速度模式

定義如下。ESP32-S3僅支持 LEDC_LOW_SPEED_MODE

typedef enum {
#if SOC_LEDC_SUPPORT_HS_MODELEDC_HIGH_SPEED_MODE = 0, /*!< LEDC high speed speed_mode */
#endifLEDC_LOW_SPEED_MODE,      /*!< LEDC low speed speed_mode */LEDC_SPEED_MODE_MAX,      /*!< LEDC speed limit */
} ledc_mode_t;

2.1.2 duty_resolution/設置占空比分辨率

所謂分辨率,就是PWM波的一個完整周期中,定時器計數多少次。在給定的輸入時鐘情況下。對于不同的 freq_hz(PWM頻率),有不同的分辨率范圍可選。可以認為,最大的duty_resolution(2的duty_resolution次方) 乘以 freq_hz,接近于輸入時鐘頻率(但不相等)。下表羅列了不同時鐘源情況下,不同的PWM頻率可選的最大分辨率和最小分辨率。分辨率越大,輸出PWM的占空比調節越精細。
在這里插入圖片描述

2.1.3 timer_num/選擇定時器

以下選項選擇LEDC中的定時器:

typedef enum {LEDC_TIMER_0 = 0, /*!< LEDC timer 0 */LEDC_TIMER_1,     /*!< LEDC timer 1 */LEDC_TIMER_2,     /*!< LEDC timer 2 */LEDC_TIMER_3,     /*!< LEDC timer 3 */LEDC_TIMER_MAX,
} ledc_timer_t;

2.1.4 freq_hz/設定PWM頻率

設定PWM波的頻率。

2.1.5 clk_cfg/選擇LEDC的外設時鐘源

可用的選項有:

typedef enum {LEDC_AUTO_CLK = 0,                              /*!< LEDC source clock will be automatically selected based on the giving resolution and duty parameter when init the timer*/LEDC_USE_APB_CLK = SOC_MOD_CLK_APB,             /*!< Select APB as the source clock */LEDC_USE_RC_FAST_CLK = SOC_MOD_CLK_RC_FAST,     /*!< Select RC_FAST as the source clock */LEDC_USE_XTAL_CLK = SOC_MOD_CLK_XTAL,           /*!< Select XTAL as the source clock */LEDC_USE_RTC8M_CLK __attribute__((deprecated("please use 'LEDC_USE_RC_FAST_CLK' instead"))) = LEDC_USE_RC_FAST_CLK,   /*!< Alias of 'LEDC_USE_RC_FAST_CLK' */
} soc_periph_ledc_clk_src_legacy_t;

2.1.6 deconfigure/撤銷定時器配置

如果選項 deconfigure,設置為了1,則函數僅取消對定時器的配置,不會使用上面的參數對定時器配置。

2.2 配置通道

定時器配置完成,則可以使用如下函數配置PWM通道。

esp_err_t ledc_channel_config(const ledc_channel_config_t *ledc_conf);

參數 ledc_conf 的定義如下:

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] */struct {unsigned int output_invert: 1;/*!< Enable (1) or disable (0) gpio output invert */} flags;                        /*!< LEDC flags */} ledc_channel_config_t;

2.2.1 gpio_num/設置PWM輸出的GPIO

2.2.2 speed_mode/速度模式

對于ESP32-S3而言僅選擇 LEDC_LOW_SPEED_MODE

2.2.3 channel/選擇通道

參數 channel 選擇一個通道進行配置。可用選項有:

typedef enum {LEDC_CHANNEL_0 = 0, /*!< LEDC channel 0 */LEDC_CHANNEL_1,     /*!< LEDC channel 1 */LEDC_CHANNEL_2,     /*!< LEDC channel 2 */LEDC_CHANNEL_3,     /*!< LEDC channel 3 */LEDC_CHANNEL_4,     /*!< LEDC channel 4 */LEDC_CHANNEL_5,     /*!< LEDC channel 5 */
#if SOC_LEDC_CHANNEL_NUM > 6LEDC_CHANNEL_6,     /*!< LEDC channel 6 */LEDC_CHANNEL_7,     /*!< LEDC channel 7 */
#endifLEDC_CHANNEL_MAX,
} ledc_channel_t;

2.2.4 intr_type/是否使能中斷

LEDC外設支持硬件自動調節PWM占空比(用來調節LED燈的漸亮漸暗、呼吸效果之類的)。如果使用這項功能,可在此處選擇是否使用中斷。如果是軟件控制占空比,則不必使能中斷。

typedef enum {LEDC_INTR_DISABLE = 0,    /*!< Disable LEDC interrupt */LEDC_INTR_FADE_END,       /*!< Enable LEDC interrupt */LEDC_INTR_MAX,
} ledc_intr_type_t;

2.2.5 timer_sel/選擇通道綁定定時器

定時器一共有4個,這里選擇將通道綁定到哪個定時器。

2.2.6 duty/占空比選擇

設置占空比。這里是配置時設置的,相當于默認占空比。后續運行時也有其他API可以修改占空比。其可設定的最小值為0,最大值為 2的duty_resolution次方
假設前面設置定時器時 duty_resolution 是10位,則最大值為1024。當 duty 設置為512時,輸出信號高電平占空比為50%。設置為256時,輸出高電平占空比為25%。

2.2.7 hpoint/設置高電平切換點

通道內部有2個參數,hpointlpoint。前者確定輸出PWM信號從低電平到高電平切換的計數器的值。后者則決定信號從高電平到低電平切換的計數器的值。前者在此處設置。一旦 hpointduty 是確定的,則 lpoint 也是確定的。所以 lpoint 不需要用戶設置,驅動代碼會根據前兩個參數去算。
hpoint的值最小為0,最大為2的duty_resolution次方-1
在這里插入圖片描述

2.2.8 output_invert/指定輸出是否需要反相

PWM輸出信號默認是低電平的。設置此位,則反相輸出。

3. 軟件控制PWM占空比

使用如下函數設置PWM輸出的占空比:

esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty) ;
esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel) ;

前一個函數設置占空比門限。調用此函數不會立即生效。調用后一個函數來使得設定生效。

4. 示例

以下示例程序,先配置一個LEDC定時器,然后設置定時器的一個通道。默認情況下,輸出占空比50%。在主函數中,將占空比改為25%。
在這里插入圖片描述

test_ledc.h文件:

#define TEST_LEDC_TIMER_SELECT        (LEDC_TIMER_0        )
#define TEST_LEDC_TIMER_RESOLUTION    (LEDC_TIMER_10_BIT   )
#define TEST_LEDC_TIMER_FREQ          (5000                )#define TEST_LEDC_CHANNEL_GPIO        (GPIO_NUM_4          )
#define TEST_LEDC_CHANNEL_SELECT      (LEDC_CHANNEL_0      )
#define TEST_LEDC_CHANNEL_DUTY        (512                 )
#define TEST_LEDC_CHANNEL_HPOINT      (1                   )void TEST_LEDC_LEDCConfig(void) ;
void TEST_LEDC_SoftUpdateDuty(void) ;

test_ledc.c文件:

#include "driver/ledc.h"
#include "esp_log.h"#include "test_ledc.h"void TEST_LEDC_LEDCConfig(void)
{esp_err_t                 iErrCode ;const ledc_timer_config_t stLEDCConfigInfo ={.speed_mode      = LEDC_LOW_SPEED_MODE ,.duty_resolution = TEST_LEDC_TIMER_RESOLUTION ,.timer_num       = TEST_LEDC_TIMER_SELECT ,.freq_hz         = TEST_LEDC_TIMER_FREQ ,.clk_cfg         = LEDC_USE_XTAL_CLK ,.deconfigure     = 0} ;const ledc_channel_config_t stChannelConfigInfo = {.gpio_num            = TEST_LEDC_CHANNEL_GPIO ,.speed_mode          = LEDC_LOW_SPEED_MODE ,.channel             = TEST_LEDC_CHANNEL_SELECT ,.intr_type           = LEDC_INTR_DISABLE ,.timer_sel           = TEST_LEDC_TIMER_SELECT ,.duty                = TEST_LEDC_CHANNEL_DUTY ,.hpoint              = TEST_LEDC_CHANNEL_HPOINT ,.flags.output_invert = 0} ;iErrCode = ledc_timer_config(&stLEDCConfigInfo) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Config LEDC timer error! Return value is %d\n", iErrCode) ;}iErrCode = ledc_channel_config(&stChannelConfigInfo) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Config LEDC channel error! Return value is %d\n", iErrCode) ;}return ;
}void TEST_LEDC_SoftUpdateDuty(void)
{esp_err_t iErrCode ;iErrCode = ledc_set_duty(LEDC_LOW_SPEED_MODE, TEST_LEDC_CHANNEL_SELECT, 256) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Set duty error! Return value is %d\n", iErrCode) ;}iErrCode = ledc_update_duty(LEDC_LOW_SPEED_MODE, TEST_LEDC_CHANNEL_SELECT) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Update duty error! Return value is %d\n", iErrCode) ;}return ;
}

main.c文件:

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"#include "test_ledc.h"void app_main(void)
{TEST_LEDC_LEDCConfig() ;while (true){vTaskDelay(1000) ;TEST_LEDC_SoftUpdateDuty() ;}
}

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

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

相關文章

網絡安全第14集

前言&#xff1a;小迪安全14集&#xff0c;這集重點內容&#xff1a;0、什么是js滲透測試&#xff1f;在javascript中也存在變量和函數&#xff0c;存在可控變量和函數就有可能存在在漏洞&#xff0c;js開發的web應用和php、java開發的區別是&#xff0c;js能看得到的源代碼&am…

代碼隨想錄算法訓練營第三十三天

LeetCode.62 不同路徑 題目鏈接 不同路徑 題解 class Solution {public int uniquePaths(int m, int n) {// dp表示到達ij有多少條路徑int[][] dp new int[110][110];dp[1][1] 1;for(int i 0;i<m;i){dp[i][0] 1;}for(int j 0;j<n;j){dp[0][j] 1;}for(int i 1;i…

銀行回單OCR識別技術原理

銀行回單OCR&#xff08;光學字符識別&#xff09;技術通過結合圖像處理、模式識別和自然語言處理&#xff08;NLP&#xff09;技術&#xff0c;將紙質或電子版銀行回單中的非結構化文本&#xff08;如賬號、金額、日期等&#xff09;轉化為結構化數據。以下是其核心原理和關鍵…

Day22-二叉樹的迭代遍歷

昨天學習了遞歸遍歷&#xff1a;遞歸就是一次次的把參數壓入棧中&#xff0c;然后返回的時候還是上一次遞歸保存的參數。今天學習迭代遍歷。迭代遍歷就是用棧去模擬保存二叉樹的節點&#xff0c;然后依次去遍歷&#xff0c;只不過要注意棧的后入先出的規則。前序遍歷&#xff1…

知識蒸餾 - 通過引入溫度參數T調整 Softmax 的輸出

知識蒸餾 - 通過引入溫度參數T調整 Softmax 的輸出 flyfish import torch import torch.nn.functional as F import matplotlib.pyplot as plt import numpy as np# 設置中文字體支持 plt.rcParams["font.family"] [AR PL UMing CN] # Linux plt.rcParams[axes.uni…

Java研學-RabbitMQ(三)

一 消息通信協議 1 AMQP AMQP 是一個開放的、跨語言、跨平臺的消息協議標準&#xff0c;用于在分布式系統中傳遞業務消息。它定義了消息隊列的二進制協議格式和交互模型&#xff08;如交換機、隊列、綁定等&#xff09;&#xff0c;確保不同語言&#xff08;Java、Python、C#等…

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求以下是 http.client 模塊的詳細使用教程&#xff0c;幫助你理解如何使用 Python 標準庫發送 HTTP 請求&#xff1a;1. http.client 概述http.client 是 Python 內置的 HTTP 客戶端庫&#xff0c;提供了底層的 HTTP 協議實…

Android-三種持久化方式詳解

持久化技術分為3種&#xff0c;文件&#xff0c;sharedPreferences存儲&#xff0c;數據庫來存儲&#xff1b; 目錄 文件存儲&#xff1a; 利用SharedPreferences中讀取數據 SQLite創建數據庫 更新 添加 刪除 查找&#xff1a; 文件存儲&#xff1a; 文件存儲是 Andr…

并發安全之鎖機制一

鎖機制一 鎖機制是計算機系統中解決并發沖突的核心工具&#xff0c;其存在和應用場景源于一個根本問題&#xff1a;當多個執行單元&#xff08;線程、進程、分布式節點&#xff09;同時訪問或修改同一份共享資源時&#xff0c;如何保證數據的正確性、一致性和系統可靠性&#x…

結合項目闡述 設計模式:單例、工廠、觀察者、代理

原文鏈接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工廠模式應用 C17及之后可編譯 /*日志落地模塊的實現1.抽象落地基類2.派生子類&#xff08;根據不同落地方向進行派生&#xff09;3.使用工廠模式進行創建與表示的分離 */#ifndef _…

uniapp 更新apk有緩存點不動,卸載安裝apk沒有問題。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML響應式SEO公司網站源碼

核心優勢 100%純HTML/CSS開發自動適配手機/平板/PC內置SEO優化結構0.5秒極速加載 包含頁面 ? 首頁&#xff08;關鍵詞布局優化版&#xff09; ? 服務項目展示頁 ? 客戶案例庫 ? 新聞資訊系統 ? 聯系方式&#xff08;帶地圖API&#xff09; 技術參數 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080顯卡&#xff0c;在 Windows 11 上運行 ollama run deepseek-r1:1.5b 出現 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后來不知為什么就不好用了。 原因&#xff1a; 檢查 Microsoft Visual C Redistributab…

Linux中ssh遠程登錄原理與配置

SSH連接的五個階段 1. 版本協商階段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;協商使用SSH-1或SSH-2協議&#xff08;現代系統默認SSH-2&#xff09;。流程&#xff1a;關鍵點&#xff1a;若版本不兼容&#xff08;如客戶端只支持SSH-1&#xff0c…

Kubernetes --存儲入門

一、Volume 的概念對于大多數的項目而言&#xff0c;數據文件的存儲是非常常見的需求&#xff0c;比如存儲用戶上傳的頭像、文件以及數據庫的數據。在 Kubernetes 中&#xff0c;由于應用的部署具有高度的可擴展性和編排能力&#xff08;不像傳統架構部署在固定的位置&#xff…

螞蟻 KAG 框架開源:知識圖譜 + RAG 雙引擎

引言&#xff1a;從RAG到KAG&#xff0c;專業領域知識服務的技術突破 在大語言模型&#xff08;LLM&#xff09;應用落地過程中&#xff0c;檢索增強生成&#xff08;RAG&#xff09; 技術通過引入外部知識庫有效緩解了模型幻覺問題&#xff0c;但在專業領域仍面臨三大核心挑戰…

V-Ray 7.00.08 for 3ds Max 2021-2026 安裝與配置教程(含語言補丁)

本文介紹 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安裝與使用配置步驟&#xff0c;適合需要進行可視化渲染工作的設計師、建筑師及相關從業者。附帶語言補丁配置方式&#xff0c;幫助用戶獲得更順暢的使用體驗。 &#x1f4c1; 一、安裝文件準備 軟件名稱&#xf…

Go-Elasticsearch Typed Client查詢請求的兩種寫法強類型 Request 與 Raw JSON

1 為什么需要兩種寫法&#xff1f; 在 Golang 項目中訪問 Elasticsearch&#xff0c;一般會遇到兩類需求&#xff1a;需求場景特點最佳寫法后臺服務 / 業務邏輯查詢固定、字段清晰&#xff0c;需要編譯期保障Request 結構體儀表盤 / 高級搜索 / 模板 DSL查詢片段由前端或腳本動…

Leaflet 綜合案例-聚類圖層控制

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

React組件中的this指向問題

在 React 組件中&#xff0c;函數定義方式影響this指向的核心原因是箭頭函數與普通函數的作用域綁定規則不同&#xff0c;具體差異如下&#xff1a;? 1. 普通函數&#xff08;function定義&#xff09;需要手動bind(this)的原因? 當用function在組件內定義方法時&#xff1…