我有一行简单的 micro:bit javascript 行,但 microPython 中的同一行不行。
我有一个连接到 micro:bit 的电位计,电位计的读数被发送到连接到 LED 的引脚,以控制 LED 的亮度。 javascript代码
pins.analogWritePin(AnalogPin.P1, pins.analogReadPin(AnalogPin.P0))
这是块代码工作正常的结果,LED 的亮度随着电位计的变化而变化。
但是使用类似的 microPython 线
pin1.write_analog(pin0.read_analog())
不是 会改变 LED 的强度。
关于这里发生了什么的任何想法?
最佳答案
你的 micropython 代码行很好,孤立地。孤立地,它对我进行 一次 读取和 一次 写入,结果按比例调暗连接到引脚 1 和接地的 LED, 一次 。但是有上下文需要考虑。
您是否在没有 sleep (也没有其他耗时操作)的紧密循环中重复执行该行?像这样?
#This will not work
from microbit import *
while True:
pin1.write_analog(pin2.read_analog())
当我测试上述内容时,LED 无法变暗。这可以通过在循环中添加 50-100 毫秒的 sleep 来解决。
#This will work
from microbit import *
while True:
pin1.write_analog(pin2.read_analog())
sleep(50)
请注意,这与上述用户模拟的解决方案相同。
pin1.write_analog(v)
实际上并没有在引脚上设置模拟电压,它通过使用 PWM 波形对其进行模拟,该波形在其周期的某个百分比内处于高电平,与您所需的“模拟”电压成正比,而在周期的其余部分则为低电平。我怀疑在再次调用
write_analog()
之前,您没有时间让该波形完成一个循环,因此您永远不会看到整个波形。每次调用 write_analog()
时,PWM 波形可能会再次以高电平重新开始 - 我不知道。如果是这样,则意味着您看到的波形不断设置为高电平,因此只有 3.3v 恒定。不是你想要的。在对同一个 analog_write() 的调用之间保持 sleep 会让你得到你期望的变暗。 (或者,找到另一种方法来避免如此频繁地调用analog_write()。)
也许您的 javascript 版本没有这个问题,因为它的执行速度足够慢,可以在您再次更改之前让 PWM 波形重复。
请注意,您可以通过给它一个 1ms 的周期来加速 PWM 波形:
pin1.set_analog_period(1)
。在我的测试中,这在一定程度上改善了情况,但远不如简单地在调用 write_analog
之间留出更多时间那样好的解决方案。您仍然需要在通话之间至少留出 1 毫秒的时间。这是关于 micro:bit IO 引脚和 PWM http://microbit-micropython.readthedocs.io/en/latest/pin.html 的文档
关于javascript - BBC micro 上的 microPython 中的 write_analog :bit does not do anything,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45540847/