【雕爷学编程】MicroPython手册之 Teensy 4.1 PWM(脉宽调制)

在这里插入图片描述
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的Teensy 4.1支持PWM(脉宽调制)功能,它是一种常用的数字信号调制技术。

主要特点:

脉冲宽度调制:PWM是一种通过改变信号的脉冲宽度来调制信号强度或控制信号的占空比的技术。Teensy 4.1的PWM功能可以产生可调节的脉冲宽度,从而实现对输出信号的精确控制。

高分辨率:Teensy 4.1的PWM功能具有高分辨率,可以产生精细的脉冲宽度调制信号。这使得开发者可以实现精确的电平控制,如模拟输出、电机速度控制、LED亮度调节等。

多通道支持:Teensy 4.1的PWM功能支持多个独立的PWM通道,可以同时控制多个输出信号。这种多通道支持使得开发者可以同时控制多个设备或实现复杂的信号调制方案。

应用场景:

模拟输出:PWM信号可以模拟出连续变化的电压或电流。Teensy 4.1的PWM功能可用于模拟输出,例如控制舵机、驱动音频设备、实现电压调节等。

电机控制:PWM信号广泛应用于电机控制领域。通过调节PWM信号的占空比,可以控制电机的转速和转向。Teensy 4.1的PWM功能可用于电机速度调节、步进电机控制等应用。

LED亮度调节:PWM信号可以用于调节LED的亮度。通过改变PWM信号的占空比,可以实现LED灯的亮度变化。Teensy 4.1的PWM功能可用于LED灯亮度调节、RGB灯效控制等。

需要注意的事项:

频率设置:在使用Teensy 4.1的PWM功能时,需要注意设置合适的PWM频率。PWM频率决定了脉冲的重复速率,应根据具体应用需求选择合适的频率。

电流和功率:在使用PWM控制外部设备时,需要注意设备的电流和功率限制。确保PWM输出不超过设备的额定电流和功率,以免损坏设备或引起安全问题。

引脚配置:在使用Teensy 4.1的PWM功能时,需要正确选择和配置相应的引脚。确保将引脚配置为PWM输出模式,并避免与其他功能冲突。

综上所述,MicroPython的Teensy 4.1 PWM具有脉冲宽度调制、高分辨率和多通道支持等特点,适用于模拟输出、电机控制和LED亮度调节等应用场景。在使用PWM时,需要注意频率设置、电流和功率限制,以及引脚配置等事项,以确保精确控制和安全使用Teensy 4.1的PWM功能。

在这里插入图片描述
案例1:使用PWM控制LED亮度

import machine

# 初始化MCU
led = machine.Pin(13, machine.Pin.OUT)
pwm = machine.PWM(led)

# 设置PWM占空比
pwm.duty(50)  # 设置占空比为50%

# 循环控制LED亮度
while True:
    pass

解读:这个程序首先导入了machine模块。然后,我们使用machine.Pin()函数创建一个Pin对象,指定引脚为GPIO13,输出模式为True。接着,我们使用machine.PWM()函数创建一个PWM对象,并将之前创建的Pin对象作为输出引脚。然后,我们使用pwm.duty()函数设置PWM的占空比。最后,我们使用一个无限循环来控制LED的亮度。

案例2:使用PWM控制蜂鸣器音量

import machine

# 初始化MCU
buzzer = machine.Pin(12, machine.Pin.OUT)
pwm = machine.PWM(buzzer)

# 设置PWM频率和占空比
frequency = 1000  # 设置频率为1kHz
duty_cycle = 50  # 设置占空比为50%
pwm.freq(frequency)
pwm.duty_u16(duty_cycle & 0xFFFF)

# 循环控制蜂鸣器音量
while True:
    pass

解读:这个程序首先导入了machine模块。然后,我们使用machine.Pin()函数创建一个Pin对象,指定引脚为GPIO12,输出模式为True。接着,我们使用machine.PWM()函数创建一个PWM对象,并将之前创建的Pin对象作为输出引脚。然后,我们使用pwm.freq()函数设置PWM的频率为1kHz,并使用pwm.duty_u16()函数设置PWM的占空比为50%。最后,我们使用一个无限循环来控制蜂鸣器的音量。

案例3:使用PWM控制电机转速

import machine
from machine import Pin, PWM

# 初始化MCU
motor_pin = Pin(5, Pin.OUT)
pwm = PWM(motor_pin)

