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

物联网开发笔记(8)- 使用Wokwi仿真ESP32开发板实现模数转换和脉宽调制

        先看下ESP32开发板上哪些脚支持数模转换,途中紫色标记的ADC针脚都是支持的,在实际的使用中ADC1是最稳定的,GPIO36和GPIO39因为涉及到系统的启动问题,一般不会使用,用的比较多的是GPIO34和GPIO35。GPIO32、GPIO33、GPIO25、GPIO26也是可使用的,但是它涉及到触摸和一些其他功能,所以我们选择GPIO34和GPIO35。GPIO34和GPIO35作为普通GPIO只能输入不能输出。所以首选它作为模数转换的端口是比较合适的。

途中带波浪线的针脚都是支持PWM调制的。

 一、打开Wokwi网站,选择ESP32开发板,添加一个滑动电位器

我们点击滑动电位器上方的问号,查看它的使用手册

wokwi-slide-potentiometer Reference | Wokwi DocsSliding variable resistor (linear potentiometer)https://docs.wokwi.com/parts/wokwi-slide-potentiometer我们看到,滑动电位器的初始值是0,我们可以改变他的长度来调节它的大小。

 关于ESP32的ADC介绍我们查看官方手册:

Quick reference for the ESP32 — MicroPython 1.19.1 documentationhttp://docs.micropython.org/en/latest/esp32/quickref.html#adc-analog-to-digital-conversion二、打印电位器ADC值

main.py

from machine import Pin,ADC
from time import sleep_ms

port = ADC(Pin(34))

while 1:
    print(port.read())
    sleep_ms(500)

diagram.json

{
  "version": 1,
  "author": "Anonymous maker",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-esp32-devkit-v1",
      "id": "esp",
      "top": -44.67,
      "left": 19.33,
      "attrs": { "env": "micropython-20220618-v1.19.1" }
    },
    {
      "type": "wokwi-slide-potentiometer",
      "id": "pot1",
      "top": 163.5,
      "left": -20.21,
      "attrs": { "travelLength": "60" }
    }
  ],
  "connections": [
    [ "esp:TX0", "$serialMonitor:RX", "", [] ],
    [ "esp:RX0", "$serialMonitor:TX", "", [] ],
    [ "esp:D34", "pot1:SIG", "green", [ "h-99.9", "v10.14" ] ],
    [ "esp:3V3", "pot1:VCC", "green", [ "v-0.6", "h17.14", "v54.67", "h-173.33" ] ],
    [ "esp:GND.1", "pot1:GND", "black", [ "h0" ] ]
  ]
}

滑动电位器查看效果,我们看到输出从0到4095,默认是12位(2的12次方-1)。

也可以在线查看效果哦,点击下方链接

Wokwi Arduino and ESP32 Simulatorhttps://wokwi.com/projects/341746287702442578

当然我们可以选择设置想要的位数,只需要加上这句话

from machine import Pin,ADC
from time import sleep_ms

port = ADC(Pin(34))
ADC.width(ADC.WIDTH_9BIT)  # 设置输出位数
while 1:
    print(port.read())
    sleep_ms(500)

 三、脉宽调试

关于什么叫做脉宽调制(PWM)这里就不在说明,大家自行百度学习。

首先我们在Wokwi上选择Miropython with ESP32,打开开发网页。

同事查看ESP32 的官方文档关于PWM的描述:

Quick reference for the ESP32 — MicroPython 1.19.1 documentationhttp://docs.micropython.org/en/latest/esp32/quickref.html#adc-analog-to-digital-conversion接下来我们看代码:

main.py

# 脉宽调制例子
# 通过滑动电位器产生不同的ADC值来调节LED灯的占空比
# 使LED产生不同的亮度
from machine import Pin,ADC,PWM
from time import sleep_ms

led = PWM(Pin(25))  # 定义PWM在端口25
adc = ADC(Pin(34))  # 定义ADC在端口34
# LED灯的亮度不能超过1023,否则跑出异常duty must be from 0 to 1023
adc.width(ADC.WIDTH_10BIT)  # 设置ADC的位数为9(0-1023)

while True:
    value = adc.read()  # 读取端口34的ADC值
    led.duty(value)  # 设置PWM波的占空比
    print(value)   # 打印PWM波的占空比
    sleep_ms(300)

diagram.json

{
  "version": 1,
  "author": "Anonymous maker",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-esp32-devkit-v1",
      "id": "esp",
      "top": 0,
      "left": 0,
      "attrs": { "env": "micropython-20220618-v1.19.1" }
    },
    {
      "type": "wokwi-slide-potentiometer",
      "id": "pot1",
      "top": 187.5,
      "left": -46.63,
      "attrs": { "travelLength": "30" }
    },
    {
      "type": "wokwi-led",
      "id": "led1",
      "top": 48.89,
      "left": -134.23,
      "attrs": { "color": "red" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": 81.93,
      "left": -76.59,
      "attrs": { "value": "470" }
    }
  ],
  "connections": [
    [ "esp:TX0", "$serialMonitor:RX", "", [] ],
    [ "esp:RX0", "$serialMonitor:TX", "", [] ],
    [ "esp:D25", "r1:2", "green", [ "h0" ] ],
    [ "r1:1", "led1:A", "green", [ "v0" ] ],
    [ "led1:C", "esp:GND.2", "green", [ "v0" ] ],
    [ "pot1:VCC", "esp:3V3", "red", [ "h-8.16", "v-26.33", "h172.71", "v-42.74" ] ],
    [ "pot1:GND", "esp:GND.1", "black", [ "v0" ] ],
    [ "pot1:SIG", "esp:D34", "green", [ "h-98.01", "v-209.46" ] ]
  ]
}

