【雕爷学编程】MicroPython手册之 ESP32-S3 ADC (模数转换)

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述

总体来说,ESP32-S3在功耗、硬件资源和功能支持方面进行了优化,非常适合作为低功耗物联网设备的处理平台。相比ESP32,ESP32-S3在无线、安全性和稳定性等方面有所提升。

1、搭载 Xtensa® 32 位 LX7 双核处理器,主频 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
2、支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
3、加入了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions),性能对比 ESP32 有可观的提升。
4、集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。
5、外设新增 LCD 接口、USB、SD/MMC 主机控制器和 TWAI TM 控制器等常用外设接口。
6、拥有完善的安全机制和保护措施,支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

在这里插入图片描述
MicroPython的ESP32-S3芯片提供了ADC(模数转换)功能,以下是关于其主要特点、应用场景和需要注意的事项的详细解释:

主要特点:

高分辨率:ESP32-S3的ADC模块具有高分辨率,可以将模拟信号转换为数字值。它支持不同的位数配置,例如12位或16位,以提供更精确的模数转换结果。

多通道ADC:ESP32-S3芯片具有多个ADC通道,可以同时采集多个模拟信号。每个ADC通道都有独立的寄存器和配置选项,提供更大的灵活性。

可编程增益:ADC模块支持可编程增益功能,可以调整输入信号的放大倍数。这使得它适用于不同幅度的模拟信号采集。

应用场景:

传感器数据采集:ADC广泛应用于传感器数据采集领域。通过将传感器的模拟信号连接到ADC通道,可以将模拟数据转换为数字值,以供后续处理和分析。

电池电压监测:ADC模块可以用于监测电池电压。通过连接电池的正负极至ADC通道,可以实时获取电池电压的数字表示,以判断电池状态和剩余电量。

环境监测:ADC可以用于监测环境参数,如温度、湿度、光照等。将环境传感器输出的模拟信号连接至ADC通道,可以获取环境参数的数字表示,用于环境监测和控制。

音频采集:ADC模块也可以用于音频采集。通过连接音频输入信号至ADC通道,可以将模拟音频信号转换为数字音频数据,用于音频处理和分析。

需要注意的事项:

参考电压选择:在使用ADC时,需要选择适当的参考电压。参考电压用于将模拟信号映射到数字值。确保所选的参考电压与输入信号的幅度范围匹配。

采样速率配置:ESP32-S3的ADC模块支持配置不同的采样速率。较高的采样速率可以提供更高的数据采集频率,但可能会增加处理器负荷和功耗。

输入电压限制:在连接外部模拟信号时,需要注意ADC通道的输入电压限制。确保外部信号的电压范围在ADC输入电压的可接受范围内。

噪声和滤波:ADC的输出可能受到噪声的影响,特别是在高增益情况下。为了减少噪声的影响,可以使用软件或硬件滤波技术对采样数据进行滤波处理。

综上所述,MicroPython的ESP32-S3的ADC功能具有高分辨率、多通道支持和可编程增益等特点。它适用于传感器数据采集、电池电压监测、环境监测和音频采集等应用场景。在使用ADC时,需要注意参考电压选择、采样速率配置、输入电压限制和噪声滤波等事项,以确保模数转换的准确性和可靠性。

案例一:使用ESP32-S3的ADC读取温度传感器数据

from machine import Pin, ADC
import time

# 定义ADC引脚为GPIO34
adc = ADC(Pin(34))

# 设置ADC分辨率为12位
adc.atten(ADC.ATTN_11DB)

while True:
    # 读取ADC值
    adc_value = adc.read()

    # 将ADC值转换为温度值(单位:摄氏度)
    temperature = (adc_value - 500) / 10

    # 打印温度值
    print("Temperature: {:.2f}°C".format(temperature))

    # 延时1秒
    time.sleep(1)

要点解读:在这个程序中,我们首先导入了machine模块中的Pin和ADC类,以及time模块。然后,我们定义了一个名为adc的ADC对象,并将其引脚设置为GPIO34。接下来,我们设置了ADC的分辨率为12位。在无限循环中,我们读取ADC的值,将其转换为温度值(单位:摄氏度),并打印出来。最后,我们延时1秒,然后继续下一次循环。

案例二:使用ESP32-S3的ADC读取光照强度传感器数据

from machine import Pin, ADC
import time

# 定义ADC引脚为GPIO35
adc = ADC(Pin(35))

# 设置ADC分辨率为10位
adc.atten(ADC.ATTN_11DB)

