当前位置: 首页 > news >正文

ESP32C3 PWM输出

目前对于遥控双发差速小飞机计划采用如下架构:

遥控小飞机框图

  • ESP32C3做主控,兼具遥控收发和飞行控制
  • 锂电池供电,带电量检测
  • 双发,720空心杯电机,55mm桨,带电流检测
  • MPU6050加速度计和陀螺仪
  • 预留4个控制信号输出

马达控制要用到pwm,今天把esp32c3的pwm跑一下。

简介

esp32c3中把pwm外设称为“LED PWM控制器”,共有6个通道,可分配到任意GPIO管脚:

  • 四个独立定时器,可实现小数分频
  • 波形的周期和占空比可配置,占空比精确度可达14位
  • PWM输出信号相位可调节
  • 可在Light-sleep 模式下工作
  • 多种时钟源选择,包括APB总线时钟、外置主晶振时钟
  • 支持硬件自动步进式地增加或减少占空比,可用于LED RGB彩色梯度发生器

占空比自动渐变是一个特色功能,用于呼吸灯或其它LED灯效会很方便,在官方文档特意介绍说是LED PWM控制器。

使用方法

LED PWM控制器架构

4个定时器可独立配置(可配置时钟分频器和计数器最大值),每个定时器内部有一个时基计数器(即基于基准时钟周期计数的计数器)。每个PWM生成器在四个定时器中择一,以该定时器的计数值为基准生成PWM信号。

下图为定时器和PWM生成器的主要功能块。

定时器和PWM生成器功能块

LED PWM控制器的每个定时器内部都有一个时基计数器。上图中时基计数器使用的时钟信号称为ref_pulsex。所有定时器使用同一个时钟源信号LEDC_CLKx,该时钟源信号经分频器分频后产生ref_pulsex供计数器使用。

设置 LEDC 通道分三步完成。注意,与 ESP32 不同,ESP32-C3 仅支持设置通道为低速模式。

  1. 定时器配置,指定 PWM 信号的频率和占空比分辨率。
  2. 通道配置,绑定定时器和输出 PWM 信号的 GPIO。
  3. 改变 PWM 信号,输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。

另一个可选步骤是可以在渐变终端设置一个中断。

LED PWM 控制器 API 的关键配置

首次 LEDC 配置时,最好先配置定时器(调用函数 ledc_timer_config()),再配置通道(调用函数 ledc_channel_config())。这样可以确保 IO 脚上的 PWM 信号自有输出开始其频率就是正确的。

定时器配置

