我正在编程 Netduino 使用.NET Micro Framework 4.1登机,并希望获得比毫秒更高的时间分辨率。这是因为我试图通过闪烁的眨眼来调暗领导者。

问题是示例代码使用 线程(..) 花费了许多毫秒。

示例代码来自 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

即使有另一种方法可以通过不使用更大的时间分辨率来完成调度,我也会进行游戏。

有帮助吗?

解决方案

这不会回答您有关解决时间更好的时间的问题,但它确实可以通过更改亮度来解决您的问题 引领. 。您应该使用 PWM NetDuino的模块。

NetDuino基础知识:使用脉冲宽度调制(PWM) 是关于如何使用它的精彩文章。

其他提示

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

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

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

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

计时器上的间隔属性是双重的,因此您的时间少于毫秒。

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

在他的评论中 Seidleroni的答案 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;
    }
}

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

向前迈进,我建议您花一点时间来限定您在代码中使用的信息的来源 - 是.NET适当(从根本上是基于您的PC),或者代码正在运行的设备(例如,哪个将具有除系统以外的名称空间)?

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

与其使用延误。...喜欢睡觉。...您可能想产生线程并使其管理亮度。使用睡眠基本上仍然是一种直线程序方法,您的代码只能在使用单个线程时完成这件事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top