【雕爷学编程】MicroPython手册之 MIMXRT 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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
MIMXRT(NXP i.MX RT)是一系列基于Arm Cortex-M7/M4内核的高性能微控制器系列。这些微控制器广泛应用于物联网、工业自动化、消费电子、医疗设备等领域。它们具有以下共同的特点:

1、处理器:MIMXRT系列使用了基于ARM Cortex-M7的i.MX RT交叉处理器,它们具有微控制器的功能,速度与微型计算机相当。它们的运行频率从500 MHz到1 GHz不等,可提供高达4000 DMIPS的性能,以及浮点运算单元和加密加速器。
2、内存:MIMXRT系列配备了不同容量的SRAM和闪存,从128 KB到5 MB不等,以满足不同的应用需求。部分型号还支持添加更多的QSPI内存芯片。
3、I/O引脚:MIMXRT系列提供了丰富的数字输入/输出引脚,支持PWM输出和模拟输入。它们还提供了多个串口,SPI端口,I2C端口,I2S/TDM数字音频端口,CAN总线(部分支持CAN FD),以及SDIO原生SD卡端口。
4、以太网:部分MIMXRT型号包含了一个以太网控制器和一个以太网PHY芯片,支持10/100 Mbit或1 Gbit/sec的速度。它们还支持时间敏感网络(TSN)协议,实现实时网络集成。
5、USB主机:部分MIMXRT型号提供了一个USB主机端口,支持480 Mbit/sec的速度。它们可以连接USB设备,如键盘、鼠标、MIDI设备等。
6、RTC:部分MIMXRT型号支持实时时钟(RTC),可以通过连接一个3V纽扣电池来保持日期和时间。
7、LED:部分MIMXRT型号有一个内置的GPIO指示灯LED,连接在引脚13上。
8、图形:部分MIMXRT型号配备了2D图形加速器(GPU),支持并行或MIPI显示屏接口。
9、音频:部分MIMXRT型号集成了Cadence Tensilica HiFi 4或Fusion F1 DSP核心,支持高性能音频处理。

在这里插入图片描述
MicroPython是一种基于Python语言的嵌入式系统开发工具,适用于微控制器和小型计算机等资源受限设备。MIMXRT是一款i.MX RT系列微控制器,支持MicroPython。在MicroPython中,MIMXRT的PWM(脉宽调制)功能提供了精确控制输出信号的能力。

MIMXRT PWM的主要特点如下:

脉宽调制:PWM是一种通过调整脉冲的宽度来控制输出信号的技术。MIMXRT的PWM功能可以生成具有可变脉冲宽度的周期性信号,用于控制外部设备的电压、电流或频率等参数。

精度和分辨率:MIMXRT的PWM通常提供高精度和高分辨率的输出控制。它可以实现微小的脉冲宽度调整,从而提供精确的输出控制能力。

多通道输出:PWM通常支持多通道输出,即可以同时控制多个输出通道。这使得MIMXRT可以同时控制多个外部设备,或者实现复杂的控制功能。

频率设置:PWM的输出信号具有可调的频率,可以根据具体应用需求进行设置。频率的选择取决于被控制设备的响应特性和应用的实时性要求。

MIMXRT PWM的应用场景如下:

电机控制:PWM广泛应用于电机控制领域。通过调整PWM的脉冲宽度和频率,可以精确控制电机的转速、方向和扭矩,实现精密的电机控制。

LED亮度调节:PWM可以用于调节LED的亮度。通过改变PWM信号的脉冲宽度,可以实现对LED的亮度精确控制,从而满足不同场景下的照明需求。

声音合成:PWM可以用于音频合成应用。通过控制PWM信号的频率和脉冲宽度,可以产生不同频率和音调的声音信号,用于音乐合成、声音效果生成等应用。

需要注意的事项:

输出电平和电流:在使用PWM时,需要注意输出信号的电平和电流规格。确保PWM输出与被控制设备的电平和电流要求匹配,以避免设备损坏或不正常工作。

信号滤波:PWM信号的频率较高,可能会引入噪声干扰或电磁干扰。在实际应用中,可能需要进行信号滤波或屏蔽,以提高信号的质量和稳定性。

分辨率设置:PWM的分辨率决定了输出信号的精度。在使用PWM时,需要根据具体应用需求进行分辨率的设置,以平衡控制精度和资源消耗。

总而言之,MIMXRT微控制器上的PWM功能为MicroPython开发者提供了精确控制输出信号的能力。它具有脉宽调制、精度和分辨率、多通道输出以及可调频率等特点,可应用于电机控制、LED亮度调节、声音合成等场景。在使用PWM时,需要注意输出电平和电流、信号滤波以及分辨率设置等方面的注意事项,以确保正确的输出控制和应用效果。

案例一:使用 PWM 控制 LED 灯

from machine import Pin, MIMXRT
import time

# 定义引脚
led_pin = Pin(12, Pin.OUT)
pwm_pin = Pin(13, Pin.OUT)

