笔者手中恰好有一款树莓派PICO的板子,正好也想学习和使用,所以今天就来写写
以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平
假设高电平为5V,低电平则为0V,那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。
我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压
比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压,那么75%的占空比,得到的电压就是3.75V。
machine.PWM(Pin) #指定GPIO重新初始化
PWM。init(channel,freq,duty) #根据输入的参数初始化PWM对象
PWM.deinit() #用于关闭PWM对象,对对象deinit之后需要重新init才能使用
PWM.freq([value]) #用于获取或者设置 PWM 对象的频率,频率的范围为 [1, 156250]。
PWM.duty_u16([value]) #用于设置占空比,数值应在0-65536之间
PWM.duty_ns([value]) #用于设置高电平的时间
#该示例效果为LED灯逐渐点亮和熄灭
from machine import Pin,PWM
import utime
LED = PWM(Pin(25))
LED.freq(1000)
LED_duty = 0
LED_direction = 1
while True:
LED_duty += LED_direction
if LED_duty >= 100:
LED_duty = 100
LED_direction = -1
elif LED_duty <= 0:
LED_duty = 0
LED_direction = 1
LED.duty_u16(int(LED_duty * 655.36)) #使得LED灯点亮的关键参数,如果未设置LED的占空比,则无法点亮LED灯
if LED_duty%5 == 0:
print(LED_duty)
utime.sleep(0.1)
Thonny绘图器所展示的效果图:
#该示例效果为每秒点亮和熄灭LED灯
from machine import Pin,PWM
import utime
led = PWM(Pin(25))
led.freq(1000)
led_duty = 0
while True:
if led_duty >= 1:
led_duty = 0
led.duty_u16(65536) #设置为高电平
utime.sleep(1)
print(led_duty)
elif led_duty <= 0:
led_duty = 1
led.duty_u16(0) #设置为低电平
utime.sleep(1)
print(led_duty)
utime.sleep(0.5)
Thonny绘图器所展示的效果图: