K210学习笔记(四)——输出PWM

一、PWM是什么?

PWM一般指脉冲宽度调制,脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。
MAIX BIT上的PWM: 脉宽调制模块, 硬件支持的PWM, 可以指定任意引脚(0到47引脚),每个 PWM 依赖于一个定时器, 即当定时器与 PWM 功能绑定后, 不能作为普通定时器使用了。 因为有 3 个定时器, 每个定时器有 4 个通道, 即最大可以同时产生 12 路 PWM 波形

二、使用

1.构造函数

pwm = 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.方法

1、

pwm.init(tim, freq, duty, pin, enable=True)

类似构造函数

2、

pwm.freq(freq)

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

3、

pwm.duty(duty)

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

4、

pwm.enable()

使能 PWM 输出, 使指定的引脚上立即产生波形

5、

pwm.disable()

失能 PWM 输出, 指定的引脚不再产生波形

6、

pwm.deinit()

注销 PWM 硬件,释放占用的资源,关闭 PWM 时钟

三、RGB呼吸灯

呼吸灯,上电后LED灯渐渐变亮,当达到最亮时保持几秒钟,然后渐渐变暗直到熄灭。熄灭几秒钟后又渐渐由暗变亮,这样一直循环下去。如果循环亮灭的速度刚好和人的呼吸同步,那就是传说中的呼吸灯效果了。这种效果可以通过PWM来实现,通过调节PWM的占空比可以实现亮暗不同程度的变化。

呼吸灯代码

from machine import Timer,PWM
import time


io_led_blue = 14
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
ch = PWM(tim, freq=500000, duty=50, pin=io_led_blue)
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.1)
    ch.duty(duty)

通过在线运行代码后,我们发现蓝灯上电后LED灯渐渐变亮,当达到最亮时,然后渐渐变暗直到熄灭。

呼吸灯

分析代码:
从 machine 包导入Timer,PWM 对象
引入定时器对象
定义一个变量io_led_blue,值为14,即Pin13/IO13, 具体 LED 的引脚连接到了芯片的哪个引脚,请在前面的开发板介绍中看原理图
指定了定时器ID,为定时器0,通道0。
通过不断的改变占空比来来改变高电平的时间,从而改变灯的亮度

四、PWM舵机

舵机的控制:
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

代码

from machine import Timer,PWM
import time

tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
ch = PWM(tim, freq=50, duty=2.5, pin=15)
duty=2
ch.duty(duty)
ch.enable()
while True:
    ch.duty(duty)    
    for x in range(3):
        duty = 2.5 + x*6
        ch.duty(duty)        
        print("duty=",ch.duty())
        time.sleep(3)

运行之后效果,因为条件有限,这个mini板是用来供电的在这里插入图片描述
,舵机的信号线接PIN15,因为分频是在0-100之间,且为整数,所以有些度数不能转到

PWM舵机

总结

学习MAIX BIT的PWM使用方法还是很有必要的,为后面的云台随动打下基础。

猜你喜欢

转载自blog.csdn.net/Thousand_drive/article/details/123863399