资讯详情

MicroPython内核开发笔记书内软件用例 :PWM部分实验用例

简 介: 本文给出了 中的PWM软件用例部分内容。

书稿内容
目 录 Contents
基础实验
输出基本波形
动态改变占空比
动态改变频率
控制舵机
总 结
存在问题
调用 pwm.init错误
PWM 通道个 数只有6个
PWM端口

 

  • 本书稿内容隶属于 中的内容。

 

§01 稿内容


当前版本的 PWM 总共有 6 个通道,它们分别对应的管脚为:

  • PWM0:PA8
  • PWM1:PA0
  • PWM2:PA2
  • PWM3:PA3
  • PWM4:PA6
  • PWM5:PA7

在 REPL 交互式窗口输入一下指令,可以查看到六个 PWM 通道属性以及提供的调用函数。

from machine                import PWM

for i in range(6):
    print(PWM(i, freq=10000, duty=200))

dir(PWM(0,freq=10000,duty=200))

命令执行结果为:

set freq.
PMW(0, freq=10000, duty=200), on Pin(PA8)
PMW(1, freq=10000, duty=200), on Pin(PA0)
PMW(2, freq=10000, duty=200), on Pin(PA2)
PMW(3, freq=10000, duty=200), on Pin(PA3)
PMW(4, freq=10000, duty=200), on Pin(PA6)
PMW(5, freq=10000, duty=200), on Pin(PA7)
set freq.
['deinit', 'duty', 'freq', 'init']

PWM 模块主要调用函数包括:

  • init:PWM 初始化;
  • deinit:PWM 功能关闭,这个函数在改变PWM频率的时候使用;
  • freq:改变 PWM 频率;
  • duty:改变 PWM 占空比;

由于实现机制影响,在本文中的 PWM 模块的频率设定存在一定的误差。如果需要获得更加精确的 PWM 信号的频率可以参照 第 十六章中 使用 mem32 内存直接访问提高 PWM 频率精度。

一、基础实验

1、输出基本波形

下面代码初始化 PWM 通道1,2, 分别占用PA0,PA2 管脚。

from machine                import PWM

pwm0 = PWM(1, freq=10000, duty=200)
pwm1 = PWM(2, freq=10000, duty=500)

print(pwm0)
print(pwm1)

print('Test PWM.')

while True:
	pass

每个PWM输出频率为 10kHz,占空比分别为 20%,50%。 下图是示波器采集到的PWM1,PWM2的输出波形。

▲ PWM1,PWM2波形

2、动态改变占空比

使用 pwm.duty() 来动态改变 PWM 的占空比。 输入数值从 0 ~ 1000 对应占空比 从 0 到 100%。

下面 示例程序动态改变 pwm 输出占空比。

from machine                import PWM
import time

pwm0 = PWM(1, freq=10000, duty = 1)

duty = 1
dutyinc = 50
incdir = 0

while True:
    if incdir == 0:
        duty += dutyinc
        if duty >= 1000:
            duty = 1000
            incdir = 1
    else:
        if duty < dutyinc:
            duty = 1
            incdir = 0
        else: duty -= dutyinc
    pwm0.duty(duty)

    time.sleep_ms(20)

通过示波器可以观察到 pwm0 输出的占空比在 0 ~ 100% 之间周期进行变化。

3、动态改变频率

如果需要动态改变 pwm 频率,可以重新使用 定义语句对 PWM 进行初始化。比如

pwm0 = PWM(1, freq=10000, duty = 200)
pwm0 = PWM(1, freq=5000, duty = 500)

最终 pwm0 的频率定义为 5kHz,占空比为 500。

二、控制舵机

1、摆动舵机

第一个舵机端口使用了 A8,使用了 PWM 0 通道。下面利用 PWM 0 通道控制舵机的运行。

▲ 图1.2.1 PLUS-F3270上的舵机端口

下面程序设置在舵机输出端口1 输出 频率为 100 Hz的 舵机控制信号。根据 PWM 占空比设置方法可以知道, duty 的每个数值单位对应 0.01ms,输出 PWM 脉冲宽度为 1.5ms时,设定 duty 取值为 150。

程序每隔 500ms, 将舵机控制脉冲宽度在 1ms 与 2ms 之间进行切换。对应舵机输出角度在最左边与最右边进行来回摆动。

from machine                import Pin,PWM
import time

pwm0 = PWM(0, freq=100, duty = 150)

while True:
    pwm0.duty(200)
    time.sleep_ms(500)
    pwm0.duty(100)
    time.sleep_ms(500)

▲ 图1.2.2 舵机摆动的过程

2、电位器控制舵机

在 PLUS-F3270 实验电路板上存在一个电位器,它滑动端电压经过 U11 跟随之后连续到 F8。 使用跳线将 F8 与 A0 连接。 通过 ADC 0 通道可以读取电位器电压。

▲ 图1.2.3 PLUS-F3270板载电位器电路

利用电位器电压控制舵机信号脉冲宽度,从 1ms 变化到 2ms, 从而控制舵机输出轴角度。

下面是 MicroPython 程序。

from machine                import ADC,PWM
import time

adc0 = ADC(0, init=True)
servo = PWM(0, freq=100, duty = 150)

print("Using potentiometer to set servo angle.")

while True:
    adv = adc0.read_u16()
    duty = adv * 100 // 0xffff + 100
    servo.duty(duty)

    time.sleep_ms(10)

手动转动电位器,可以看到舵机随之转动。

▲ 图1.2.4 通过电位器控制舵机输出轴角度

 

  结 ※


本文给出了 中的PWM软件用例部分内容。

一、存在问题

1、调用 pwm.init()错误

调用 pwm.init() 函数,程序运行没有错误,但对应的管脚波形没有输出了。比如

pwm0 = PWM(1, freq=10000, duty = 200)
pwm0 = PWM(1, freq=5000, duty = 500)

pwm0.init(freq=5000)

while True:
    pass

对应 PWM 没有波形输出。

2、PWM 通道个数只有6个

现在这个版本中的PWM通道个数只有六个。

3、PWM端口

现在版本的 PWM 所占用的端口做占用的单片机的管脚与 PLUS-F3270 上提供的舵机输出端口存在的差异。

PLUS_F3270 六个舵机端口:A8,A9,A10,B3,B4,B5 MicroPython中六个PWM端口:A8, A0, A2, A3, A6,A7


  • PWM1,PWM2波形

标签: 75mm直滑电位器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台