我正在使用.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
即使有另一种方法可以通过不使用更长的时间分辨率来完成调光,我也是游戏。
答案 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基本上仍然是一个直线程序方法,如果使用单个线程,您的代码将只能执行此操作。