# 初始化 MIMXRT 对象
uart = MIMXRT(uart_pin=17, baudrate=9600, tx=17, rx=16)
gpio = MIMXRT(Pin(4), baudrate=9600, tx=17, rx=16)

# 设置 PWM 频率和占空比
frequency = 1000
duty_cycle = 50

# 启动 PWM
pwm = gpio.pwm(pwm_pin, frequency, duty_cycle)

# 控制 LED 灯
while True:
    pwm.duty(duty_cycle)
    time.sleep(1)
    pwm.duty(0)
    time.sleep(1)

要点解读:这个程序与第一个案例类似,首先导入了Pin和MIMXRT类,然后定义了一个LED灯的引脚和一个PWM的引脚。接着,使用这两个引脚初始化了一个MIMXRT对象。最后,程序使用gpio对象的pwm()方法创建一个PWM对象,并使用该对象的duty()方法来控制LED灯的亮度。在每次循环中,程序将PWM的占空比设置为50%,等待1秒钟,然后将PWM的占空比设置为0%,再等待1秒钟。

案例二:使用 PWM 控制蜂鸣器发声

from machine import Pin, MIMXRT
import time

# 定义引脚
buzzer_pin = Pin(12, Pin.OUT)
pwm_pin = Pin(13, Pin.OUT)

# 初始化 MIMXRT 对象
uart = MIMXRT(uart_pin=17, baudrate=9600, tx=17, rx=16)
gpio = MIMXRT(Pin(4), baudrate=9600, tx=17, rx=16)

# 设置 PWM 频率和占空比
frequency = 1000
duty_cycle = 50

# 启动 PWM
pwm = gpio.pwm(pwm_pin, frequency, duty_cycle)

# 控制蜂鸣器发声
while True:
    pwm.duty(duty_cycle)
    time.sleep(1)
    pwm.duty(0)
    time.sleep(1)

要点解读:这个程序与第二个案例类似,首先导入了Pin和MIMXRT类,然后定义了一个蜂鸣器的引脚和一个PWM的引脚。接着,使用这两个引脚初始化了一个MIMXRT对象。最后,程序使用gpio对象的pwm()方法创建一个PWM对象,并使用该对象的duty()方法来控制蜂鸣器的发声。在每次循环中,程序将PWM的占空比设置为50%,等待1秒钟,然后将PWM的占空比设置为0%,再等待1秒钟。

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

from machine import Pin, MIMXRT
import time

# 定义引脚
motor_pin = Pin(12, Pin.OUT)
pwm_pin = Pin(13, Pin.OUT)

# 初始化 MIMXRT 对象
uart = MIMXRT(uart_pin=17, baudrate=9600, tx=17, rx=16)
gpio = MIMXRT(Pin(4), baudrate=9600, tx=17, rx=16)

# 设置 PWM 频率和占空比
frequency = 500
duty_cycle = 50

# 启动 PWM
pwm = gpio.pwm(pwm_pin, frequency, duty_cycle)

# 控制电机转速
while True:
    pwm.duty(duty_cycle)
    time.sleep(1)
    pwm.duty(0)
    time.sleep(1)

要点解读:这个程序与第三个案例类似,首先导入了Pin和MIMXRT类,然后定义了一个电机的引脚和一个PWM的引脚。接着,使用这两个引脚初始化了一个MIMXRT对象。最后,程序使用gpio对象的pwm()方法创建一个PWM对象,并使用该对象的duty()方法来控制电机的转速。在每次循环中,程序将PWM的占空比设置为50%,等待1秒钟,然后将PWM的占空比设置为0%,再等待1秒钟。

案例四:控制LED的亮度:

from machine import PWM

# 创建PWM对象
pwm = PWM(2)

# 配置PWM参数
pwm.freq(1000)  # 设置PWM频率为1kHz

# 控制LED亮度
duty_cycle = 50  # 设置初始占空比为50%
pwm.duty_u16(int(duty_cycle * 65535 / 100))  # 将占空比转换为16位无符号整数

# 调整亮度
while True:
    duty_cycle = int(input("请输入占空比(0-100):"))
    pwm.duty_u16(int(duty_cycle * 65535 / 100))

要点解读:
machine.PWM类用于创建PWM对象。
在上述示例中,创建了一个PWM对象 pwm,指定PWM的编号为2。
使用pwm.freq()方法设置PWM的频率。
使用pwm.duty_u16()方法设置PWM的占空比,将占空比的百分比值转换为16位无符号整数。
通过输入不同的占空比值,可以实时调整LED的亮度。

案例五:使用PWM控制舵机:

from machine import PWM

# 创建PWM对象
pwm = PWM(1)

# 配置PWM参数
pwm.freq(50)  # 设置PWM频率为50Hz

# 控制舵机角度
angle = 0  # 设置初始角度为0度
pwm.duty_ns(500000 + angle * 20000)  # 将角度转换为纳秒级的占空比值

