在BBC上microPython中的write_analog:bit不会做任何事

时间:2017-08-07 06:46:55

标签: javascript micropython bbc-microbit

我有一个简单的一行micro:bit javascript可以工作,但是microPython中的同一行没有。

我有一个电位器连接到micro:位,电位器的读数被发送到连接到LED的引脚,以控制LED的亮度。 javascript代码

        pins.analogWritePin(AnalogPin.P1, pins.analogReadPin(AnalogPin.P0))

这是块码工作正常的结果,LED的亮度随着电位器的变化而变化。

但使用类似的microPython线

    pin1.write_analog(pin0.read_analog())

会改变LED的强度。

关于这里发生了什么的任何想法?

2 个答案:

答案 0 :(得分:2)

你的micropython代码很好,孤立无援。在隔离的情况下,我可以执行一次读取和一次写入,因此按比例调暗连接到引脚1和地的LED,一次。但需要考虑的背景。

您是否在没有睡眠的紧密循环中重复执行该行(并且没有其他耗时的操作)?喜欢这个?

#This will not work
from microbit import *
while True:
    pin1.write_analog(pin2.read_analog())

当我测试上述情况时,LED无法调暗。只需在循环中添加50-100毫秒的休眠即可解决此问题。

#This will work
from microbit import *
while True:
    pin1.write_analog(pin2.read_analog()) 
    sleep(50)

请注意,这与用户模拟的上述解决方案相同。

pin1.write_analog(v)实际上没有在引脚上设置模拟电压,它通过使用PWM波形来模拟它,该波形在其周期的百分比中是高的,与您期望的模拟&#成比例39;电压,其余周期为低电压。

我怀疑你在再次拨打write_analog()之前没有时间让这个波形完成一个循环,所以你永远不会看到整个波形。每次调用write_analog()时,PWM波形可能会再次以高电平重新开始 - 我不知道。如果是这样,那就意味着你会看到一个不断设置为高的波形,所以只有3.3v常数。不是你想要的。

在对同一个analog_write()的调用之间保持睡眠会让你达到预期的调光。 (或者,找到另一种避免频繁调用analog_write()的方法。)

也许你的javascript版本没有这个问题,因为它的执行速度足够慢,以便在再次更改之前重复PWM波形。

请注意,您可以通过给出1ms的周期来加速PWM波形: pin1.set_analog_period(1)。在我的测试中,这在一定程度上改善了一些事情,但并不像在write_analog的调用之间留出更多时间那么好。你还需要在两次通话之间留出至少1ms的时间。

这里有关于micro:bit IO引脚和PWM http://microbit-micropython.readthedocs.io/en/latest/pin.html

的文档

答案 1 :(得分:1)

我得到了以下关于micro:bit的macython。我将引脚0连接到一侧带有电位计的电阻桥,这样我就可以改变引脚0上的电压。我将引脚1连接到一个LED,其中一个电阻串联到地。我还用Fluke万用表测量了引脚0和引脚1上的电压,它们匹配良好。我可以看到LED的强度因调节电位器而变化。

from microbit import *

while True:
    pin1.write_analog(pin0.read_analog())
    sleep(100)