Большее временное разрешение при использовании .NET Micro Framework на плате Netduino (для затемнения светодиода)?

StackOverflow https://stackoverflow.com/questions/4320572

Вопрос

я программирую Нетдуино плата, использующая .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 (что в основном основано на вашем ПК), или на устройстве, на котором работает код ( У кого будет пространство имен, кроме системы, например)?

Шинь - это хороший способ управления током постоянного тока (путем изменения ширины импульса), но изменение частоты ШИМ все равно будет функцией времени в конце дня.

Вместо того, чтобы использовать задержки .... как сон .... вы можете вымочить нить и заставить ее управлять яркостью. Использование сна до сих пор является процедурным методом прямой линии, и ваш код сможет сделать это только в том случае, если вы используете один поток.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top