# 调整角度
while True:
    angle = int(input("请输入角度(0-180):"))
    pwm.duty_ns(500000 + angle * 20000)

要点解读:
在上述示例中,创建了一个PWM对象 pwm,指定PWM的编号为1。
使用pwm.freq()方法设置PWM的频率。
使用pwm.duty_ns()方法设置PWM的占空比,将角度值转换为纳秒级的占空比值。
通过输入不同的角度值,可以实时控制舵机的角度。

案例六:使用PWM生成音频信号:

from machine import PWM

# 创建PWM对象
pwm = PWM(2)

# 配置PWM参数
pwm.freq(440)  # 设置PWM频率为440Hz

# 生成音频信号
while True:
pwm.duty_u16(32767)  # 设置占空比为50%

要点解读:
在上述示例中,创建了一个PWM对象 pwm,指定PWM的编号为2。
使用pwm.freq()方法设置PWM的频率,可以根据需要设置不同的音调。
使用pwm.duty_u16()方法设置PWM的占空比,通过设置不同的占空比值可以生成不同的音频信号。
在该示例中,将占空比设置为50%,持续生成音频信号。这些示例代码展示了MicroPython在MIMXRT上使用PWM的常见用法。根据具体的应用需求,你可以根据这些示例进行进一步的修改和扩展。

案例七:使用machine模块实现LED呼吸灯效果

import machine  
import time  
  
led = machine.Pin(2, machine.Pin.OUT)  
pwm = machine.PWM(led)  
pwm.freq(1000) # 设置PWM频率为1kHz  
  
while True:  
    for i in range(100):  
        pwm.duty(i)  
        time.sleep(0.01)  
    for i in range(100, 0, -1):  
        pwm.duty(i)  
        time.sleep(0.01)

要点解读:此代码使用machine模块实现LED呼吸灯效果。首先,将引脚2配置为输出模式,并将其连接到LED。然后,使用machine模块的PWM类初始化PWM,并设置PWM频率为1kHz。在while循环中,通过改变PWM的占空比来改变LED亮度。首先,将占空比从0增加到100,每次增加1,并使LED亮度逐渐增加;然后,将占空比从100减少到0,每次减少1,并使LED亮度逐渐减少。注意,这里使用了machine模块和time模块,需要先安装这些模块。在实际应用中,可以根据需要修改和扩展此代码,例如改变PWM频率、添加多个LED等功能。

案例八:使用machine模块实现电机调速

import machine  
import time  
  
motor_pin = machine.Pin(3, machine.Pin.OUT)  
pwm = machine.PWM(motor_pin)  
pwm.freq(50) # 设置PWM频率为50Hz  
  
while True:  
    for i in range(100):  
        pwm.duty(i)  
        time.sleep(0.1)  
    for i in range(100, 0, -1):  
        pwm.duty(i)  
        time.sleep(0.1)

要点解读:此代码使用machine模块实现电机调速。首先,将引脚3配置为输出模式,并将其连接到电机。然后,使用machine模块的PWM类初始化PWM,并设置PWM频率为50Hz。在while循环中,通过改变PWM的占空比来改变电机转速。首先,将占空比从0增加到100,每次增加1,并使电机转速逐渐增加;然后,将占空比从100减少到0,每次减少1,并使电机转速逐渐减少。注意,这里使用了machine模块和time模块,需要先安装这些模块。在实际应用中,可以根据需要修改和扩展此代码,例如改变PWM频率、添加多个电机等功能。

案例九:使用machine模块实现蜂鸣器播放音乐

import machine  
import time  
  
buzzer_pin = machine.Pin(4, machine.Pin.OUT)  
pwm = machine.PWM(buzzer_pin)  
pwm.freq(440) # 设置PWM频率为440Hz,对应音乐的A音高  
  
music = [440, 494, 523, 587, 659, 698, 784, 880] # 音乐的简谱对应的频率列表  
duration = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1] # 每个音符的持续时间列表  
  
for i in range(len(music)):  
    pwm.freq(music[i]) # 设置PWM频率为当前音符的频率  
    time.sleep(duration[i]) # 等待当前音符的持续时间

要点解读:此代码使用machine模块实现蜂鸣器播放音乐。首先,将引脚4配置为输出模式,并将其连接到蜂鸣器。然后,使用machine模块的PWM类初始化PWM,并设置PWM频率为440Hz,对应音乐的A音高。接着,定义了一个音乐的简谱对应的频率列表和一个每个音符的持续时间列表。在for循环中,遍历音乐列表和持续时间列表,通过改变PWM的频率来播放当前音符,并使用time模块的sleep方法等待当前音符的持续时间。注意,这里使用了machine模块和time模块,需要先安装这些模块。在实际应用中,可以根据需要修改和扩展此代码,例如改变音乐列表、添加更多音符等功能。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和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、付费专栏及课程。

余额充值