【雕爷学编程】MicroPython手册之 Teensy 4.1 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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
Teensy 4.1是一款基于ARM Cortex-M7的高性能开发板,具有以下特点:

1、处理器:Teensy 4.1使用了恩智浦的i.MX RT1060处理器,它是一款交叉处理器,具有微控制器的功能,速度与微型计算机相当。它的运行频率高达600 MHz,可提供高达3000 DMIPS的性能,以及浮点运算单元和加密加速器。
2、内存:Teensy 4.1配备了1024 KB的RAM(其中512 KB是紧密耦合的),8 MB的Flash(其中64 KB用于恢复和EEPROM模拟),以及两个位置可以选择添加更多的QSPI内存芯片。
3、I/O引脚:Teensy 4.1共有55个数字输入/输出引脚,其中35个支持PWM输出,18个支持模拟输入。它还提供了8个串口,3个SPI端口,3个I2C端口,2个I2S/TDM数字音频端口,3个CAN总线(其中一个支持CAN FD),以及一个SDIO(4位数据)原生SD卡端口12。
4、以太网:Teensy 4.1包含了一个以太网控制器和一个以太网PHY芯片(DP83825),支持10/100 Mbit的速度。连接以太网电缆只需要一个RJ45磁插孔套件。
5、USB主机:Teensy 4.1提供了一个USB主机端口,支持480 Mbit/sec的速度。它可以连接USB设备,如键盘、鼠标、MIDI设备等。
6、RTC:Teensy 4.1支持实时时钟(RTC),可以通过连接一个3V纽扣电池来保持日期和时间。
7、LED:Teensy 4.1有一个内置的GPIO指示灯LED,连接在引脚13上。

在这里插入图片描述
MicroPython是一种基于Python语言的微控制器开发平台,而Teensy 4.1是一款强大的开发板,支持MicroPython,并且具备ADC(模数转换)功能。

主要特点:

高分辨率:Teensy 4.1的ADC模块具备高分辨率,通常为12位或更高,这意味着它可以将模拟信号转换为数字值,精确到更小的细节水平。
多通道:Teensy 4.1的ADC模块通常具有多个输入通道,可以同时读取多个模拟信号。这使得它在需要监测多个传感器或信号的应用中非常有用。
快速采样率:Teensy 4.1的ADC模块通常具有较高的采样率,可以以较快的速度读取模拟信号。这对于需要实时响应的应用非常重要。
可编程增益:ADC模块通常具有可编程增益选项,可以调整输入信号的放大倍数。这使得它适用于处理不同幅度的模拟信号。

应用场景:

传感器数据采集:ADC模块可用于读取各种模拟传感器(如温度传感器、光线传感器、压力传感器等)的输出信号。通过将传感器连接到ADC引脚,可以将模拟信号转换为数字形式,然后在MicroPython中进行进一步处理和分析。
声音处理:ADC模块可用于音频信号的采集和处理。通过连接麦克风或音频输入设备到ADC引脚,可以读取音频信号,并在MicroPython中进行音频处理、录制或分析。
控制系统:ADC模块可用于监测外部信号,如电压、电流或位置反馈。这对于构建闭环控制系统非常有用,可以读取传感器信号并根据需要采取控制操作。

需要注意的事项:

引脚选择:在使用Teensy 4.1的ADC模块时,需要注意正确选择ADC引脚。确保将模拟信号连接到正确的引脚,并在MicroPython代码中指定正确的引脚编号。
参考电压:ADC模块通常需要一个参考电压来将模拟信号转换为数字值。在使用ADC之前,需要设置正确的参考电压值,以确保精准的模数转换。
采样率和分辨率:在设计应用时,需要根据需求选择适当的采样率和分辨率。较高的采样率可以提供更精细的信号采集,但可能会占用更多的系统资源。同样,较高的分辨率可以提供更高的精度,但也可能需要更多的计算资源。
信号处理和滤波:在使用ADC模块读取模拟信号后,可能需要进行信号处理和滤波来减少噪音和提取有用的信息。MicroPython提供了丰富的库和函数,可以在代码中实现这些信号处理算法。

总结:
MicroPython的Teensy 4.1ADC模块具有高分辨率、多通道、快速采样率和可编程增益等特点。它在传感器数据采集、声音处理和控制系统等应用中非常有用。在使用时需要注意选择正确的引脚、设置参考电压以及合适的采样率和分辨率。同时,可能需要进行信号处理和滤波来优化数据。