# 设置PWM频率和占空比
frequency = 1000  # 设置频率为1kHz
duty_cycle = 50  # 设置占空比为50%
pwm.freq(frequency)
pwm.duty_u16(duty_cycle & 0xFFFF)

# 循环控制电机转速
while True:
    pass

解读:这个程序首先导入了machine模块和Pin、PWM类。然后,我们使用Pin()函数创建一个Pin对象,指定引脚为GPIO5,输出模式为True。接着,我们使用PWM()函数创建一个PWM对象,并将之前创建的Pin对象作为输出引脚。然后,我们使用pwm.freq()函数设置PWM的频率为1kHz,并使用pwm.duty_u16()函数设置PWM的占空比为50%。最后,我们使用一个无限循环来控制电机的转速。

案例4:使用PWM控制LED亮度

import machine  
import time  
import pwmio  
  
led = machine.Pin(13, machine.Pin.OUT)  # 将13号引脚配置为输出模式,连接LED  
pwm = pwmio.PWMOut(led, freq=100)  # 将13号引脚配置为PWM输出模式,连接LED,设置PWM频率为100Hz  
  
while True:  
    for duty in range(0, 1024, 64):  # 占空比从0变化到1023,每次变化64  
        pwm.duty_u16(duty)  # 设置PWM占空比,控制LED亮度  
        time.sleep_ms(20)  # 延时20毫秒,等待LED亮度变化到位

要点解读:此代码使用PWM控制LED亮度。首先将13号引脚配置为输出模式,然后将其配置为PWM输出模式,并设置PWM频率为100Hz。在无限循环中,使用for循环控制PWM占空比从0变化到1023,每次变化64,从而控制LED亮度变化。使用time.sleep_ms函数延时20毫秒,等待LED亮度变化到位。

案例5:使用PWM控制电机转速

import machine  
import time  
import pwmio  
  
motor = machine.Pin(5, machine.Pin.OUT)  # 将5号引脚配置为输出模式,连接电机  
pwm = pwmio.PWMOut(motor, freq=50)  # 将5号引脚配置为PWM输出模式,连接电机,设置PWM频率为50Hz  
  
while True:  
    for duty in range(0, 1024, 64):  # 占空比从0变化到1023,每次变化64  
        pwm.duty_u16(duty)  # 设置PWM占空比,控制电机转速  
        time.sleep_ms(20)  # 延时20毫秒,等待电机转速变化到位

要点解读:此代码使用PWM控制电机转速。首先将5号引脚配置为输出模式,然后将其配置为PWM输出模式,并设置PWM频率为50Hz。在无限循环中,使用for循环控制PWM占空比从0变化到1023,每次变化64,从而控制电机转速变化。使用time.sleep_ms函数延时20毫秒,等待电机转速变化到位。

案例6:使用PWM控制蜂鸣器音量

import machine  
import time  
import pwmio  
  
buzzer = machine.Pin(6, machine.Pin.OUT)  # 将6号引脚配置为输出模式,连接蜂鸣器  
pwm = pwmio.PWMOut(buzzer, freq=100)  # 将6号引脚配置为PWM输出模式,连接蜂鸣器,设置PWM频率为100Hz  
  
while True:  
    for duty in range(0, 1024, 64):  # 占空比从0变化到1023,每次变化64  
        pwm.duty_u16(duty)  # 设置PWM占空比,控制蜂鸣器音量  
        time.sleep_ms(20)  # 延时20毫秒,等待蜂鸣器音量变化到位

要点解读:此代码使用PWM控制蜂鸣器音量。首先将6号引脚配置为输出模式,然后将其配置为PWM输出模式,并设置PWM频率为100Hz。在无限循环中,使用for循环控制PWM占空比从0变化到1023,每次变化64,从而控制蜂鸣器音量变化。使用time.sleep_ms函数延时20毫秒,等待蜂鸣器音量变化到位。

案例7:案例一:使用Teensy 4.1的PWM和一个RGB LED灯实现颜色变化的效果1。这个案例中,我们需要导入machine和utime模块,然后创建三个PWM对象,分别指定连接RGB LED灯的红、绿、蓝引脚为5、6、7。接下来,我们定义一个函数set_color,它接受四个参数r, g, b和pwm_list,分别表示红、绿、蓝的亮度值(0-255)和PWM对象列表。在这个函数中,我们将亮度值映射为占空比,并调用PWM对象的duty_u16方法,将占空比输出到RGB LED灯上。最后,我们使用一个while循环,不断地改变颜色值,并调用set_color函数设置颜色。代码如下:

