ESP32 - Micropython ESP-IDF 雙線教程 脈寬調制(PWM)(1)

ESP32 - Micropython ESP-IDF 雙線教程 脈寬調制(PWM)

    • PWM 的基本原理
    • PWM 的應用
    • PWM 的優點
    • PWM 的實現方式
    • ESP32-micropython 中的 PWM 功能
      • 使用 micropython 控制 PWM 的代碼示例
      • 代碼介紹
    • ESP32-IDF 中的 PWM 功能
        • 1. 初始化配置函數
        • 2. 引腳綁定函數
        • 3. 占空比設置函數
        • 4. 讀取函數
        • 5. 更改頻率函數
        • 6. 其他功能函數
        • 歸納
      • 1. 初始化PWM
      • 2. 配置GPIO引腳
      • 3. 編寫呼吸效果函數
      • 4. 編寫主循環
      • 示例代碼

脈寬調制(PWM,Pulse Width Modulation)是一種模擬控制技術,通過數字手段來產生模擬效果。它基于一種思路:通過對一系列脈沖的寬度進行調制,從而等效地獲得所需要的波形(含形狀和幅值)。在電子電路中,PWM 波形通常用于控制模擬電路,因為它具有比傳統模擬方法更高的分辨率和更簡單的電路結構。

PWM 的基本原理

PWM 的基本原理是在一個固定的周期(或稱為“載波周期”)內,改變脈沖信號的高電平時間(或稱為“占空比”)來模擬不同的模擬信號。占空比是指在一個周期內,高電平時間(脈沖寬度)與整個周期時間的比值。例如,如果占空比為 50%,則在一個周期內,高電平時間等于低電平時間。

PWM 的應用

PWM 在許多領域都有廣泛的應用,包括但不限于:

  1. LED 亮度控制:通過改變 PWM 的占空比,可以控制 LED 的平均電流,從而控制其亮度。這種方法比傳統的模擬電壓控制更為精確和高效。

  2. 電機速度控制:PWM 可以用于控制直流電機或步進電機的速度。通過改變 PWM 的占空比,可以控制電機的平均輸入電壓,從而控制其轉速。

  3. 音頻放大:PWM 可以用于音頻放大器的功率控制。與傳統的線性放大器相比,PWM 放大器具有更高的效率和更低的失真。

  4. 電源管理:PWM 可以用于電源管理中的電壓調節和電流控制。例如,在計算機電源的 DC-DC 轉換器中,PWM 用于控制輸出電壓。

  5. 通信和信號處理:在某些通信和信號處理系統中,PWM 可以用于編碼和解碼信息。

PWM 的優點

  1. 分辨率高:PWM 的分辨率僅受限于載波頻率和脈沖寬度的精度。通過提高載波頻率和使用高精度的脈沖寬度控制,可以實現非常高的分辨率。

  2. 效率高:由于 PWM 是一種數字控制方法,因此它可以利用數字電路的高效性。與傳統的模擬控制方法相比,PWM 控制通常具有更高的效率。

  3. 靈活性強:PWM 可以很容易地通過改變占空比來模擬不同的模擬信號。這使得 PWM 在許多應用中都非常靈活和方便。

  4. 抗干擾能力強:由于 PWM 是一種數字信號,因此它具有較強的抗干擾能力。即使在存在噪聲和干擾的情況下,PWM 信號也能保持較好的穩定性和可靠性。

PWM 的實現方式

PWM 的實現方式有很多種,包括軟件 PWM 和硬件 PWM。軟件 PWM 是通過編程來產生 PWM 信號的方法,它通常使用定時器中斷來周期性地改變脈沖的寬度。硬件 PWM 是通過專門的硬件電路來產生 PWM 信號的方法,它通常具有更高的精度和更低的噪聲。在 ESP32 這樣的微控制器中,通常提供了硬件 PWM 支持,使得用戶可以方便地實現 PWM 控制。

ESP32-micropython 中的 PWM 功能

在 ESP32-micropython 中,可以使用 machine 模塊中的 PWM 類來創建和操作 PWM 信號。PWM 對象可以配置為不同的頻率和占空比,以產生所需的輸出信號。