while True:
    # 读取ADC值
    adc_value = adc.read()

    # 将ADC值转换为光照强度值(单位:Lux)
    lux = adc_value * 64

    # 打印光照强度值
    print("Light intensity: {:.2f}Lux".format(lux))

    # 延时1秒
    time.sleep(1)

要点解读:在这个程序中,我们首先导入了machine模块中的Pin和ADC类,以及time模块。然后,我们定义了一个名为adc的ADC对象,并将其引脚设置为GPIO35。接下来,我们设置了ADC的分辨率为10位。在无限循环中,我们读取ADC的值,将其转换为光照强度值(单位:Lux),并打印出来。最后,我们延时1秒,然后继续下一次循环。

案例三:使用ESP32-S3的ADC读取湿度传感器数据

from machine import Pin, ADC
import time

# 定义ADC引脚为GPIO32
adc = ADC(Pin(32))

# 设置ADC分辨率为10位
adc.atten(ADC.ATTN_11DB)

while True:
    # 读取ADC值
    adc_value = adc.read()

    # 将ADC值转换为湿度值(单位:%)
    humidity = (adc_value - 500) / 10

    # 打印湿度值
    print("Humidity: {:.2f}%".format(humidity))

    # 延时1秒
    time.sleep(1)

要点解读:在这个程序中,我们首先导入了machine模块中的Pin和ADC类,以及time模块。然后,我们定义了一个名为adc的ADC对象,并将其引脚设置为GPIO32。接下来,我们设置了ADC的分辨率为10位。在无限循环中,我们读取ADC的值,将其转换为湿度值(单位:%),并打印出来。最后,我们延时1秒,然后继续下一次循环。

案例四:读取模拟输入电压
在这个程序中,我们将使用ESP32-S3的ADC模块读取模拟输入电压。具体来说,我们将使用adc.read()函数读取ADC的值,并将其转换为电压。然后,我们将使用print()函数将电压值打印到串口。需要注意的是,在读取模拟输入电压之前,我们需要先使用adc.atten(ADC_ATTEN_DBM)函数设置ADC的增益。

import machine  
import time  
  
# 设置ADC增益  
adc.atten(ADC_ATTEN_DBM)  
  
while True:  
    # 读取模拟输入电压  
    voltage = adc.read() / 1024 * 3300 # 将ADC值转换为电压值,其中3300为参考电压3.3V  
    print('Voltage: %.2f mV' % (voltage * 1000)) # 将电压值打印到串口,并转换为mV单位  
    time.sleep(0.1) # 等待0.1秒钟

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用adc.atten()函数设置ADC的增益为最大值。接下来,我们使用一个无限循环来读取模拟输入电压。在每次循环中,我们使用adc.read()函数读取ADC的值,并将其转换为电压值。然后,我们将电压值打印到串口,并转换为mV单位。最后,我们使用time.sleep()函数等待0.1秒钟,以避免过于频繁地读取电压值。需要注意的是,在实际应用中,我们需要根据具体的电路和传感器来调整ADC的增益和参考电压,以达到最佳的测量效果。

案例五:检测电池电量
在这个程序中,我们将使用ESP32-S3的ADC模块检测电池电量。具体来说,我们将使用adc.read()函数读取ADC的值,并将其转换为电压。然后,我们将根据电池的电压范围判断电池的电量状态。需要注意的是,在检测电池电量之前,我们需要先使用adc.atten(ADC_ATTEN_DBM)函数设置ADC的增益。

import machine  
import time  
  
# 设置ADC增益  
adc.atten(ADC_ATTEN_DBM)  
  
BATTERY_VOLTAGE_MIN = 3000 # 电池最小电压值(单位:mV)  
BATTERY_VOLTAGE_MAX = 4500 # 电池最大电压值(单位:mV)  
  
while True:  
    # 检测电池电量  
    voltage = adc.read() / 1024 * 3300 # 将ADC值转换为电压值,其中3300为参考电压3.3V  
    if voltage < BATTERY_VOLTAGE_MIN: # 如果电压小于最小电压值  
        print('Battery is low!') # 电池电量低  
    elif voltage > BATTERY_VOLTAGE_MAX: # 如果电压大于最大电压值  
        print('Battery is full!') # 电池已充满电  
    else: # 如果电压在正常范围内  
        print('Battery level is normal.') # 电池电量正常  
    time.sleep(1) # 等待1秒钟

