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

Я программирую плату 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

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


person John K    schedule 01.12.2010    source источник
comment
Лично я бы использовал оборудование и общался с ним через SPI или I2C, например ltech .cn/english/product/DMX-512-Driver.html   -  person Peter Wone    schedule 01.04.2012


Ответы (5)


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

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

person superfro    schedule 01.12.2010
comment
Я рассмотрю модуль pwm, вероятно, во время моего следующего урока электроники, а затем обновлю эту тему. Спасибо. - person John K; 02.12.2010
comment
Netduino 2 теперь позволяет использовать ШИМ-канал со встроенным светодиодом. - person Tim Long; 30.01.2015

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

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

public static long GetCurrentTimeInTicks()
{
    return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
}
person Seidleroni    schedule 12.12.2010
comment
NETMF, похоже, не поддерживает конструктор Timer, который принимает объект TimeSpan, что позволило бы Джону установить период в тиках. - person Dave; 22.09.2011
comment
Это отлично работает, просто написал быструю функцию ожидания. Дэйв, что ты куришь? Мало того, что NETMF поддерживает TimeSpan в конструкторе Timer (посмотри на перегрузки, братан), но это совершенно не имеет отношения к этому решению. Просто сидите в занятом цикле и ждите, пока истечет желаемое количество тиков. Смотрите функцию, которую я добавил в редактировании. - person BrainSlugs83; 17.12.2011
comment
Полезно знать, но лично я бы все равно использовал ШИМ для светодиодов. - person Peter Wone; 11.01.2012

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

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

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

person Phill    schedule 01.12.2010
comment
Я проголосовал за это перед тестированием ... упс. Интервал на самом деле представляет собой либо int, либо TimeSpan, и похоже, что он также имеет разрешение в миллисекундах. Таким образом, я не думаю, что это правильное решение для Джона. - person Dave; 21.09.2011
comment
Я беру это обратно - хотя мне все еще нужно это проверить, один из других ответов указывает, что вы можете получить количество тиков в мс, и на моей доске я получаю обратно 10 000. Так что 10 тиков на нас не так уж и плохо (если это действительно работает) :) - person Dave; 21.09.2011
comment
Это на самом деле не сработает. В то время как System.TimeSpan ДЕЙСТВИТЕЛЬНО имеет разрешение менее миллисекунды, оно НЕ будет фактически запускать ваше событие с запрошенным разрешением. Ваше лучшее событие — просмотр Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks в цикле while. Как предложено ниже, TimeSpan имеет статическое свойство, которое сообщит вам, сколько тиков в секунду, миллисекунде, минуте, часе и т. Д. - person BrainSlugs83; 17.12.2011

В своем комментарии к ответу 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;
    }
}
person dumbledad    schedule 18.09.2014

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

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

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

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

person jinzai    schedule 31.05.2015