【雕爷学编程】MicroPython手册之 哥伦布 STM32F407 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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
哥伦布(Columbus)是指STMicroelectronics推出的一款微控制器系列,其中STM32F407是该系列中的一款型号。下面是关于STM32F407微控制器的详细技术参数:

1、核心处理器:
ARM Cortex-M4核心,具有单周期乘法和硬件除法指令支持。
最高频率可达168 MHz,提供快速的计算和执行能力。
2、存储和存储器:
1 MB的Flash存储器,用于程序代码的存储。
192 KB的SRAM,用于数据存储和变量缓存。
可选的外部存储器接口(如SD卡、NAND闪存等)。
3、外设:
多个通用输入/输出引脚(GPIO):用于连接外部设备和传感器。
多个串行通信接口:包括USART、SPI和I2C等,用于与其他设备进行通信。
USB接口:用于连接外部设备,如计算机或其他USB设备。
定时器和计数器:包括通用定时器、高级定时器和基本定时器,用于定时和计数操作。
模数转换器(ADC):用于模拟信号的采样和转换。
数字模拟转换器(DAC):用于数字信号的模拟输出。
PWM输出:用于产生脉冲宽度调制信号,控制电机和其他执行器。
外部中断:用于检测和响应外部触发事件。
4、电源和时钟:
工作电压范围:通常为1.8V至3.6V,具体型号可能有所不同。
内部时钟源:包括高精度内部振荡器(HSI)和外部晶体振荡器(HSE)。
低功耗模式:支持多种低功耗模式,以延长电池寿命或降低功耗。
5、封装和引脚:
可用的封装类型:LQFP、LFBGA等。
引脚数量和配置:具体取决于型号和封装类型。
6、开发支持:
提供开发工具链和集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench等。
支持多种编程语言,如C和汇编语言。
提供丰富的开发文档、参考手册和示例代码。

需要注意的是,以上列出的技术参数是一般性的描述,具体的技术参数可能因具体的STM32F407型号和封装类型而有所不同。对于特定型号和应用场景,建议查阅STMicroelectronics官方文档和相关资料以获取准确和详尽的技术参数。

在这里插入图片描述
MicroPython的哥伦布(STM32F407)开发板支持脉宽调变(PWM)功能,下面将以专业的视角为您详细解释脉宽调变的主要特点、应用场景以及需要注意的事项。

主要特点:

脉冲宽度可调:PWM可以通过调整脉冲的宽度来控制输出信号的占空比。开发者可以根据需要自由地设置脉冲的宽度,从而实现对输出信号的精确控制。

高精度输出:哥伦布开发板的PWM模块通常具备高精度的输出能力,可以提供较高的分辨率和频率。这使得PWM在需要精确控制输出信号的应用中非常有用,如电机速度控制、LED亮度调节等。

多通道支持:哥伦布开发板通常具有多个PWM通道,可以同时控制多个输出信号。每个通道都可以独立设置占空比和频率,以满足不同输出需求,如多路电机控制、多个LED灯的独立调光等。

应用场景:

电机控制:PWM广泛应用于电机控制领域。通过调整PWM信号的占空比,可以精确控制电机的转速和转向。这在机器人、无人机、工业自动化等领域中非常常见。

LED调光:PWM也常用于LED灯的亮度调节。通过改变PWM信号的占空比,可以实现对LED灯的平滑调光,从而满足不同场景下的照明需求。

声音生成:PWM还可以用于声音的生成。通过调整PWM信号的频率和占空比,可以产生不同音调和音量的声音信号。这在电子琴、报警器、语音合成等应用中常见。

需要注意的事项:

输出电平范围:在使用PWM时,需要注意输出电平范围的限制。通常,PWM输出的高电平和低电平由供电电压确定,开发者需要根据具体情况选择适当的电平范围。

输出负载能力:PWM模块的输出引脚通常有一定的负载能力限制。在选择PWM输出引脚时,需要确保其能够提供足够的电流和驱动能力,以满足连接设备的需求。

频率和分辨率选择:在设置PWM时,需要根据实际应用需求选择适当的频率和分辨率。较高的频率和分辨率可以提供更精细的控制精度,但同时也增加了计算和处理的工作量。

综上所述,MicroPython的哥伦布开发板支持脉宽调变(PWM)功能,具有脉冲宽度可调、高精度输出和多通道支持等特点。PWM广泛应用于电机控制、LED调光、声音生成等场景。在使用PWM时,需要注意输出电平范围、输出负载能力以及频率和分辨率的选择。