使用 micropython 控制 PWM 的代碼示例

以下是一個簡單的示例,展示了如何使用 ESP32-micropython 和 GPIO 來控制一個 LED 的亮度,模擬呼吸效果。我們將使用一個按鈕(連接到另一個 GPIO)來改變呼吸速度。

import machine
import utime# 配置 PWM 引腳和頻率
led_pin = machine.Pin(2, machine.Pin.OUT)  # 假設 LED 連接到 GPIO 2
pwm = machine.PWM(led_pin)
pwm.freq(1000)  # 設置 PWM 頻率為 1kHz# 配置按鈕引腳
button_pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)  # 假設按鈕連接到 GPIO 0,并啟用上拉電阻# 呼吸效果函數
def breathe(brightness_max, speed):brightness = 0increment = brightness_max / 10  # 分為 10 步增加/減少亮度while True:for i in range(brightness_max, 0, -increment):pwm.duty_u16(int(i * 65535 / brightness_max))  # 設置 PWM 占空比utime.sleep_ms(speed)  # 等待一段時間以控制呼吸速度for i in range(0, brightness_max, increment):pwm.duty_u16(int(i * 65535 / brightness_max))utime.sleep_ms(speed)# 初始呼吸速度
speed = 50  # 毫秒try:while True:if not button_pin.value():  # 檢測到按鈕按下# 等待按鈕釋放while not button_pin.value():pass# 改變呼吸速度speed = speed * 2 if speed < 200 else 50  # 如果速度小于 200ms,則加倍;否則重置為 50msprint("Changed breath speed to:", speed, "ms")breathe(255, speed)  # 調用呼吸效果函數
except KeyboardInterrupt:pwm.deinit()  # 清理 PWM 對象machine.reset()  # 重啟設備

代碼介紹

  1. 導入必要的模塊:我們導入了 machine 模塊,用于訪問 ESP32 的硬件功能,以及 utime 模塊,用于精確的時間控制。
  2. 配置 PWM 和按鈕引腳:我們設置了 LED 和按鈕連接的 GPIO 引腳,并初始化了 PWM 對象,設置了其頻率。
  3. 定義呼吸效果函數:這個函數通過改變 PWM 的占空比來模擬呼吸效果。它使用兩個嵌套的 for 循環來逐漸增加和減少亮度。
  4. 主循環:在主循環中,我們不斷調用呼吸效果函數。當檢測到按鈕按下時,我們改變呼吸速度。注意,我們使用了簡單的去抖動邏輯來確保只檢測一次按鈕按下。
  5. 異常處理:我們使用 try-except 塊來處理可能的 KeyboardInterrupt 異常(例如,用戶按下了復位按鈕)。在異常處理程序中,我們清理了 PWM 對象并重啟了設備。

ESP32-IDF 中的 PWM 功能

ESP32的PWM庫函數主要用于配置和控制PWM(脈寬調制)信號。這些函數通常是在ESP-IDF(Espressif IoT Development Framework)中提供的,以下是對ESP32 PWM庫函數的一些講解:

1. 初始化配置函數
  • ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits)
    • 功能:設置PWM通道的頻率和分辨率。
    • 參數
      • channel:PWM通道號,范圍從0到15。
      • freq:PWM頻率,最大頻率由公式80000000 / 2^bit_num給出,其中bit_num是分辨率位數。
      • resolution_bits:PWM分辨率位數,支持1到16位。分辨率和頻率成反比。
2. 引腳綁定函數
  • ledcAttachPin(uint8_t pin, uint8_t channel)
    • 功能:將GPIO引腳綁定到指定的PWM通道。
    • 參數
      • pin:要綁定的GPIO引腳號。
      • channel:PWM通道號,與ledcSetup函數中設置的通道對應。
3. 占空比設置函數
  • ledcWrite(uint8_t channel, uint32_t duty)
    • 功能:設置指定PWM通道的占空比。
    • 參數
      • channel:PWM通道號。
      • duty:占空比值,與PWM分辨率有關。
4. 讀取函數
  • ledcRead(uint8_t channel)
    • 功能:讀取指定PWM通道的當前占空比值。
    • 參數channel,PWM通道號。
5. 更改頻率函數
  • ledcChangeFrequency(uint8_t chan, uint32_t freq, uint8_t bit_num)
    • 功能:更改PWM通道的頻率和分辨率。
    • 參數
      • chan:PWM通道號。
      • freq:新的PWM頻率。
      • bit_num:新的PWM分辨率位數。
6. 其他功能函數
  • ledcWriteTone(通道,頻率)ledcWriteNote(channel, note, oc)(注意:這些函數可能在某些庫版本中不存在或名稱略有不同)
    • 功能:這些函數允許開發者以特定的頻率或音符播放PWM信號,通常用于音頻應用。
歸納
  • 初始化:使用ledcSetup函數設置PWM通道的頻率和分辨率。
  • 引腳綁定:使用ledcAttachPin函數將GPIO引腳綁定到PWM通道。
  • 占空比控制:使用ledcWrite函數設置PWM通道的占空比。
  • 讀取:使用ledcRead函數讀取PWM通道的當前占空比。
  • 更改頻率:使用ledcChangeFrequency函數更改PWM通道的頻率和分辨率(如果需要)。
  • 其他功能:使用其他函數(如ledcWriteToneledcWriteNote)實現特定應用需求。

請注意,以上函數和參數是基于ESP-IDF庫的一般描述,實際使用時可能需要根據具體的庫版本和開發環境進行調整。建議查閱ESP-IDF的官方文檔以獲取最準確和最新的信息。

1. 初始化PWM

首先,需要初始化PWM模塊,并配置PWM通道的參數,如頻率、占空比等。

2. 配置GPIO引腳

需要配置用于PWM輸出的GPIO引腳,以及用于按鈕輸入的GPIO引腳。

3. 編寫呼吸效果函數

這個函數將循環改變PWM的占空比,以模擬呼吸效果。

4. 編寫主循環

在主循環中,檢測按鈕的輸入,并根據需要改變呼吸速度。

示例代碼

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/pwm.h"
#include "driver/gpio.h"#define LED_PWM_CHANNEL  0   // 假設使用PWM通道0
#define LED_GPIO_NUM     2   // 假設LED連接到GPIO 2
#define BUTTON_GPIO_NUM  0   // 假設按鈕連接到GPIO 0
#define PWM_HZ           1000// PWM頻率設置為1kHz
#define BREATHE_MAX      1023// 占空比最大值(10位PWM)static void breathe_led(uint16_t max_brightness, uint32_t speed_ms);void app_main(void)
{// 初始化PWMpwm_config_t pwm_config = {.freq_hz = PWM_HZ,.duty_mode = PWM_DUTY_MODE_MS,.intr_mode = PWM_INTR_DISABLE,.output_select_low = PWM_OUTPUT_LOW_HIGH,.clk_sel = PWM_SEL_APB_CLK,};pwm_init(LED_PWM_CHANNEL, &pwm_config, 1, NULL);pwm_set_pin(LED_PWM_CHANNEL, LED_GPIO_NUM);// 初始化GPIO(按鈕)gpio_pad_select_gpio(BUTTON_GPIO_NUM);gpio_set_direction(BUTTON_GPIO_NUM, GPIO_MODE_INPUT);gpio_set_pull_mode(BUTTON_GPIO_NUM, GPIO_PULLUP_ONLY);// 初始呼吸速度uint32_t speed_ms = 50;// 呼吸效果主循環while (1) {if (gpio_get_level(BUTTON_GPIO_NUM) == 0) { // 檢測到按鈕按下// 等待按鈕釋放(簡單去抖動)vTaskDelay(pdMS_TO_TICKS(20));if (gpio_get_level(BUTTON_GPIO_NUM) == 0) {// 改變呼吸速度speed_ms = (speed_ms < 200) ? speed_ms * 2 : 50;printf("Changed breath speed to: %d ms\n", speed_ms);// 稍微等待以確保按鈕完全釋放vTaskDelay(pdMS_TO_TICKS(20));}}breathe_led(BREATHE_MAX, speed_ms);}
}static void breathe_led(uint16_t max_brightness, uint32_t speed_ms)
{uint16_t brightness = 0;uint16_t increment = max_brightness / 10; // 分為10步增加/減少亮度while (1) {for (brightness = 0; brightness <= max_brightness; brightness += increment) {pwm_set_duty(LED_PWM_CHANNEL, 0, brightness);vTaskDelay(pdMS_TO_TICKS(speed_ms));}for (brightness = max_brightness; brightness > 0; brightness -= increment) {pwm_set_duty(LED_PWM_CHANNEL, 0, brightness);vTaskDelay(pdMS_TO_TICKS(speed_ms));}}
}

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

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

