这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » 基于K230DBOX的PWM调节及舵机控制

共1条 1/1 1 跳转至

基于K230DBOX的PWM调节及舵机控制

助工
2026-08-13 21:32:31     打赏

K230D 开发板提供了PWM调节功能,且有相应的例程可供学习。

利用PWM5,可调节蓝色LED的亮度,利用亮度周期性的强弱变换,即可形成呼吸灯效果。当然,如果引入SIN函数,也可呈现SIN函数的变换规律。

以呼吸灯效果为例,其程序为:

from machine import Pin, PWM
from machine import FPIOA
import time
# 实例化FPIOA
fpioa = FPIOA()
# 为IO分配相应的硬件功能
fpioa.set_function(59,FPIOA.PWM5)
# 构造PWM对象
Pwm5 = PWM(5, 200, duty=50, enable=True)
duty = 50
fx = 0
while True:
    if duty == 0:
        fx = 0
    if duty == 100:
        fx = 1
    if fx == 0:
        duty = duty + 10
    if fx == 1:
        duty = duty - 10
    Pwm5.duty(duty)
    time.sleep_ms(500)

经程序的运行,其测试效果见图1至图3所示。

image.png

1 熄灭LED

image.png

2 弱光

image.png

4 强光

 

当然,也可用来控制蜂鸣器,其程序为:

from machine import Pin, PWM
from machine import FPIOA
import time
# 实例化FPIOA
fpioa = FPIOA()
# 为IO分配相应的硬件功能
fpioa.set_function(60,FPIOA.PWM0)
# 构造PWM对象
pwm0 = PWM(0, 200, duty=50, enable=True)
duty = 50
fx = 0
while True:
    if duty == 0:
        fx = 0
    if duty == 100:
        fx = 1
    if fx == 0:
        duty = duty + 10
    if fx == 1:
        duty = duty - 10
    pwm0.duty(duty)
time.sleep_ms(500)

既然能调节蓝色LED的亮度,那就应该可以调节红色LED的亮度。

于是,照猫画虎地,将fpioa.set_function(59,FPIOA.PWM5)改为:

pioa.set_function(61,FPIOA.PWM5)

但执行时,却报错。

通过仔细分析才发现,他们是已经绑定,不能随便使用。

在使用以下程序后,终于可以调节红色LED度啦!

from machine import Pin, PWM
from machine import FPIOA
import time
# 实例化FPIOA
fpioa = FPIOA()
# 为IO分配相应的硬件功能
fpioa.set_function(61,FPIOA.PWM0)
# 构造PWM对象
Pwm1 = PWM(1, 200, duty=50, enable=True)
duty = 50
fx = 0
while True:
    if duty == 0:
        fx = 0
    if duty == 100:
        fx = 1
    if fx == 0:
        duty = duty + 10
    if fx == 1:
        duty = duty - 10
    Pwm1.duty(duty)
time.sleep_ms(500)

你知道其秘密在哪儿吗?

原来一切都藏在这里,见图5所示。

image.png

5 PWM通道与引脚关系 

了解了这些,我们该如何控制舵机呢?

因为,这些PWM资源的引脚均未引出,故无法借用。

仔细查看原理图后,终于找到了希望,见图6所示。

image.png

6 其它PWM资源 

稍感遗憾的是GPIO7GPIO8均未连接到扩展接口,故无法使用。

唯一的独苗只剩下了GPIO25,其使用按键控制舵机的程序为:

from machine import PWM
from machine import FPIOA
import time
from machine import Pin
# 实例化FPIOA
fpioa = FPIOA()
# 为IO分配相应的硬件功能
fpioa.set_function(34, FPIOA.GPIO34)
fpioa.set_function(0, FPIOA.GPIO0)
# 构造GPIO对象
key0 = Pin(34, Pin.IN, pull=Pin.PULL_UP, drive=7)
fpioa.set_function(25,FPIOA.PWM5)
pwm5 = PWM(5, 50, duty=10, enable=True)
duty = 3 
pwm5.duty(duty)
f=1
while True:
    # 读取按键状态
    if key0.value() == 0:
        duty=(duty+1) % 13
        if duty==0 :
           duty=3
        pwm5.duty(duty)
        print(duty)
        while True:
            if key0.value() == 1:
               break
time.sleep_ms(20)

经程序的运行,其测试效果见图8至图10所示。

image.png

7 连接形式

image.png

8 小摆角

image.png

9 中摆角

image.png

10 大摆角 

这样,就终于解决了舵机控制的问题。

当然,用它也可以控制风扇,其程序为:

from machine import PWM
from machine import FPIOA
import time
from machine import Pin
# 实例化FPIOA
fpioa = FPIOA()
# 为IO分配相应的硬件功能
fpioa.set_function(34, FPIOA.GPIO34)
fpioa.set_function(0, FPIOA.GPIO0)
# 构造GPIO对象
key0 = Pin(34, Pin.IN, pull=Pin.PULL_UP, drive=7)
fpioa.set_function(25,FPIOA.PWM5)
pwm5 = PWM(5, 50, duty=10, enable=True)
duty =0 
pwm5.duty(duty)
f=1
while True:
    # 读取按键状态
    if key0.value() == 0:
        duty=(duty+10) % 101
        if duty==0 :
           duty=30
        pwm5.duty(duty)
        print(duty)
        while True:
            if key0.value() == 1:
               break
    time.sleep_ms(20)

经程序的运行,其测试效果见图12所示。

image.png

11 连接形式

image.png

12 运行状态 

总之,使用PWM调节的场合还是比较多的。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]