import machine, utime
# 创建PWM对象,连接RGB LED灯的红、绿、蓝引脚为5、6、7
pwm_r = machine.PWM(machine.Pin(5))
pwm_g = machine.PWM(machine.Pin(6))
pwm_b = machine.PWM(machine.Pin(7))
# 将PWM对象放入一个列表中
pwm_list = [pwm_r, pwm_g, pwm_b]

def set_color(r, g, b, pwm_list):
    # 将亮度值映射为占空比
    duty_r = int(r / 255 * 65535)
    duty_g = int(g / 255 * 65535)
    duty_b = int(b / 255 * 65535)
    # 调用PWM对象的duty_u16方法,将占空比输出到RGB LED灯上
    pwm_list[0].duty_u16(duty_r)
    pwm_list[1].duty_u16(duty_g)
    pwm_list[2].duty_u16(duty_b)

while True:
    # 改变颜色值
    for r in range(256):
        # 设置颜色
        set_color(r, 0, 0, pwm_list)
        # 等待一段时间
        utime.sleep_ms(10)
    for g in range(256):
        # 设置颜色
        set_color(255 - g, g, 0, pwm_list)
        # 等待一段时间
        utime.sleep_ms(10)
    for b in range(256):
        # 设置颜色
        set_color(0, 255 - b, b, pwm_list)
        # 等待一段时间
        utime.sleep_ms(10)

案例8:使用Teensy 4.1的PWM和一个舵机实现角度控制2。这个案例中,我们需要导入machine和utime模块,然后创建一个PWM对象,指定连接舵机的引脚为9,并设置频率为50 Hz。接下来,我们定义一个函数set_angle,它接受两个参数angle和pwm,分别表示舵机的角度(0-180)和PWM对象。在这个函数中,我们根据角度计算占空比,并调用PWM对象的duty_u16方法,将占空比输出到舵机上。最后,我们使用一个while循环,不断地改变角度值,并调用set_angle函数设置角度。代码如下:

import machine, utime
# 创建PWM对象,连接舵机的引脚为9,并设置频率为50 Hz
pwm = machine.PWM(machine.Pin(9), freq=50)

def set_angle(angle, pwm):
    # 根据角度计算占空比
    duty = int((angle / 180 * 2000 + 500) / 20000 * 65535)
    # 调用PWM对象的duty_u16方法,将占空比输出到舵机上
    pwm.duty_u16(duty)

while True:
    # 改变角度值
    for angle in range(0, 181, 10):
        # 设置角度
        set_angle(angle, pwm)
        # 等待一段时间
        utime.sleep_ms(500)
    for angle in range(180, -1, -10):
        # 设置角度
        set_angle(angle, pwm)
        # 等待一段时间
        utime.sleep_ms(500)

案例9:使用Teensy 4.1的PWM和一个音频放大器实现音乐播放3。这个案例中,我们需要导入machine和utime模块,然后创建一个PWM对象,指定连接音频放大器的引脚为10,并设置频率为10000 Hz。接下来,我们定义一个列表notes,用来存储音符的频率。然后,我们定义一个函数play_tone,它接受两个参数freq和pwm,分别表示音符的频率和PWM对象。在这个函数中,我们根据频率设置PWM对象的频率,并将占空比设为一半。然后,我们等待一段时间,并将占空比设为0。最后,我们使用一个for循环,依次播放列表中的音符,并调用play_tone函数播放音调。代码如下:

import machine, utime
# 创建PWM对象,连接音频放大器的引脚为10,并设置频率为10000 Hz
pwm = machine.PWM(machine.Pin(10), freq=10000)
# 定义一个列表notes,用来存储音符的频率
notes = [262, 294, 330, 349, 392, 440, 494, 523]
# 定义一个函数play_tone,它接受两个参数freq和pwm,分别表示音符的频率和PWM对象
def play_tone(freq, pwm):
    # 根据频率设置PWM对象的频率
    pwm.freq(freq)
    # 将占空比设为一半
    pwm.duty_u16(32767)
    # 等待一段时间
    utime.sleep_ms(500)
    # 将占空比设为0
    pwm.duty_u16(0)

# 使用一个for循环,依次播放列表中的音符,并调用play_tone函数播放音调
for note in notes:
    play_tone(note, pwm)

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

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值