使用NetDuino板上的.NET微框架(用于调光LED)的时间分辨率更高?
-
29-09-2019 - |
题
我正在编程 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频率仍然是一天结束时时间的函数。
与其使用延误。...喜欢睡觉。...您可能想产生线程并使其管理亮度。使用睡眠基本上仍然是一种直线程序方法,您的代码只能在使用单个线程时完成这件事。