案例一:控制LED灯亮度

from machine import Pin, PWM
import time

# 定义引脚和PWM对象
led_pin = Pin(5, Pin.OUT)
pwm = PWM(led_pin, freq=1000)

# 设置占空比,范围为0-1023
duty_cycle = 0
pwm.duty(duty_cycle)

# 循环改变占空比,实现LED灯亮度变化
while True:
    for duty_cycle in range(0, 1024, 10):
        pwm.duty(duty_cycle)
        time.sleep(0.1)
    for duty_cycle in range(1023, -1, -10):
        pwm.duty(duty_cycle)
        time.sleep(0.1)

要点解读:
导入所需的库:machine、Pin、PWM、time。
定义引脚和PWM对象,这里使用STM32F407的GPIO5引脚,频率为1000Hz。
设置初始占空比为0。
通过循环改变占空比,实现LED灯亮度的变化。

案例二:控制舵机角度

from machine import Pin, PWM
import time

# 定义引脚和PWM对象
servo_pin = Pin(6, Pin.OUT)
pwm = PWM(servo_pin, freq=50)

# 设置占空比,范围为0-1023
duty_cycle = 512
pwm.duty(duty_cycle)

# 循环改变占空比,实现舵机角度变化
while True:
    for duty_cycle in range(512, 2560, 512):
        pwm.duty(duty_cycle)
        time.sleep(0.1)
    for duty_cycle in range(2560, 512, -512):
        pwm.duty(duty_cycle)
        time.sleep(0.1)

要点解读:
导入所需的库:machine、Pin、PWM、time。
定义引脚和PWM对象,这里使用STM32F407的GPIO6引脚,频率为50Hz。
设置初始占空比为512。
通过循环改变占空比,实现舵机角度的变化。

案例三:控制电机转速

from machine import Pin, PWM
import time

# 定义引脚和PWM对象
motor_pin = Pin(7, Pin.OUT)
pwm = PWM(motor_pin, freq=1000)

# 设置占空比,范围为0-1023
duty_cycle = 0
pwm.duty(duty_cycle)

# 循环改变占空比,实现电机转速变化
while True:
    for duty_cycle in range(0, 1024, 10):
        pwm.duty(duty_cycle)
        time.sleep(0.1)
    for duty_cycle in range(1023, -1, -10):
        pwm.duty(duty_cycle)
        time.sleep(0.1)

要点解读:
导入所需的库:machine、Pin、PWM、time。
定义引脚和PWM对象,这里使用STM32F407的GPIO7引脚,频率为1000Hz。
设置初始占空比为0。
通过循环改变占空比,实现电机转速的变化。

案例四:控制LED的亮度

import pyb

led_pin = pyb.Pin('PB0', pyb.Pin.OUT)
pwm = pyb.Timer(2, freq=1000)
ch = pwm.channel(1, pyb.Timer.PWM, pin=led_pin)

while True:
    for duty_cycle in range(0, 100, 5):
        ch.pulse_width_percent(duty_cycle)
        pyb.delay(100)

要点解读:
该程序使用MicroPython在STM32F407上使用PWM控制LED的亮度。
使用pyb模块的Pin类初始化一个Pin对象,'PB0’表示使用PB0引脚控制LED输出。
使用pyb模块的Timer类初始化一个Timer对象,并设置频率为1000Hz。
使用channel()方法创建一个PWM通道对象,将通道号和引脚对象传递给它。
在一个无限循环中,通过调整占空比(从0%到95%以5%的步长),控制LED的亮度。
使用delay()函数延时100毫秒,使每个亮度级别保持一段时间。

案例五:驱动舵机

import pyb

servo_pin = pyb.Pin('PA0', pyb.Pin.OUT)
pwm = pyb.Timer(3, freq=50)  # 频率为50Hz
ch = pwm.channel(1, pyb.Timer.PWM, pin=servo_pin)

while True:
    ch.pulse_width_percent(5)  # 5%的占空比
    pyb.delay(1000)
    ch.pulse_width_percent(10)  # 10%的占空比
    pyb.delay(1000)

要点解读:
该程序使用MicroPython在STM32F407上使用PWM驱动舵机。
使用pyb模块的Pin类初始化一个Pin对象,'PA0’表示使用PA0引脚控制舵机。
使用pyb模块的Timer类初始化一个Timer对象,并设置频率为50Hz。
使用channel()方法创建一个PWM通道对象,将通道号和引脚对象传递给它。
在一个无限循环中,通过调整占空比,控制舵机的位置。例如,使用5%的占空比将舵机转到一个位置,然后使用10%的占空比将舵机转到另一个位置。
使用delay()函数延时1秒,使舵机在每个位置保持一段时间。