在这里插入图片描述
案例1:读取模拟输入值

import machine
import time

adc = machine.ADC(machine.Pin(32))  # 创建一个ADC对象,连接到GPIO32引脚
adc.atten(machine.ADC.ATTN_11DB)  # 设置ADC的衰减为11dB

while True:
    value = adc.read()  # 读取ADC的值
    print("ADC Value:", value)
    time.sleep(1)  # 延时1秒

解读:这个程序首先导入了machine模块和time模块。然后,创建了一个ADC对象,连接到GPIO32引脚。接着,设置了ADC的衰减为11dB。在while循环中,不断地读取ADC的值,并打印出来。每次读取之间延时1秒。

案例2:多个ADC通道读取

import machine
import time

adc1 = machine.ADC(machine.Pin(32))  # 创建一个ADC对象,连接到GPIO32引脚
adc2 = machine.ADC(machine.Pin(33))  # 创建一个ADC对象,连接到GPIO33引脚
adc1.atten(machine.ADC.ATTN_11DB)  # 设置ADC1的衰减为11dB
adc2.atten(machine.ADC.ATTN_11DB)  # 设置ADC2的衰减为11dB

while True:
    value1 = adc1.read()  # 读取ADC1的值
    value2 = adc2.read()  # 读取ADC2的值
    print("ADC1 Value:", value1, "ADC2 Value:", value2)
    time.sleep(1)  # 延时1秒

解读:这个程序创建了两个ADC对象,分别连接到GPIO32和GPIO33引脚。然后,分别设置了这两个ADC的衰减为11dB。在while循环中,不断地读取这两个ADC的值,并打印出来。每次读取之间延时1秒。

案例3:使用DMA进行连续读取

import machine
import time

adc = machine.ADC(machine.Pin(32))  # 创建一个ADC对象,连接到GPIO32引脚
adc.atten(machine.ADC.ATTN_11DB)  # 设置ADC的衰减为11dB

buffer = bytearray(4)  # 创建一个长度为4的字节数组,用于存储ADC读取的数据
dma = machine.DMA(dma_channel=machine.DMA.CHANNEL_0)  # 创建一个DMA对象,设置为通道0

def callback(arg):
    buffer[index] = adc.read()  # 将ADC读取的数据存储到字节数组中
    index += 1
    if index == len(buffer):
        dma.transfer(buffer, 0)  # 完成DMA传输,将数据写入内存
        index = 0

dma.init(callback)  # 初始化DMA,设置回调函数
dma.start(0)  # 启动DMA,传输数据通道为0

while True:
    time.sleep(1)  # 延时1秒

解读:这个程序创建了一个ADC对象和一个DMA对象。首先,设置了ADC的衰减为11dB。然后,创建了一个长度为4的字节数组,用于存储ADC读取的数据。接着,创建了一个DMA对象,设置为通道0。定义了一个回调函数,用于将ADC读取的数据存储到字节数组中。当所有数据都存储到字节数组后,调用dma.transfer()方法将数据写入内存。最后,初始化DMA并启动DMA传输。在主循环中,每隔1秒执行一次操作。

案例4:读取模拟输入并打印到串口监视器

import machine  
adc = machine.ADC(0)  # 使用ADC0通道  
  
while True:  
    value = adc.read()  # 读取模拟值  
    print(value)        # 打印到串口监视器

要点解读:此代码使用ADC0通道创建一个ADC对象,并在无限循环中读取模拟值并打印到串口监视器。通过观察串口监视器上的输出,可以了解模拟输入的变化。

案例5:读取模拟输入并控制LED亮度

import machine  
adc = machine.ADC(0)  # 使用ADC0通道  
pin = machine.Pin(13, machine.Pin.OUT)  # 使用GPIO13引脚作为LED输出  
  
while True:  
    value = adc.read()  # 读取模拟值  
    brightness = value / 65535 * 100  # 将模拟值映射为0-100的亮度值  
    pin.value(brightness)             # 设置LED亮度

要点解读:此代码使用ADC0通道创建一个ADC对象,并使用GPIO13引脚创建一个输出引脚对象。在无限循环中,读取模拟值并将其映射为0-100的亮度值,然后通过设置LED的亮度来控制其发光强度。

案例6:使用中断读取模拟输入

