Edison上程序开发——如何使用PWM
在Edison上,PWM的使用跟Arduino相比,稍微复杂了一点点,但是如果掌握了其中“奥秘”就很简单了。下面就来教大家这个“奥秘”。
最基本的用法呢,其实就只要理解两个概念:周期(period)
+---------+ +----------+ |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
+ +---------+ +---------+
^ ^
| |
|<------ 周期 ------>|
| ^ |
| | |
|
pwm.period_us(5000)
这里个人认为周期多少都无妨,PWM印象中挺好的脉冲频率,这里5000微秒,或者使用period_ms(5) 5毫秒
第二个概念:duty (占空比):
+---+ +---+
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+ +----------------+ +------------------+
^ ^
| |
|<->|
^
|
|
pwm.write(0.2)
这里write的参数就是占空比,就是矩形波信号每个周期内高电平时间与一个周期(高低电平总时间)的比值.
0.2的意思是,在一个周期内有 五分之一 的时间是高电平,剩下的时间是低电平。
好了,完全理解的这两个概念,下面可以实战了!
#!/usr/bin/python
import mraa
import time
PWM_PIN = 5
pwm = mraa.Pwm(PWM_PIN)
pwm.period_us(5000) # Set the period as 5000 us or 5ms
pwm.enable(True) # enable PWM
value = 0
delta = 0.05 # Used to manipulate duty cycle of the pulse
while 1:
if (value >= 1):
# Itensity at max, need to reduce the duty cycle, set -ve delta
value = 1
delta = -0.05
elif (value <=0):
value = 0
# Intensity at lowest, set a +ve delta
delta = 0.05
pwm.write(value) # Set the duty cycle
value = value + delta
time.sleep(0.5)
如果一切顺利,那么接在第5个pin脚的点击应该奔腾起来了啊!
技术贴 我坐沙发 大连林海 发表于 2015-10-23 10:31
技术贴 我坐沙发
明明是艺术贴!你看我那两个图画的是不是很艺术啊?!一目了然啊! 孙毅 发表于 2015-10-23 11:13
明明是艺术贴!你看我那两个图画的是不是很艺术啊?!一目了然啊!
别美跳舞去 找陈老师要钢管{:5_168:} 本帖最后由 lianuo 于 2015-10-28 10:59 编辑
多谢楼主,这个pwm的周期和脉宽有限制么?可以用来驱动舵机么? lianuo 发表于 2015-10-28 10:31
多谢楼主,这个pwm的周期和脉宽有限制么?可以用来驱动舵机么?
舵机必须可以啊,没问题,只是忘记具体角度是如何控制的了,但用PWM是确定的。
啊,关于周期和脉宽。。。好问题——我也不确定的问题就是好问题,吼吼。
Arduino的PWM可以支持的频率。。。。好像是xxxx/s,上岁数了,这些个细节总要查下才能知道。嘻嘻。我觉得,如果超过了支持的频率上线,多半就是按照最高频率吧,也就是最小周期了。 脉宽的话,就是占空比 0~1 这个没什么限制吧 我在程序里面加入了pulsewidth_us(1000);用于实时控制脉宽,不过好像还没起作用,不知道是哪里的问题。
另外楼主的pin取值是5,这个值对应的是板子上的哪个针脚呢? 我明白了,write和pulsewidth_us(1000);都可以控制脉宽,只是我刚才设置的针脚不对,所以没出来结果。 lianuo 发表于 2015-10-30 17:14
我明白了,write和pulsewidth_us(1000);都可以控制脉宽,只是我刚才设置的针脚不对,所以没出来结果。 ...
官方文档写的不够清楚,恩,我觉得你是对的。
那个pulsewidth 看上去就像脉宽的实际时间。给力!
页:
[1]