案例六:控制电机的转速

import pyb

motor_pin = pyb.Pin('PA0', pyb.Pin.OUT)
pwm = pyb.Timer(4, freq=10000)  # 频率为10kHz
ch = pwm.channel(2, pyb.Timer.PWM, pin=motor_pin)

while True:
    for duty_cycle in range(0, 100, 10):
        ch.pulse_width_percent(duty_cycle)
        pyb.delay(1000)

要点解读:
该程序使用MicroPython在STM32F407上使用PWM控制电机的转速。
使用pyb模块的Pin类初始化一个Pin对象,'PA0’表示使用PA0引脚控制电机。
使用pyb模块的Timer类初始化一个Timer对象,并设置频率为10kHz。
使用channel()方法创建一个PWM通道对象,将通道号和引脚对象传递给它。
在一个无限循环中,通过调整占空比(从0%到90%以10%的步长),控制电机的转速。
使用delay()函数延时1秒,使每个转速级别保持一段时间。
这些案例展示了在STM32F407上使用MicroPython编程语言实现PWM(脉宽调变)的实际应用。您可以根据具体的硬件和需求进行适当的调整和扩展。

案例七:控制LED亮度:

import pyb

led = pyb.LED(1)  # 使用LED1
timer = pyb.Timer(4, freq=1000)

channel = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.D13)
channel.pulse_width_percent(50)  # 设置占空比为50%

while True:
    pass

要点解读:
该代码使用pyb模块控制STM32F407上的PWM输出,通过改变占空比来控制LED的亮度。
使用pyb.LED(1)创建一个LED对象,指定要控制的LED引脚(这里使用LED1)。
使用pyb.Timer(4, freq=1000)创建一个定时器对象,指定定时器编号和频率(这里使用定时器4和频率为1000Hz)。
使用timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.D13)创建一个PWM通道对象,指定通道编号、PWM模式和引脚(这里使用通道2、PWM模式和D13引脚)。
使用channel.pulse_width_percent(50)设置PWM的占空比为50%。
在主循环中,使用空操作pass来保持程序运行,以保持PWM输出的稳定。
这个示例演示了如何使用PWM控制LED的亮度,通过改变PWM的占空比来调节LED的亮度。

案例八:控制舵机角度:

import pyb

servo = pyb.Servo(1)  # 使用X1引脚

while True:
    servo.angle(0)
    pyb.delay(1000)
    servo.angle(90)
    pyb.delay(1000)
    servo.angle(180)
    pyb.delay(1000)

要点解读:
该代码使用pyb模块控制STM32F407上的PWM输出,通过改变占空比来控制舵机的角度。
使用pyb.Servo(1)创建一个Servo对象,指定要控制的舵机引脚(这里使用X1引脚)。
在主循环中,交替设置舵机的角度为0度、90度和180度,并延迟1秒。
这个示例演示了如何使用PWM控制舵机的角度,通过改变PWM的占空比来调节舵机的角度。

案例九:控制蜂鸣器频率:

import pyb

buzzer = pyb.Buzzer(2)  # 使用BUZZ引脚

while True:
    buzzer.freq(1000)
    buzzer.on()
    pyb.delay(1000)
    buzzer.off()
    pyb.delay(1000)

要点解读:
该代码使用pyb模块控制STM32F407上的PWM输出,通过改变PWM的频率来控制蜂鸣器的声音。
使用pyb.Buzzer(2)创建一个Buzzer对象,指定要控制的蜂鸣器引脚(这里使用BUZZ引脚)。
在主循环中,设置蜂鸣器的频率为1000Hz,然后打开蜂鸣器,持续1秒后关闭蜂鸣器,再延迟1秒。
这个示例演示了如何使用PWM控制蜂鸣器的频率,通过改变PWM的频率来调节蜂鸣器的声音。
这些示例代码展示了MicroPython在哥伦布(STM32F407)上使用PWM的实际运用。第一个示例演示了如何通过改变PWM的占空比来控制LED的亮度,第二个示例演示了如何通过改变PWM的占空比来控制舵机的角度,第三个示例演示了如何通过改变PWM的频率来控制蜂鸣器的声音。通过这些示例,您可以了解如何使用pyb模块在哥伦布(STM32F407)上实现PWM输出,从而控制不同外部设备的亮度、角度和频率。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值