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所示。

图1 熄灭LED

图2 弱光

图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所示。

图5 PWM通道与引脚关系
了解了这些,我们该如何控制舵机呢?
因为,这些PWM资源的引脚均未引出,故无法借用。
仔细查看原理图后,终于找到了希望,见图6所示。

图6 其它PWM资源
稍感遗憾的是GPIO7和GPIO8均未连接到扩展接口,故无法使用。
唯一的独苗只剩下了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所示。

图7 连接形式

图8 小摆角

图9 中摆角

图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所示。

图11 连接形式

图12 运行状态
总之,使用PWM调节的场合还是比较多的。
我要赚赏金
