【雕爷学编程】MicroPython手册之 pyboard 的 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、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
MicroPython的pyboard是一种基于STM32F405RG微控制器的开发板,它可以运行MicroPython语言,实现各种有趣和有用的功能。它的主要特点有:

体积小巧,采用邮票孔设计,方便嵌入各种项目中。
内置了4个LED灯,1个开关,1个复位按钮,1个用户按钮,1个USB接口,1个SD卡插槽,1个RTC电池座等。
内置了三轴加速度计(MMA7660),可以检测板子的运动和倾斜。
支持完整的MicroPython语言功能,包括REPL交互模式,内置模块,文件系统操作等。
支持多种通信协议,如UART,SPI,I2C,CAN等。
支持多种外设和传感器的接入和控制,如LCD屏幕,音频放大器,温湿度传感器等。

在这里插入图片描述

MicroPython的pyboard ADC(模数转换)是一种可以将模拟信号转换为数字量的功能,它可以用于测量电压、电流、温度、光强等物理量。pyboard ADC(模数转换)的主要特点、应用场景,以及需要注意的事项如下:

主要特点:

pyboard ADC(模数转换)可以使用pyb.ADC类或pyb.ADCAll类来创建ADC对象,分别用于读取单个引脚或多个通道上的模拟值。
pyboard ADC(模数转换)可以设置转换的位数,可以是8、10或12位,不同的位数会影响转换的精度和速度。
pyboard ADC(模数转换)可以使用read()方法或read_timed()方法来读取ADC值,前者是同步读取,后者是异步读取,可以指定一个定时器对象来控制采样频率。
pyboard ADC(模数转换)还可以使用triangle()方法或noise()方法来产生三角波或噪声波,这些波形可以用于测试或调试。
pyboard ADC(模数转换)还可以使用pyb.ADCAll类来读取内部传感器,如温度传感器、vbat电压和基准电压等,这些参数可以用于监测芯片的工作状态。

应用场景:

pyboard ADC(模数转换)可以用于测量各种传感器的输出信号,如温湿度传感器、光敏电阻、声音传感器等34,这些信号可以用于控制其他设备或显示在屏幕上。
pyboard ADC(模数转换)可以用于产生各种波形,如正弦波、三角波、方波等,这些波形可以用于驱动其他设备或播放音乐。
pyboard ADC(模数转换)可以用于读取内部传感器,如温度传感器、vbat电压和基准电压等,这些参数可以用于调节芯片的工作参数或保护芯片免受过热或过压的损害。

需要注意的事项:

pyboard ADC(模数转换)的输入电压范围是0~3.3V,如果超过这个范围,可能会损坏芯片或引脚。因此,在接入外部信号时,需要注意信号的幅值和极性,并使用分压电路或保护电路来降低或隔离信号。
pyboard ADC(模数转换)的输出电压范围也是0~3.3V,如果需要驱动其他设备或播放音乐,可能需要使用放大电路或功率放大器来增强信号的幅值和功率。
pyboard ADC(模数转换)的采样频率和精度受到芯片时钟、闪存访问速度和编程模式等因素的影响。在高采样率下,可能会出现数据丢失或时序不准确的情况。因此,在使用ADC时,需要根据实际需求选择合适的参数,并测试其性能和稳定性。

实际运用程序参考代码案例:

案例1:使用pyb.ADC类读取X19引脚上的模拟信号,并显示在屏幕上。

import pyb
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

#初始化相关模块
i2c = I2C(sda=Pin("Y8"), scl=Pin("Y6"))
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
adc = pyb.ADC('X19') #Pin='X19'

while True:
    oled.fill(0) # 清屏显示黑色背景
    oled.text('01Studio', 0, 0) # 首行显示01Studio
    oled.text('ADC', 0, 15) # 次行显示实验名称

    #获取ADC数值
    oled.text(str(adc.read()),0,40)
    oled.text('(4095)',40,40)

    #计算电压值,获得的数据0-4095相当于0-3.3V,('%.2f'%)表示保留2位小数
    oled.text(str('%.2f'%(adc.read()/4095*3.3)),0,55)
    oled.text('V',40,55)

    oled.show()
    pyb.delay(1500)

例2:使用pyb.ADC类产生三角波,并用示波器观察波形。

import pyb
from machine import Pin

#创建DAC对象
dac = pyb.DAC(Pin.board.X5)

#产生三角波,频率为100Hz
dac.triangle(204800)

案例3:使用pyb.ADCAll类读取内部温度传感器,并显示在屏幕上。

import pyb
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

#初始化相关模块
i2c = I2C(sda=Pin("Y8"), scl=Pin("Y6"))
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
adc = pyb.ADCAll(12) #设置转换的位数为12位

while True:
    oled.fill(0) # 清屏显示黑色背景
    oled.text('01Studio', 0, 0) # 首行显示01Studio
    oled.text('ADCAll', 0, 15) # 次行显示实验名称

    #读取内部温度传感器,单位为摄氏度
    temp = adc.read_core_temp()
    oled.text('Temp:', 0, 30)
    oled.text(str('%.1f'%temp), 50, 30)
    oled.text('C', 100, 30)

    oled.show()
    pyb.delay(1500)