要设置定时器,可调用函数 ledc_timer_config(),并将包括如下配置参数的数据结构 ledc_timer_config_t 传递给该函数:

  • 速度模式(值必须为 LEDC_LOW_SPEED_MODE
  • 定时器索引 ledc_timer_t
  • PWM 信号频率(Hz)
  • PWM 占空比分辨率
  • 时钟源 ledc_clk_cfg_t

频率和占空比分辨率相互关联。PWM 频率越高,占空比分辨率越低,反之亦然。如果 API 不是用来改变 LED 亮度,而是用于其它目的,这种相互关系可能会很重要。时钟源同样可以限制PWM频率。选择的时钟源频率越高,可以配置的PWM频率上限就越高。

esp32c3 ledc时钟源特性

备注

  1. 如果 ESP32-C3 的定时器选用了RC_FAST_CLK作为其时钟源,驱动会通过内部校准来得知这个时钟源的实际频率。这样确保了输出PWM信号频率的精准性。

  2. ESP32-C3 的所有定时器共用一个时钟源。因此 ESP32-C3 不支持给不同的定时器配置不同的时钟源。

当一个定时器不再被任何通道所需要时,可以通过调用相同的函数 ledc_timer_config() 来重置这个定时器。此时,函数入参的配置结构体需要指定:

  • ledc_timer_config_t::speed_mode 重置定时器的所属速度模式 (ledc_mode_t
  • ledc_timer_config_t::timer_num 重置定时器的索引 (ledc_timer_t
  • ledc_timer_config_t::deconfigure 将指定定时器重置必须配置此项为 true

通道配置

定时器设置好后,请配置所需的通道(ledc_channel_t 之一)。配置通道需调用函数 ledc_channel_config()

通道的配置与定时器设置类似,需向通道配置函数传递包括通道配置参数的结构体 ledc_channel_config_t

此时,通道会按照 ledc_channel_config_t 的配置开始运作,并在选定的 GPIO 上生成由定时器设置指定的频率和占空比的 PWM 信号。在通道运作过程中,可以随时通过调用函数 ledc_stop() 将其暂停。

改变PWM占空比

调用函数 ledc_set_duty() 可以设置新的占空比。之后,调用函数 ledc_update_duty() 使新配置生效。要查看当前设置的占空比,可使用 _get_ 函数 ledc_get_duty()

另外一种设置占空比和其他通道参数的方式是调用 通道配置 一节提到的函数 ledc_channel_config()

传递给函数的占空比数值范围取决于选定的 duty_resolution,应为 0(2 ** duty_resolution) - 1。例如,如选定的占空比分辨率为 10,则占空比的数值范围为 01023。此时分辨率为 ~0.1%。

常用配置频率及精度

实例

/* LEDC (LED Controller) basic exampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "driver/ledc.h"
#include "esp_err.h"#define LEDC_OUTPUT_IO          (5) // Define the output GPIO
#define LEDC_DUTY               (4095) // Set duty to 50%. ((2 ** 13) - 1) * 50% = 4095
#define LEDC_FREQUENCY          (5000) // Frequency in Hertz. Set frequency at 5 kHzstatic void example_ledc_init(void)
{// Prepare and then apply the LEDC PWM timer configurationledc_timer_config_t ledc_timer = {.speed_mode       = LEDC_LOW_SPEED_MODE,.timer_num        = LEDC_TIMER_0,.duty_resolution  = LEDC_TIMER_13_BIT,.freq_hz          = LEDC_FREQUENCY,  // Set output frequency at 5 kHz.clk_cfg          = LEDC_AUTO_CLK};ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));// Prepare and then apply the LEDC PWM channel configurationledc_channel_config_t ledc_channel = {.speed_mode     = LEDC_LOW_SPEED_MODE,.channel        = LEDC_CHANNEL_0,.timer_sel      = LEDC_TIMER_0,.intr_type      = LEDC_INTR_DISABLE,.gpio_num       = LEDC_OUTPUT_IO,.duty           = 0, // Set duty to 0%.hpoint         = 0};ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}void app_main(void)
{// Set the LEDC peripheral configurationexample_ledc_init();// Set duty to 50%ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY));// Update duty to apply the new valueESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}

编译后运行,捕捉如下波形:

5kHz 50%占空比

修改下占空比:

ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY-400));

编译后运行,捕捉如下波形:

5kHz 45.1%占空比

公众号 | FunIO
微信搜一搜 “funio”,发现更多精彩内容。
个人博客 | blog.boringhex.top

相关文章:

ESP32C3 PWM输出

目前对于遥控双发差速小飞机计划采用如下架构&#xff1a; ESP32C3做主控&#xff0c;兼具遥控收发和飞行控制锂电池供电&#xff0c;带电量检测双发&#xff0c;720空心杯电机&#xff0c;55mm桨&#xff0c;带电流检测MPU6050加速度计和陀螺仪预留4个控制信号输出 马达控制要…...

二、GoLang输出HelloWorld、基本数据类型、变量常量定义、基本类型转换

一、输入Hello World go语言中&#xff0c;想要输出内容到控制台&#xff0c;package必须是main&#xff0c;包括方法名也必须是main&#xff0c; go语言输出的语法是 fmt 库。 package mainimport "fmt"func main() {// go语言中 输出内容 使用的库是 fmt库fmt.Pr…...

mojo初体验

目录标题 mojo初体验试用地址变量定义参数可变性和所有权Structures后续 mojo初体验 试用地址 https://www.modular.com/get-started 与python基础语法很相似。 变量定义 let定义不可变变量var定义可变变量 参数可变性和所有权 下面是一个基本的函数&#xff1a; fn add…...

python3 重启docker方法

一、工作中的问题 工作中进行测试时&#xff0c;需要修改nacos配置&#xff0c;修改完成后再重启对应的docker容器&#xff0c;让配置生效&#xff0c;研究了下&#xff0c;使用docker库可以做到。 如何修改nacos配置可以参见我的另一篇文章&#xff0c;传送门 python3 修改…...

【js】js中深拷贝与浅拷贝:

文章目录 一、浅拷贝&#xff08;修改新对象会改到原对象&#xff09;【1】通过 直接赋值【2】Object.assign&#xff08;&#xff09;方法 二、深拷贝&#xff08;修改新对象不会改到原对象&#xff09;【1】通过JSON对象来实现深拷贝【2】 Object.create&#xff08;&#xf…...

大文件上传demo,前端基于Uppy,后端基于koa

前言 文件上传基本上所有的管理系统之类的项目都有这么一个功能。因为使用了Element&#xff0c;可以方便的使用 其提供的Upload组件&#xff0c;对于普通上传来说基本上就够用了。但是有时候会涉及到大文件上传的需求&#xff0c;这时就会面临一些问题&#xff1a;比如文件上…...

typeScript--[函数定义]

一.TypesScript 函数的定义 函数的定义包括两种类型&#xff1a;函数声明和函数表达式。 1.函数声明 function hello(): string {return "hello" } 2.函数表达式 var hello1 function (): string {return "hello" } 二.函数之可选参数 参数后面的限…...

Spring初始化项目

1、官网用法 访问地址&#xff1a;https://start.spring.io idea配置&#xff1a;https://start.spring.io 2、阿里巴巴加速 访问地址&#xff1a;https://start.aliyun.com/bootstrap.html idea配置&#xff1a;https://start.aliyun.com 3、区别 官网阿里巴巴版本最新稍…...

Opencv 图像金字塔----高斯和拉普拉斯

原文&#xff1a;图像金字塔----高斯和拉普拉斯 图像金字塔是图像中多尺度表达的一种&#xff0c;最初用于机器视觉和图像压缩&#xff0c;最主要用于图像的分割、融合。 高斯金字塔 ( Gaussian pyramid): 高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像…...

gitLab(git)误提交命令

1.先使用下面命令查看一下分支上已提交的信息 git log 2.回退到之前的版本 git reset —hard 你要删除的提交哈希码&#xff08;一般是离这个命令最近的一串数字&#xff09; 3.覆盖掉远端的版本信息&#xff0c;使远端的仓库也回退到相应的版本 注意&#xff1a;切换到你提…...

Rust个人学习笔记2

一定要牢记Rust是基于表达式的语言&#xff0c;除了声明语句和表达式语句外&#xff0c;其他的都是表达式。所以if也是表达式&#xff0c;它可以被用作右值。 条件控制 if-else。cpp和python得结合。 fn main() {let number 34;if number < 0 {println!("number &l…...

深入浅出Android同步屏障机制

原文链接 Android Sync Barrier机制 诡异的假死问题 前段时间&#xff0c;项目上遇到了一个假死问题&#xff0c;随机出现&#xff0c;无固定复现规律&#xff0c;大量频繁随机操作后&#xff0c;便会出现假死&#xff0c;整个应用无法操作&#xff0c;不会响应事件&#xff…...

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…...

Python 专栏目录索引

文章目录 Python 环境搭建Python 语法 变量、print、注释和运算符Python 的基本结构Python 中的文件和文件夹操作Python 中常用库Python 常见问题及解决方案Python 应用实例 Python 环境搭建 vscode搭建Python环境 Python 语法 变量、print、注释和运算符 python语法 变量、…...

SSM学习

技术架构 crm的技术架构: 视图层(view):展示数据&#xff0c;跟用户交互。 html, css,js,jquery,bootstrap(ext / easyUI),jsp控制层(Controller):控制业客处理流程(接收请求,接收参数,封装参数;根据不同的请求调用业务 (servlet, ) springMVC ( , webwork,strutsl,struts2)业…...

.net项目部署Docker

1、项目生成的bin目录下创建Dockerfile文件 #运行环境描述&#xff0c;此处是用的Net5构建镜像 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build #复制文件到 docker容器中的app文件夹中 COPY . /app #设置工作目录为 app 文件夹&#xff0c;要和上面一致哦 WORKDIR /app #设…...

Ubuntu无法加载exfat的USB存储设备

当接入设备USB存储设备提示&#xff1a; 不能挂在63GB 卷 Error mounting /dev/sdb1 at /media/ubuntu/83C9-26F4: Command-line mount -t "exfat" -o "uhelperudisks2,nodev,nosuid,uid1000,gid1000,iocharsetutf8,namecase0,errorsremount-ro,umask0077"…...

【计算机网络】网络编程接口 Socket API 解读(2)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具&#xff0c;和其他平台&#xff08;比如 os-x …...

【黄啊码】PHP如何防止重复提交

防抖&#xff08;Debounce&#xff09;是一种防止重复提交的策略&#xff0c;它通过延迟一定时间来合并连续的操作&#xff0c;以确保只执行一次。 以下是几种防抖的实现方法以及对应的代码示例&#xff1a; 1. 前端 JavaScript 实现&#xff1a; 在前端使用 JavaScript 实现…...

2594. 修车的最少时间

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【数组】 题目来源 2594. 修车的最少时间 题目解读 给你一个表示机械工能力的数组 ranks&#xff0c;ranks[i] 表示第 i 位机械工可以在 r a n k s [ i ] ∗ n 2 ranks[…...

AI Coding 时代的工程策略革命:为什么 Monorepo 成了 AI 的“最佳拍档“?

AI Coding 时代的工程策略革命&#xff1a;为什么 Monorepo 成了 AI 的"最佳拍档"&#xff1f; 导读&#xff1a;当 AI 开始替你写代码&#xff0c;你的工程架构是否还在"拖后腿"&#xff1f;本文从 AI 的视角重新审视工程策略&#xff0c;深度解析为什么 …...

别再让日志拖慢你的服务器!深入对比C++同步与异步日志的性能差异(附TinyWebServer实测)

C服务器日志性能优化实战&#xff1a;同步与异步方案深度对比 当你的Web服务器开始承载真实流量时&#xff0c;那些看似无害的日志语句可能正在悄悄吞噬着系统性能。我曾在一个电商促销日亲眼目睹&#xff0c;由于同步日志的阻塞导致服务器响应时间从50ms飙升到800ms&#xff0…...

硬件工程选型解析:钡特电源VB60-24S12LD与金升阳URB2412LD-60WR3同属工业高可靠

在工业硬件研发、设备调试与批量量产工作中&#xff0c;大功率工业DC-DC模块的工况适配性、结构规范性与运行稳定性&#xff0c;是硬件研发工程师重点核查的核心指标&#xff0c;直接决定工控设备、电力终端、智能装备的长期运行可靠性。在60W级国产直流电源模块品类中&#xf…...

如何在Linux系统上安装Realtek RTL8125 2.5GbE网卡驱动:完整配置指南

如何在Linux系统上安装Realtek RTL8125 2.5GbE网卡驱动&#xff1a;完整配置指南 【免费下载链接】realtek-r8125-dkms A DKMS package for easy use of Realtek r8125 driver, which supports 2.5 GbE. 项目地址: https://gitcode.com/gh_mirrors/re/realtek-r8125-dkms …...

从文字问诊到具身交付:健康 Agent 产品落地实战

当健康 Agent 跳出冰冷文字框&#xff0c;升级为能开口、有表情、会互动的 3D 数字医生&#xff0c;产品体验会发生质变。本文完整记录&#xff1a;我如何用魔珐星云 SDK&#xff0c;把文字健康 Agent 落地为可交互数字员工的实战全过程。 一、产品痛点&#xff1a;健康 Agent&…...

AI犯了错没人追责,工程师犯了错丢饭碗?

芯片公司开始大量引入AI辅助设计工具&#xff0c;生成RTL代码、跑仿真、做时序分析。与此同时&#xff0c;公司对工程师的容错空间越来越小&#xff0c;考核越来越严&#xff0c;出了bug第一反应是找人背锅。这两件事放在一起&#xff0c;细想一下&#xff0c;其实挺荒诞的。AI…...

Linux 硬盘分区管理

Linux 硬盘分区管理 摘要&#xff1a;本文系统介绍了 Linux 硬盘分区管理的核心概念与实用工具。首先阐述了硬盘分区的必要性&#xff0c;包括数据隔离、分类整理、降低风险等。随后详细对比了 MBR&#xff08;主引导记录&#xff09;和 GPT&#xff08;GUID 分区表&#xff09…...

物理标签退场,视觉原生上位:UWB vs 镜像视界无感定位・空间智能重构

物理标签退场&#xff0c;视觉原生上位&#xff1a;UWB vs 镜像视界无感定位・空间智能重构在空间智能加速重构物理世界的当下&#xff0c;全域感知技术正经历一场从“物理标签”到“视觉原生”的底层范式革命。长期以来&#xff0c;以UWB&#xff08;超宽带&#xff09;为代表…...

实测在ubuntu环境下调用taotoken api的延迟与稳定性表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测在ubuntu环境下调用taotoken api的延迟与稳定性表现 本文旨在分享在Ubuntu 22.04 LTS系统环境下&#xff0c;使用Python脚本持…...

Python爬虫实战:requests + BeautifulSoup4采集经典标靶网站哲理名言,并导出结构化文件!

㊗️本期内容已收录至专栏《Python爬虫实战》&#xff0c;持续完善知识体系与项目实战&#xff0c;建议先订阅收藏&#xff0c;后续查阅更方便&#xff5e; ㊙️本期爬虫难度指数&#xff1a;⭐ (入门级) &#x1f250;福利&#xff1a; 一次订阅后&#xff0c;专栏内的所有文章…...