查看效果

或者通过网页查看效果

Wokwi Arduino and ESP32 Simulatorhttps://wokwi.com/projects/341747547238302292

我们在加个蜂鸣器看个小效果哈:

蜂鸣器buzzer的使用文档见:

wokwi-buzzer Reference | Wokwi DocsA piezoelectric buzzerhttps://docs.wokwi.com/parts/wokwi-buzzer

main.py

# 脉宽调制例子
# 通过滑动电位器产生不同的ADC值来调节LED灯的占空比
# 使LED产生不同的亮度
from machine import Pin,ADC,PWM
from time import sleep_ms

buzzer = PWM(Pin(14))  #定义蜂鸣器的PWM在端口14
buzzer.duty(512) # 设置蜂鸣器的占空比
led = PWM(Pin(25))  # 定义PWM在端口25
adc = ADC(Pin(34))  # 定义ADC在端口34
# LED灯的亮度不能超过1023,否则跑出异常duty must be from 0 to 1023
adc.width(ADC.WIDTH_10BIT)  # 设置ADC的位数为9(0-1023)

while True:
    value = adc.read()  # 读取端口34的ADC值
    led.duty(value)  # 设置PWM波的占空比
    # 此处加1是因为最小频率是1HZ,否则抛出异常freqency must be from 1Hz to 40MHz
    buzzer.freq(value + 1 ) 
    print(value)   # 打印PWM波的占空比
    sleep_ms(300)

diagram.json

{
  "version": 1,
  "author": "Anonymous maker",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-esp32-devkit-v1",
      "id": "esp",
      "top": 0,
      "left": 0,
      "attrs": { "env": "micropython-20220618-v1.19.1" }
    },
    {
      "type": "wokwi-slide-potentiometer",
      "id": "pot1",
      "top": 190.76,
      "left": -57.51,
      "attrs": { "travelLength": "30" }
    },
    {
      "type": "wokwi-led",
      "id": "led1",
      "top": 48.89,
      "left": -134.23,
      "attrs": { "color": "red" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": 81.93,
      "left": -76.59,
      "attrs": { "value": "470" }
    },
    {
      "type": "wokwi-buzzer",
      "id": "bz1",
      "top": 28.37,
      "left": -228.1,
      "attrs": { "volume": "0.1" }
    }
  ],
  "connections": [
    [ "esp:TX0", "$serialMonitor:RX", "", [] ],
    [ "esp:RX0", "$serialMonitor:TX", "", [] ],
 

查看效果:

也可用网页查看哦~~~

Wokwi Arduino and ESP32 Simulatorhttps://wokwi.com/projects/341754674259427923

相关文章:

  • 古怪的Lucene中文分词方案 —— CJKAnalyzer
  • SPDK vhost-user结合SPDK NVMe-oF RDMA性能调优
  • mysql 创建函数
  • 支持十亿级密态数据、低代码,蚂蚁集团发布隐语开放平台
  • 关于kafka常见名词解释,你了解多少?
  • 吴恩达深度学习笔记(四)——深度学习的实践层面
  • KNN-KG论文学习笔记
  • DOM与BOM与Echarts
  • 13c++呵呵老师【pawn移动组件与碰撞】
  • 简明介绍 n-gram
  • 前端培训丁鹿学堂:es7_es11常用新特性(三)
  • 深入浅出总结求解菲波那切数列的五种方法
  • TCP滑动窗口机制(重要)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [基础服务] CentOS 7.x 安装NodeJS环境并搭建Hexo
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【刷算法】求1+2+3+...+n
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • E-HPC支持多队列管理和自动伸缩
  • flask接收请求并推入栈
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript的使用你知道几种?(上)
  • JAVA并发编程--1.基础概念
  • Linux中的硬链接与软链接
  • orm2 中文文档 3.1 模型属性
  • OSS Web直传 (文件图片)
  • ReactNative开发常用的三方模块
  • Zsh 开发指南(第十四篇 文件读写)
  • 编写高质量JavaScript代码之并发
  • 和 || 运算
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 技术胖1-4季视频复习— (看视频笔记)
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 爬虫模拟登陆 SegmentFault
  • 使用Swoole加速Laravel(正式环境中)
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 终端用户监控:真实用户监控还是模拟监控?
  • elasticsearch-head插件安装
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (12)Hive调优——count distinct去重优化
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (MATLAB)第五章-矩阵运算
  • (八)Flask之app.route装饰器函数的参数
  • (蓝桥杯每日一题)love
  • .Net 4.0并行库实用性演练
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • /bin/bash^M: bad interpreter: No such file or directory
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ SNOI 2013 ] Quare
  • []串口通信 零星笔记