案例4:读取模拟传感器的数值:

import pyb

adc = pyb.ADC(pyb.Pin('X1'))  # 初始化ADC对象,使用引脚X1

while True:
    sensor_value = adc.read()  # 读取模拟传感器的数值
    print("Sensor Value: {}".format(sensor_value))
    pyb.delay(1000)  # 延时1秒

这个程序使用 MicroPython 在 pyboard 上配置 ADC 对象,并读取模拟传感器的数值。使用 ADC 对象 adc 初始化引脚 X1 上的模数转换。在一个循环中,通过 adc.read() 方法读取模拟传感器的数值,并在终端打印出来。然后延时1秒,继续读取传感器的数值。

案例5:使用电位器控制LED的亮度::

import pyb

adc = pyb.ADC(pyb.Pin('X1'))  # 初始化ADC对象,使用引脚X1
led = pyb.LED(1)  # 初始化LED对象,使用LED 1(红色LED)

while True:
    potentiometer_value = adc.read()  # 读取电位器的数值
    brightness = int(potentiometer_value / 4)  # 将读取的数值映射到LED的亮度范围
    
    led.intensity(brightness)  # 设置LED的亮度
    pyb.delay(100)  # 延时100毫秒

这个程序使用 MicroPython 在 pyboard 上配置 ADC 对象和 LED 对象,通过电位器控制 LED 的亮度。使用 ADC 对象 adc 初始化引脚 X1 上的模数转换。使用 LED 对象 led 初始化红色 LED。在一个循环中,通过 adc.read() 方法读取电位器的数值,并将数值映射到 LED 的亮度范围。然后使用 led.intensity() 方法设置 LED 的亮度,并延时100毫秒。

案例6:电池电压监测::

import pyb

adc = pyb.ADC(pyb.Pin('X1'))  # 初始化ADC对象,使用引脚X1

while True:
    adc_value = adc.read()  # 读取模数转换的数值
    voltage = adc_value * 3.3 / 4095  # 将数值转换为电压值
    
    print("Battery Voltage: {:.2f}V".format(voltage))
    pyb.delay(5000)  # 延时5秒

这个程序使用 MicroPython 在 pyboard 上配置 ADC 对象,监测电池的电压。使用 ADC 对象 adc 初始化引脚 X1 上的模数转换。在一个循环中,通过 adc.read() 方法读取模数转换的数值,并将数值转换为电压值。然后在终端打印电池的电压,并延时5秒后继续监测电池电压。这些代码示例展示了 MicroPython 在 pyboard 上配置和使用模数转换(ADC)的实际应用。请注意,具体的ADC配置和功能可能会根据硬件和需求进行调整。

案例7:读取模拟传感器数值:

import pyb

adc = pyb.ADC('X1')  # 初始化ADC对象,使用引脚X1

while True:
    sensor_value = adc.read()  # 读取模拟传感器的数值
    print("Sensor value: {}".format(sensor_value))
    pyb.delay(1000)

在上述示例中,我们使用pyb.ADC()初始化一个ADC对象,并指定连接的引脚(例如X1)。在主循环中,通过adc.read()函数读取模拟传感器的数值,并使用print()函数打印出来。程序将持续运行,每秒读取一次传感器数值。

案例8:监测电池电压::

import pyb

adc = pyb.ADC('X1')  # 初始化ADC对象,使用引脚X1

while True:
    sensor_value = adc.read()  # 读取模拟传感器的数值
    voltage = sensor_value * 3.3 / 4095  # 转换为电压值,假设使用3.3V参考电压和12位ADC分辨率
    print("Battery voltage: {:.2f} V".format(voltage))
    pyb.delay(1000)

在上述示例中,我们使用pyb.ADC()初始化一个ADC对象,并指定连接的引脚(例如X1)。在主循环中,通过adc.read()函数读取模拟传感器的数值。然后,我们将数值转换为电压值,假设使用3.3V的参考电压和12位ADC分辨率(即4095)。最后,使用print()函数打印电池电压值,保留两位小数。程序将持续运行,每秒监测一次电池电压。

案例9:实现光敏传感器的自动亮度调节::

import pyb

adc = pyb.ADC('X1')  # 初始化ADC对象,使用引脚X1
led = pyb.LED(1)  # 初始化LED对象

threshold = 2000  # 光敏传感器的阈值

while True:
    sensor_value = adc.read()  # 读取模拟传感器的数值

    if sensor_value > threshold:
        led.on()  # 环境亮度高,开启LED
    else:
        led.off()  # 环境亮度低,关闭LED

    pyb.delay(1000)

在上述示例中,我们使用pyb.ADC()初始化一个ADC对象,并指定连接的引脚(例如X1)。同时,我们使用pyb.LED()初始化一个LED对象用于控制。在主循环中,通过adc.read()函数读取模拟传感器的数值。如果传感器数值超过阈值(这里设定为2000),则开启LED表示环境亮度高;否则,关闭LED表示环境亮度低。程序将持续运行,每秒检测一次光敏传感器数值。这些示例提供了使用MicroPython在pyboard上进行模数转换(ADC)操作的实际运用程序的参考代码。你可以根据具体的传感器和应用场景进行修改和扩展。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值