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.mzph.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 受迫…