相關文章

常見算法200個(5):快速排序(快排)

JS實現快速排序 1.快速排序思路&#xff1a; 選擇數組中的一個值作為基準&#xff0c;將數組中小于該值的數置于該數之前&#xff0c;大于該值的數置于該數之后&#xff0c;接著對該數前后的兩個數組進行重復操作直至排序完成。 2.代碼實現&#xff1a; function quick(arr)…

使用 Snort 進行入侵檢測

使用 Snort 進行入侵檢測 Snort 是一種流行的開源入侵檢測系統。您可以在http://www.snort.org/上獲取它。Snort 分析流量并嘗試檢測和記錄可疑活動。Snort 還能夠根據其所做的分析發送警報。 Snort 安裝 在本課中&#xff0c;我們將從源代碼安裝。此外&#xff0c;我們不會安…

2024 前端面試每日1小時

三日 1. 如何理解Vue的模板編譯原理 Vue的模板編譯實際就是將模板字符串通過解析、優化和代碼生成等步驟轉換為渲染函數的過程。這個過程中&#xff0c;AST扮演了非常重要的角色&#xff0c;它用樹形結構描述了模板的內容和結構&#xff0c;是編譯過程的核心數據結構&#xff…

MySQL——適合不適合創建索引的情況

那些情況適合創建索引 1、字段的數值具有唯一性的限制 索引本身可以起到約束的作用&#xff0c;比如唯一索引、主鍵索引都是可以起到唯一性約束的&#xff0c;因此在我們的數據表中&#xff0c;如果某個字段是唯一性的&#xff0c;就可以直接創建唯一性索引&#xff0c;或者主…

Nodejs 爬蟲 案例

1.安裝&#xff1a; npm install cheerio npm install axios2.介紹&#xff1a; 2.1 cheerio 特點和用途描述&#xff1a; HTML解析和操作&#xff1a;Cheerio 可以將 HTML 字符串加載到內存中&#xff0c;并將其轉換為一個可操作的 DOM 樹結構&#xff0c;從而可以方便地對…

AURIX TC3xx單片機介紹-啟動過程介紹1

從各個域控制器硬件解決方案來看,MPU可能來自多個供應商,有瑞薩,有NXP等,但對于MCU來說,基本都采用英飛凌TC3xx。 今天我們就來看一下TC3xx的啟動過程,主要包含如下內容: uC上電過程中,會經過一個上電時序,從復位狀態“脫離”出來;Boot Firmware是復位后第一個執行的…

使用 Effect 同步-09

有些組件需要與外部系統同步。例如&#xff0c;你可能希望根據 React state 控制非 React 組件、設置服務器連接或在組件出現在屏幕上時發送分析日志。Effects 會在渲染后運行一些代碼&#xff0c;以便可以將組件與 React 之外的某些系統同步。 簡單理解&#xff0c;就是需要操…

Python實現對Word文檔內容出現“重復標題”進行自動去重(4)

前言 本文是該專欄的第4篇,后面會持續分享Python辦公自動化干貨知識,記得關注。 在本專欄上一篇文章《Python實現對Word文檔內容出現“重復標題”進行自動去重(3)》中,筆者有詳細介紹使用python對word文檔內容的目標文本進行自動去重。只不過本文要介紹的“去重方法”與上…

計算機專業必考之計算機指令設計格式

計算機指令設計格式 例題&#xff1a; 1.設相對尋址的轉移指令占3個字節&#xff0c;第一字節為操作碼&#xff0c;第二&#xff0c;第三字節為相對偏移量&#xff0c; 數據在存儲器以低地址為字地址的存放方式。 每當CPU從存儲器取出一個字節時候&#xff0c;自動完成&…

