【雕爷学编程】MicroPython手册之硬件相关 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的ADC是一个用于进行模拟信号转换为数字量的类,它可以让用户在Python中访问和控制硬件上的模数转换器,并表示一个可以对连续电压进行采样和转换的端点。

ADC类的主要特点是:

它可以通过一个标识符来创建一个ADC对象,该标识符可以是一个整数(通常指定一个通道号)、一个Pin对象或其他由底层硬件支持的值。
它可以设置ADC对象的采样时间、输入衰减、分辨率等参数,以影响转换的精度和范围。
它可以读取ADC对象的值,并返回一个整数或微伏的单位,表示采样到的电压大小。

ADC类的应用场景是:

在MicroPython中实现与硬件设备的交互,如读取温度传感器、光敏电阻、电位器等模拟信号。
在MicroPython中实现基于硬件设备的应用,如数据采集、信号处理、环境监测等。
在MicroPython中学习和理解模数转换的原理和方法,以及不同参数对转换结果的影响。

ADC类需注意事项是:

使用ADC类时要注意硬件设备的规格和限制,避免造成电路板故障、锁定、崩溃或硬件损坏。
使用ADC类时要注意转换结果的准确性和可靠性,避免受到噪声、温度、电源等因素的干扰。
使用ADC类时要注意不同端口之间的差异和兼容性问题,避免在移植代码时出现错误或异常。

以下是MicroPython的ADC几个实际运用程序案例:

案例一:使用ADC类读取光敏电阻的模拟值,并根据光线强度控制LED灯。

import machine

# 创建一个ADC对象,连接到GPIO34引脚,并设置为12位分辨率
adc = machine.ADC(machine.Pin(34))
adc.atten(machine.ADC.ATTN_11DB) # 设置衰减为11dB,输入范围为0~3.6V
adc.width(machine.ADC.WIDTH_12BIT) # 设置宽度为12位,输出范围为0~4095

# 创建一个Pin对象,连接到GPIO2引脚,并设置为输出模式
led = machine.Pin(2, machine.Pin.OUT)

# 定义一个阈值,当ADC值低于这个值时,点亮LED灯
THRESHOLD = 1000

# 循环检测光敏电阻的状态
while True:
    # 读取ADC对象的值,并打印
    value = adc.read()
    print(value)
    # 如果值低于阈值,表示光线暗,点亮LED灯(输出值为1)
    if value < THRESHOLD:
        led.value(1)
    # 否则表示光线亮,熄灭LED灯(输出值为0)
    else:
        led.value(0)

案例二:使用ADC类读取温度传感器LM35的模拟值,并计算并显示温度。

import machine

# 创建一个ADC对象,连接到GPIO32引脚,并设置为10位分辨率
adc = machine.ADC(machine.Pin(32))
adc.atten(machine.ADC.ATTN_11DB) # 设置衰减为11dB,输入范围为0~3.6V
adc.width(machine.ADC.WIDTH_10BIT) # 设置宽度为10位,输出范围为0~1023

# 定义一个函数,根据LM35的特性曲线将ADC值转换为摄氏度
def adc_to_celsius(value):
    # LM35的输出电压与温度成正比,每摄氏度输出10毫伏
    # 因此,温度等于电压除以10,电压等于ADC值乘以输入范围除以输出范围
    return value * 3.6 / 1023 / 0.01

# 循环读取温度传感器的状态
while True:
    # 读取ADC对象的值,并打印
    value = adc.read()
    print(value)
    # 调用函数,将ADC值转换为摄氏度,并打印
    temp = adc_to_celsius(value)
    print(temp)

案例三:使用ADC类读取电位器的模拟值,并根据旋转角度控制舵机。

import machine

# 创建一个ADC对象,连接到GPIO33引脚,并设置为12位分辨率
adc = machine.ADC(machine.Pin(33))
adc.atten(machine.ADC.ATTN_11DB) # 设置衰减为11dB,输入范围为0~3.6V
adc.width(machine.ADC.WIDTH_12BIT) # 设置宽度为12位,输出范围为0~4095

# 创建一个PWM对象,连接到GPIO18引脚,并设置频率为50Hz
pwm = machine.PWM(machine.Pin(18))
pwm.freq(50)

# 定义一个函数,根据舵机的特性曲线将角度转换为占空比(百分比)
def angle_to_duty(angle):
    return int((angle / 180) * 1023 + 40)

