Большее временное разрешение при использовании .NET Micro Framework на плате Netduino (для затемнения светодиода)?
-
29-09-2019 - |
Вопрос
я программирую Нетдуино плата, использующая .NET Micro Framework 4.1, и хотите получить временное разрешение выше миллисекунд.Это потому, что я пытаюсь уменьшить яркость светодиода, очень быстро его мигая.
Проблема в том, что пример кода использует 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
Даже если есть другой способ добиться затемнения, не используя большее временное разрешение, я согласен.
Решение
Это не отвечает на ваш вопрос о том, чтобы получить лучшее разрешение времени, но это решает вашу проблему с изменением яркости на ВЕЛ. Отказ Вы должны использовать Шир модуль для NetDuino.
Основы NetDuino: Использование модуляции ширины импульса (ШИМ) это отличная статья о том, как его использовать.
Другие советы
У меня была похожая проблема в прошлом, и я использовал следующий метод для времени в диапазоне микросекунды. Первая линия определяет, сколько клещей находится в миллисекунде (прошло много времени с тех пор, как я использовал это, но я думаю, что 1 тик был 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
В своем комментарии к Ответ Зайдлерони 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, которое основано на часах в реальном времени на вашем ПК. Обратите внимание, что ответы полагаются на таймер на устройстве.
Двигаясь вперед, я бы посоветовал вам потратить время на то, чтобы квалифицировать источник информации, которую вы используете в своем коде - это правильно .NET (что в основном основано на вашем ПК), или на устройстве, на котором работает код ( У кого будет пространство имен, кроме системы, например)?
Шинь - это хороший способ управления током постоянного тока (путем изменения ширины импульса), но изменение частоты ШИМ все равно будет функцией времени в конце дня.
Вместо того, чтобы использовать задержки .... как сон .... вы можете вымочить нить и заставить ее управлять яркостью. Использование сна до сих пор является процедурным методом прямой линии, и ваш код сможет сделать это только в том случае, если вы используете один поток.