import machine  
adc = machine.ADC(0)  # 使用ADC0通道  
  
def adc_callback(adc, value):  
    print(value)  # 打印模拟值到串口监视器  
  
adc.irq(trigger=machine.ADC.IRQ_THRESHOLD, threshold=3000, callback=adc_callback)  # 设置阈值为3000,当模拟值超过该阈值时触发中断

要点解读:此代码使用ADC0通道创建一个ADC对象,并定义一个回调函数adc_callback,该函数在中断触发时被调用。通过adc.irq()方法设置阈值为3000,当模拟值超过该阈值时触发中断,并调用回调函数打印模拟值到串口监视器。这种方式可以实现实时监测模拟输入并在特定条件下触发中断。

案例7:一个代码案例是使用ADC读取一个模拟温度传感器的输出电压,并将其转换为摄氏温度。这个案例使用了machine.Pin和machine.ADC类,以及math模块。要点如下:
创建一个Pin对象,指定引脚号和模式为输入。
创建一个ADC对象,指定引脚对象和分辨率(默认为12位)。
使用ADC对象的read方法读取模拟值,返回一个0到4095之间的整数。
使用math模块的log函数计算温度传感器的热敏电阻值,根据其参数和公式1。
使用线性插值法将热敏电阻值转换为摄氏温度2。
打印或显示温度值。

from machine import Pin, ADC
import math

# create a pin object for the analog temperature sensor
pin = Pin('A0', Pin.IN)

# create an ADC object for the pin
adc = ADC(pin)

# read the analog value from the pin
value = adc.read()

# calculate the thermistor resistance value
R = 10000 * value / (4095 - value)

# calculate the temperature in Celsius using the B-parameter equation
T0 = 298.15 # reference temperature in Kelvin
B = 3435 # B-parameter of the thermistor
R0 = 10000 # reference resistance at T0
T = 1 / (1/T0 + math.log(R/R0) / B) # temperature in Kelvin
T = T - 273.15 # temperature in Celsius

# print or display the temperature value
print(T)

案例8:使用ADC读取一个模拟声音传感器的输出电压,并将其转换为分贝(dB)值。这个案例使用了machine.Pin和machine.ADC类,以及math模块。要点如下:
创建一个Pin对象,指定引脚号和模式为输入。
创建一个ADC对象,指定引脚对象和分辨率(默认为12位)。
使用ADC对象的read方法读取模拟值,返回一个0到4095之间的整数。
使用math模块的log10函数计算声音传感器的输出电压值,根据其参数和公式3。
使用线性插值法将电压值转换为分贝(dB)值4。
打印或显示分贝(dB)值。

from machine import Pin, ADC
import math

# create a pin object for the analog sound sensor
pin = Pin('A1', Pin.IN)

# create an ADC object for the pin
adc = ADC(pin)

# read the analog value from the pin
value = adc.read()

# calculate the sound sensor output voltage value
V = value * 3.3 / 4095

# calculate the sound level in decibels (dB) using the formula
S = 20 * math.log10(V / 0.006)

# print or display the sound level value
print(S)

案例9:使用ADC读取一个模拟光敏电阻的输出电压,并根据其变化控制一个LED灯的亮度。这个案例使用了machine.Pin和machine.ADC类,以及machine.PWM类。要点如下:
创建一个Pin对象,指定引脚号和模式为输入。
创建一个ADC对象,指定引脚对象和分辨率(默认为12位)。
创建另一个Pin对象,指定引脚号和模式为输出。
创建一个PWM对象,指定引脚对象和频率(默认为500Hz)。
使用ADC对象的read方法读取模拟值,返回一个0到4095之间的整数。
使用PWM对象的duty方法设置占空比,根据模拟值的大小调节LED灯的亮度。
使用time模块的sleep方法设置延时,以便观察LED灯的变化。

from machine import Pin, ADC, PWM
import time

# create a pin object for the analog light sensor
pin = Pin('A2', Pin.IN)

# create an ADC object for the pin
adc = ADC(pin)

# create another pin object for the LED
pin = Pin('D13', Pin.OUT)

# create a PWM object for the pin
pwm = PWM(pin)

# loop forever
while True:
    # read the analog value from the pin
    value = adc.read()

    # set the duty cycle of the PWM according to the analog value
    pwm.duty(value // 16)

    # delay for 0.1 second
    time.sleep(0.1)

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值