正點原子[第二期]Linux之ARM(MX6U)裸機篇學習筆記-24.1,2 SPI驅動實驗-SPI協議介紹

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸機篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。…

計算機組成原理易混淆知識點總結(持續更新)

目錄 1.機器字長&#xff0c;存儲字長與指令字長 2.指令周期,機器周期,時鐘周期 3.CPI,IPS,MIPS 4.翻譯程序和匯編程序 5.計算機體系結構和計算機組成的區別和聯系 6.基準程序執行得越快說明機器的性能越好嗎? 1.機器字長&#xff0c;存儲字長與指令字長 不同的機器三者…

AI智能體|扣子Coze文生圖功能接入微信公眾號

大家好&#xff0c;我是無界生長。 AI智能體&#xff5c;扣子Coze文生圖功能接入微信公眾號本文分享了如何將Coze平臺的文生圖功能接入微信公眾號的詳細操作流程&#xff0c;包括創建圖像流、創建并配置Bot、設置提示詞和開場白、調試、發布等步驟。如果看完還沒學會的話&…

網頁圖片加載慢的求解指南

網頁/圖片加載慢的求解指南 一、前言與問題描述 今天剛換上華為的HUAWEI AX3 Pro New&#xff0c;連上WIFI后測速雖然比平時慢&#xff0c;但是也不算太離譜&#xff0c;如下圖所示&#xff1a; 估計讀者們有也和作者一樣&#xff0c;還沒意識到事情的嚴重性&#x1f601;。 …

08Django項目--用戶管理系統--查(前后端)

對應視頻鏈接點擊直達 TOC 一些朋友加我Q反饋&#xff0c;希望有每個階段的完整項目代碼&#xff0c;那從今天開始&#xff0c;我會上傳完整的項目代碼。 用戶管理&#xff0c;簡而言之就是用戶的增刪改查。 08項目點擊下載&#xff0c;可直接運行&#xff08;含數據庫&…

PHP框架 Laravel

現在因為公司需求&#xff0c;需要新開一個Laravel框架的項目&#xff0c;毫無疑問&#xff0c;我又被借調過去了&#xff0c;最近老是被借調&#xff0c;有點陰郁&#xff0c;不過反觀來看&#xff0c;這也是好事&#xff0c;又可以復習和鞏固一下自己的知識點&#xff0c;接下…

大數據開發面試題【Spark篇】

115、Spark的任務執行流程 driver和executor&#xff0c;結構式一主多從模式&#xff0c; driver&#xff1a;spark的驅動節點&#xff0c;用于執行spark任務中的main方法&#xff0c;負責實際代碼的執行工作&#xff1b;主要負責&#xff1a;將代碼邏輯轉換為任務、在executo…

編譯qt5.15.2(mac/windows)的mysql驅動(附帶編譯好的文件)

文章目錄 0 背景1 編譯過程2 福利 0 背景 因為需要連接到mysql數據庫&#xff0c;所以需要連mysql驅動。 1 編譯過程 1&#xff0c;打開文件/Users/mac/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/sqldrivers.pro&#xff0c;注釋掉QMAKE_USE mysql&#xff1b; 如…

國產【Jetson Xavier NX】——從裸機到深度學習開發環境配置

1、設置系統從固態硬盤啟動 英偉達官方NX出廠是直接將SD卡&#xff08;64/128G&#xff09;燒錄系統作為系統盤使用&#xff0c;國產NX出廠是將系統配置在8G內存中&#xff0c;在后續使用中需配置大量開發包&#xff0c;故將系統設置為從固態硬盤啟動。 參考鏈接 https://blo…

vue3中使用svg圖標

安裝依賴 npm i vite-plugin-svg-icons -D vite.config.ts中添加配置 主要為指定svg圖標存放路徑以及命名方式 import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path;…

總結力學_3

參考: 陳曦<<力學講義>>http://ithatron.phys.tsinghua.edu.cn/downloads/mechanics.pdf 10 非慣性系 10.1 勻加速平動非慣性系 10.2 定軸勻速轉動非慣性系 可以更好刻劃總結力學_2的有心力運動、質點系的運動的工具! 11 線性系統 11.1 線性系統、11.2 受迫…