K210 PWM 介绍

该文介绍了如何使用K210芯片的PWM功能来驱动无源蜂鸣器发出不同频率的声音,以及实现呼吸灯效果。通过定时器资源,设置PWM的频率和占空比,实验详细解释了PWM的工作原理,并提供了具体的Python代码示例来控制蜂鸣器和调节LED的亮度以实现呼吸灯效果。
摘要由CSDN通过智能技术生成

六、PWM

(一)实验目的

通过不同频率的PWM信号输出,驱动无源蜂鸣器发出不同频率的声音。

(二)实验讲解

1.K210定时器资源

PWM: 脉宽调制模块, 硬件支持的PWM, 可以指定任意引脚(0到47引脚)

每个 PWM 依赖于一个定时器, 即当定时器与 PWM 功能绑定后, 不能作为普通定时器使用了。 因为有 3 个定时器, 每个定时器有 4 个通道, 即最大可以同时产生 12 路 PWM 波形

2.PWM介绍

PWM(脉冲宽度调制)就是一个特定信号输出,主要用于输出不同频率、占空比(一个周期内高电平出现时间占总时间比例)的方波。以实现固定频率或平均电压输出。

在这里插入图片描述

3.蜂鸣器介绍

蜂鸣器分有源蜂鸣器和无源蜂鸣器,有源蜂鸣器的使用方式非常简单,只需要接上电源,蜂鸣器就发声,断开电源就停止发声。而本实验用到的无源蜂鸣器,是需要给定指定的频率,才能发声的,而且可以通过改变频率来改变蜂鸣器的发声音色,以此来判定 pyAI-K210的 PWM输出频率是在变化的。pyBase开发底板上的无源蜂鸣器连接到引脚 X5。如下图所示:

在这里插入图片描述

而pyAI-K210并没有引脚直接连接到 pyBase的 X5(主要避免影响 IO复用。)而 IO15连接到 pyBase开发底板的 X6引脚,因此我们可以用跳线帽或者跳线来连接 pyBase的 X5和 X6引脚。相当于将无源蜂鸣器接到 pyAI-K210的外部 IO15引脚。

在这里插入图片描述

4.函数调用

(1)构造函数

machine.PWM(tim, freq, duty, pin, enable=True)

通过指定的参数新建一个 PWM 对象

  • tim: 每个PWM依赖一个定时器来产生波形, 所以这里需要传一个定时器对象,这个定时器对象必须初始化时必须指定定时器 ID 和通道号

  • freq: PWM 波形频率

  • duty: PWM 占空比, 指高电平占整个周期的百分比,取值:[0,100]

  • [pin]: PWM 输出引脚。 可以不设置,而是使用 fm 统一管理引脚映射。

  • enable: 是否立即开始产生波形,默认位True,及对象生成后立即开始在指定的引脚上产生 PWM 波形

(2)使用方法

  • 获取或者设置 PWM 频率
pwm.freq(freq)

freq: PWM 频率, 可选参数, 如果不传参数则步设置只返回当前频率值

  • 获取或者设置 PWM 占空比
pwm.duty(duty)

duty: PWM 占空比 可选, 如果不传参数则步设置只返回当前占空比值

  • 使能 PWM 输出, 使指定的引脚上立即产生波形
pwm.enable()
  • 失能 PWM 输出, 指定的引脚不再产生波形
pwm.disable()
  • 注销 PWM 硬件,释放占用的资源,关闭 PWM 时钟
pwm.deinit()

(三)代码

1、通过不同频率的 PWM 信号输出,驱动无源蜂鸣器发出不同频率的声音。

无源蜂鸣器我们可以用特定频率的方波来驱动,方波的原理很简单,就是一定频率的高低电平转换,可以简单理解成占空比为 50%的 PWM输出。

在这里插入图片描述

结合上述讲解,总结出代码编写流程图如下:
在这里插入图片描述

# 引入模块
from machine import Timer,PWM
import time

#PWM通过定时器配置,接到IO15引脚
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
#             定时器0        通道0            PWM模式
beep = PWM(tim, freq=1, duty=50, pin=15)
#               PWM频率  占空比     IO15

#循环发出不同频率响声。
while True:
    beep.freq(200) # 设置PWM频率为200-
    time.sleep(1) #延时1秒

    beep.freq(400)
    time.sleep(1)

    beep.freq(600)
    time.sleep(1)

    beep.freq(800)
    time.sleep(1)

    beep.freq(1000)
    time.sleep(1)

2.呼吸灯

from machine import Timer,PWM
import time

tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
ch = PWM(tim, freq=500000, duty=50, pin=12)
duty=0
dir = True
while True:
    if dir:
        duty += 10
    else:
        duty -= 10
    if duty>100:
        duty = 100
        dir = False
    elif duty<0:
        duty = 0
        dir = True
    time.sleep(0.05)
    ch.duty(duty)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

命运从未公平

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

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

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

打赏作者

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

抵扣说明:

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

余额充值