Größere Zeitauflösung mit .NET Micro Framework auf Netduino Board (zum Dimmen einer LED)?

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

Frage

Ich bin die Programmierung eines Netduino Board mit .NET Micro Framework 4.1 und will eine höhere Zeitauflösung erhalten als Millisekunden. Das ist, weil ich bin versucht, eine LED dimmen, indem sie es wirklich schnell zu blinken.

Das Problem ist, dass der Beispielcode verwendet Thread.Sleep (..) , die eine Anzahl von Millisekunden dauern.

Beispielcode von http://netduino.com/projects/ das Problem in Frage zeigt:

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

Auch wenn es eine andere Möglichkeit ist dimmen zu erreichen, indem nicht eine größere Zeitauflösung verwenden, ich bin Spiel.

War es hilfreich?

Lösung

Dies beantwortet Ihre Frage nicht über eine bessere zeitliche Auflösung bekommen, aber es löst Ihr Problem mit der Helligkeit zu ändern auf LED . Sie sollten die PWM Modul für die Netduino werden.

Netduino Basics: Verwenden von Pulsweitenmodulation ( PWM) ist ein großer Artikel darüber, wie es zu benutzen.

Andere Tipps

Ich habe ein ähnliches Problem in der Vergangenheit hatte und verwenden die folgende Methode zur Zeit im Mikrosekundenbereich. Die erste Zeile legt fest, wie viele Zecken in einer Millisekunde sind (es ist schon eine Weile her, seit ich verwendet, um dieses, aber ich denke, 1 Tick 10 Mikrosekunden war). In der zweiten Zeile wird die Zeit, das System eingeschaltet war (in Ticks). Ich hoffe, das hilft.

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

public static long GetCurrentTimeInTicks()
{
    return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
}

Sie können einen Timer verwenden, um ein Ereignis auszulösen, anstatt schlafen zu verwenden.

Die Interval-Eigenschaft auf einem Timer ist eine doppelte, so dass Sie weniger als eine Millisekunde auf sie haben kann.

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

In seinem Kommentar zu Seidleroni Antwort BrainSlugs83 schlägt vor, „sit in einem langen Schleife und warten, bis die gewünschte Anzahl von Zecken verstreichen. Siehe die Funktion, die ich in der Bearbeitung hinzugefügt“. Aber ich sehe die Funktion nicht auf die Bearbeitung hinzugefügt. Ich nehme an, es so etwas wie dieses wäre:

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;
    }
}

Ein Punkt, dass Sie vielleicht nicht darüber nachdenken, dass Ihr Code auf .NET Namespace System setzt, die auf der Echtzeit-Uhr in Ihrem PC basieren. Beachten Sie, dass die Antworten stützen sich auf den Timer in dem Gerät.

Für die Zukunft würde ich vorschlagen, dass Sie einen Moment Zeit nehmen, um die Quelle der Informationen zu qualifizieren Sie in Ihrem Code verwenden - ist es richtig, .NET (die grundsätzlich auf Ihrem PC basiert), oder das Gerät ist der Code läuft auf (die einen anderen Namensraum als System, zum Beispiel haben)?

PWM ist ein guter Weg, Gleichstrom zu steuern, künstlich (durch die Pulsbreite variiert), aber Variieren die PWM-Frequenz wird immer noch eine Funktion der Zeit sein, am Ende des Tages.

Anstatt Verwendung Verzögerungen .... wie Schlaf .... Sie könnten einen Thread erzeugen wollen und müssen es schaffen, die Helligkeit. Mit Schlaf ist im Grunde immer noch eine gerade Linie Vorgehensweise und der Code nur in der Lage sein, diese eine Sache zu tun, wenn Sie einen einzelnen Thread verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top