在Netduino板上使用.NET Micro Framework实现更长的时间分辨率(用于调暗LED)?

时间:2010-12-01 02:00:06

标签: c# .net-micro-framework netduino

我正在使用.NET Micro Framework 4.1编写Netduino板,并希望获得比毫秒更高的时间分辨率。这是因为我试图通过快速闪烁来调暗LED。

问题是示例代码使用Thread.Sleep(..),这需要花费几毫秒。

来自http://netduino.com/projects/的示例代码,显示了相关问题:

OutputPort ledOnboard = new OutputPort(Pins.ONBOARD_LED, false);
while (true)
{
    ledOnboard.Write(true);
    Thread.Sleep(1); // << PROBLEM: Can only get as low as 1 millisecond

即使有另一种方法可以通过不使用更长的时间分辨率来完成调光,我也是游戏。

5 个答案:

答案 0 :(得分:17)

这不能解答您关于获得更好的时间分辨率的问题,但它确实可以解决您在LED上更改亮度的问题。您应该使用Netduino的PWM模块。

Netduino Basics: Using Pulse Width Modulation (PWM) 是一篇关于如何使用它的精彩文章。

答案 1 :(得分:8)

我过去遇到过类似的问题,并使用以下方法在微秒范围内计时。第一行确定了毫秒内有多少刻度(自从我使用它以来已经有一段时间了,但我认为1刻度是10微秒)。第二行获取系统开启的时间(以滴答为单位)。我希望这会有所帮助。

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

public static long GetCurrentTimeInTicks()
{
    return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
}

答案 2 :(得分:3)

您可以使用计时器来引发事件而不是使用睡眠。

计时器上的Interval属性为double,因此您可以使用不到一毫秒。

http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx

答案 3 :(得分:0)

在他对Seidleroni's answer的评论中,BrainSlugs83建议“坐在一个繁忙的循环中等待所需的滴答数量过去。请参阅我在编辑中添加的功能”。但我看不到添加到编辑中的功能。我认为它会是这样的:

using System;
using Microsoft.SPOT.Hardware;

private static long _TicksPerMicroSecond = TimeSpan.TicksPerMillisecond/1000;

private void Wait(long microseconds)
{
    var then = Utility.GetMachineTime().Ticks;
    var ticksToWait = microseconds * _TicksPerNanoSecond;
    while (true)
    {
        var now = Utility.GetMachineTime().Ticks;
        if ((now - then) > ticksToWait) break;
    }
}

答案 4 :(得分:0)

您可能没有想到的一点是您的代码依赖于.NET System命名空间,该命名空间基于PC中的实时时钟。请注意,答案依赖于设备中的计时器。

继续前进,我建议您花一点时间来验证您在代码中使用的信息来源 - 它是否适合.NET(基本上是基于您的PC),或代码所在的设备运行(例如,它将具有除System之外的命名空间)?

PWM是一种人工控制直流电流的好方法(通过改变脉冲宽度),但在一天结束时改变PWM频率仍然是时间的函数。

而不是使用延迟....就像睡眠....你可能想要产生一个线程并让它管理亮度。使用Sleep基本上仍然是一个直线程序方法,如果使用单个线程,您的代码将只能执行此操作。