Большее разрешение по времени при использовании .NET Micro Framework на плате Netduino (для затемнения светодиода)? - PullRequest
9 голосов
/ 01 декабря 2010

Я программирую плату Netduino с использованием .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

Даже если есть другой способ добиться затемнения, не используя большее временное разрешение, я игра.

Ответы [ 5 ]

17 голосов
/ 01 декабря 2010

Это не отвечает на ваш вопрос о том, как получить лучшее разрешение по времени, но это решает вашу проблему с изменением яркости на светодиоде .Вам следует использовать модуль PWM для Netduino.

Основы Netduino: Использование широтно-импульсной модуляции (ШИМ) - отличная статья окак это использовать.

8 голосов
/ 12 декабря 2010

В прошлом у меня была похожая проблема, и я использовал следующий метод для измерения времени в микросекундном диапазоне.Первая строка определяет, сколько тиков в миллисекунде (прошло много времени с тех пор, как я использовал это, но я думаю, что 1 тик был 10 микросекунд).Вторая строка получает количество времени, в течение которого система была включена (в тиках).Надеюсь, это поможет.

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

public static long GetCurrentTimeInTicks()
{
    return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
}
3 голосов
/ 01 декабря 2010

Вы можете использовать таймер, чтобы вызвать событие вместо использования сна.

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

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

0 голосов
/ 01 июня 2015

Вы можете не думать о том, что ваш код основан на пространстве имен .NET System, основанном на часах реального времени на вашем ПК.Обратите внимание, что ответы зависят от таймера в устройстве.

Двигаясь вперед, я бы посоветовал вам уделить время, чтобы определить источник информации, которую вы используете в своем коде - это правильно .NET (Который в основном основан на вашем ПК) или устройстве, на котором работает код (например, который будет иметь пространство имен, отличное от System)?

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

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

0 голосов
/ 18 сентября 2014

В своем комментарии к ответ 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;
    }
}
...