# 循环检测电位器的状态
while True:
    # 读取ADC对象的值,并打印
    value = adc.read()
    print(value)
    # 将ADC值映射到0~180的角度范围,并打印
    angle = value * 180 / 4095
    print(angle)
    # 调用函数,将角度转换为占空比,并设置PWM对象的占空比
    duty = angle_to_duty(angle)
    pwm.duty(duty)

案例四:读取模拟传感器数据:

from machine import ADC

# 创建ADC对象
adc = ADC(0)

# 读取模拟传感器数据
sensor_value = adc.read()

# 打印结果
print("Sensor value:", sensor_value)

在这个示例中,我们使用machine模块中的ADC类创建了一个ADC对象。然后,使用read()方法读取ADC引脚上的模拟传感器数据,并将其存储在变量sensor_value中。最后,使用print()函数将传感器数据打印出来。

案例五:使用ADC进行电压监测:

from machine import ADC

# 创建ADC对象
adc = ADC(0)

# 设置ADC参考电压
adc.vref(1100)

# 读取电压值
voltage = adc.read() * 1100 / 4095

# 打印结果
print("Voltage:", voltage, "mV")

在这个示例中,我们使用machine模块中的ADC类创建了一个ADC对象。使用vref()方法设置ADC的参考电压为1100mV。然后,使用read()方法读取ADC引脚上的电压值,并将其转换为实际电压值(使用1100mV的参考电压和12位ADC分辨率)。最后,使用print()函数将电压值打印出来。

案例六:使用ADC进行温度测量:

from machine import ADC

# 创建ADC对象
adc = ADC(0)

# 读取温度值
adc_value = adc.read()
temperature = (adc_value - 500) / 10

# 打印结果
print("Temperature:", temperature, "°C")

在这个示例中,我们使用machine模块中的ADC类创建了一个ADC对象。使用read()方法读取ADC引脚上的值,并将其存储在变量adc_value中。这里假设ADC的输入电压与温度呈线性关系。然后,将读取的ADC值转换为温度值(假设ADC值500对应10°C的温度变化)。最后,使用print()函数将温度值打印出来。

案例七:环境监测:使用ADC传感器测量环境参数,如温度、湿度、光照等。例如,连接一个温湿度传感器到MicroPython设备的ADC引脚上,并使用ADC读取传感器输出的模拟信号值,然后将其转换为温度和湿度数值。

from machine import ADC

adc = ADC(0)  # 初始化ADC对象,使用ADC0引脚
sensor_value = adc.read()  # 读取ADC输入的模拟信号值
temperature = convert_to_temperature(sensor_value)  # 将信号值转换为温度
humidity = convert_to_humidity(sensor_value)  # 将信号值转换为湿度
print("Temperature:", temperature)
print("Humidity:", humidity)

案例八:电池电量监测:使用ADC测量电池电压,以监测电池电量。通过连接电池正端到MicroPython设备的ADC引脚上,并使用ADC读取电池电压的模拟信号值。然后,可以根据电压值判断电池的电量状态。

from machine import ADC

adc = ADC(0)  # 初始化ADC对象,使用ADC0引脚
battery_voltage = adc.read()  # 读取ADC输入的模拟信号值
battery_percentage = convert_to_percentage(battery_voltage)  # 将信号值转换为电池电量百分比
print("Battery Voltage:", battery_voltage)
print("Battery Percentage:", battery_percentage)

案例九:触摸传感器:使用ADC读取触摸传感器指示的模拟值,以检测触摸输入。通过将触摸传感器连接到MicroPython设备的ADC引脚上,并使用ADC读取传感器输出的模拟信号值,可以判断用户是否触摸了传感器。

from machine import ADC

adc = ADC(0)  # 初始化ADC对象,使用ADC0引脚
touch_value = adc.read()  # 读取ADC输入的模拟信号值
if touch_value > threshold:  # 根据阈值判断是否触摸传感器
    print("Touch detected")
else:
    print("No touch detected")

这些是MicroPython中ADC的实际运用程序案例之一。ADC可以用于各种应用,如环境监测、电量监测、触摸输入等。通过读取模拟信号值并进行适当的转换和处理,可以实现丰富的功能和应用。请注意,具体的实现细节可能会根据使用的硬件和传感器而有所不同。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值