我们使用一个无限循环来检测电池电量。在每次循环中,我们使用adc.read()函数读取ADC的值,并将其转换为电压值。然后,我们根据电压值判断电池的电量状态。如果电压小于最小电压值,我们输出“Battery is low!”,表示电池电量低;如果电压大于最大电压值,我们输出“Battery is full!”,表示电池已充满电;如果电压在正常范围内,我们输出“Battery level is normal.”,表示电池电量正常。最后,我们使用time.sleep()函数等待1秒钟,以避免过于频繁地检测电池电量。需要注意的是,在实际应用中,我们需要根据具体的电池型号和电路来调整ADC的增益和参考电压,以达到最佳的检测效果。

案例六:读取温度传感器
在这个程序中,我们将使用ESP32-S3的ADC模块读取温度传感器的值。具体来说,我们将使用adc.read()函数读取ADC的值,并将其转换为电压。然后,我们将根据温度传感器的电压输出范围和温度系数计算出当前的温度。需要注意的是,在读取温度传感器之前,我们需要先使用adc.atten(ADC_ATTEN_DBM)函数设置ADC的增益。

import machine  
import time  
  
# 设置ADC增益  
adc.atten(ADC_ATTEN_DBM)  
  
TEMPERATURE_OFFSET = 4096 # 温度偏移量(单位:mV)  
TEMPERATURE_K = 0.001429 # 温度系数(单位:℃/mV)  
  
while True:  
    # 读取温度传感器  
    adc_value = adc.read()  
    voltage = adc_value / 1024 * 3300 # 将ADC值转换为电压值,其中3300为参考电压3.3V  
    temperature = (voltage - TEMPERATURE_OFFSET) / TEMPERATURE_K # 根据公式计算温度值  
    print('Temperature: %.2f°C' % temperature) # 将温度值打印到串口  
    time.sleep(1) # 等待1秒钟

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用adc.atten()函数设置ADC的增益为最大值。接下来,我们定义了两个常量TEMPERATURE_OFFSET和TEMPERATURE_K来表示温度传感器的偏移量和温度系数。然后,我们使用一个无限循环来读取温度传感器。在每次循环中,我们使用adc.read()函数读取ADC的值,并将其转换为电压值。然后,我们根据公式计算出当前的温度值。最后,我们将温度值打印到串口,并使用time.sleep()函数等待1秒钟。需要注意的是,在实际应用中,我们需要根据具体的温度传感器型号和电路来调整ADC的增益和偏移量、温度系数等参数,以达到最佳的测量效果。

案例七:读取电压值:

import machine

adc = machine.ADC(machine.Pin(36))
adc.atten(machine.ADC.ATTN_11DB)

def read_voltage():
    voltage = adc.read() * 3.3 / 4095
    return voltage

while True:
    voltage = read_voltage()
    print("Voltage:", voltage)
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过ADC读取电压值。
使用machine.ADC()函数创建一个ADC对象,指定引脚连接。
在这个示例中,引脚36被配置为ADC输入,用于测量电压。
使用adc.atten()方法设置输入电压的衰减量。
read_voltage()函数用于读取ADC值,并将其转换为电压值。
在一个无限循环中,通过调用read_voltage()函数来周期性地读取并打印电压值。

案例八:温度传感器:

import machine

adc = machine.ADC(machine.Pin(36))
adc.atten(machine.ADC.ATTN_11DB)

def read_temperature():
    voltage = adc.read() * 3.3 / 4095
    temperature = (voltage - 0.5) * 100
    return temperature

while True:
    temperature = read_temperature()
    print("Temperature:", temperature, "°C")
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过ADC读取温度传感器的值。
使用machine.ADC()函数创建一个ADC对象,指定引脚连接。
在这个示例中,引脚36被配置为ADC输入,用于连接温度传感器。
使用adc.atten()方法设置输入电压的衰减量。
read_temperature()函数用于读取ADC值,并将其转换为温度值。
在一个无限循环中,通过调用read_temperature()函数来周期性地读取并打印温度值。

案例九:光敏传感器:

import machine

adc = machine.ADC(machine.Pin(36))
adc.atten(machine.ADC.ATTN_11DB)

def read_light_intensity():
    voltage = adc.read() * 3.3 / 4095
    light_intensity = voltage * 100
    return light_intensity

while True:
    intensity = read_light_intensity()
    print("Light Intensity:", intensity, "%")
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过ADC读取光敏传感器的值。
使用machine.ADC()函数创建一个ADC对象,指定引脚连接。
在这个示例中,引脚36被配置为ADC输入,用于连接光敏传感器。
使用adc.atten()方法设置输入电压的衰减量。
read_light_intensity()函数用于读取ADC值,并将其转换为光强度值。
在一个无限循环中,通过调用read_light_intensity()函数来周期性地读取并打印光强度值。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值