2010-12-01 1 views
9

Ich programmiere ein Netduino Board mit dem .NET Micro Framework 4.1 und möchte eine höhere Zeitauflösung als Millisekunden erhalten. Dies liegt daran, dass ich versuche, eine LED zu dimmen, indem ich sie sehr schnell blinkle.Höhere Zeitauflösung mit .NET Micro Framework auf Netduino Board (zum Dimmen einer LED)?

Das Problem besteht darin, dass der Beispielcode Thread.Sleep(..) verwendet, der eine Anzahl von Millisekunden dauert.

Beispielcode aus 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 durch den Verzicht auf eine größere Zeitauflösung zu erreichen, Dimmen, ich bin Spiel.

+0

Persönlich würde ich Hardware verwenden und mit ihm über SPI oder I2C sprechen zB http://www.ltech.cn/english/product/DMX-512-Driver.html –

Antwort

17

diese Antwort Ihre Frage nicht über eine bessere zeitliche Auflösung bekommen, aber es Ihr Problem löst mit auf einer LED die Helligkeit zu verändern. Sie sollten das Modul PWM für das Netduino verwenden.

Netduino Basics: Using Pulse Width Modulation (PWM) ist ein großer Artikel, wie man es benutzt.

+0

Ich werde wahrscheinlich während meiner nächsten Elektronik-Klasse in das Modul pwm schauen und es dann aktualisieren Faden. Vielen Dank. –

+0

Netduino 2 können Sie nun einen PWM-Kanal mit der On-Board-LED verwenden. –

3

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

Die Interval-Eigenschaft eines Timers ist doppelt, sodass Sie weniger als eine Millisekunde darauf haben können.

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

+0

Sehr guter Rat.Ich werde es versuchen. –

+0

Ich habe das upgestimmt, bevor ich es getestet habe ... oops. Das Intervall ist eigentlich entweder ein int oder ein TimeSpan und sieht so aus, als hätte es auch eine ms Auflösung. Daher denke ich nicht, dass dies eine gültige Lösung für John ist. – Dave

+0

Ich nehme das zurück - während ich es noch testen muss, gibt eine der anderen Antworten an, dass Sie die Anzahl der Ticks pro ms bekommen können, und an meiner Tafel bekomme ich 10.000 zurück. Also 10 Ticks pro Sekunde ist nicht zu schäbig (; wenn es tatsächlich funktioniert) :) – Dave

8

Ich hatte in der Vergangenheit ein ähnliches Problem und verwendete die folgende Methode, um im Mikrosekundenbereich zu messen. Die erste Zeile bestimmt, wie viele Ticks in einer Millisekunde sind (es ist eine Weile her, seit ich das benutzt habe, aber ich glaube, 1 Tick war 10 Mikrosekunden). In der zweiten Zeile wird angezeigt, wie lange 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; 
} 
+0

NETMF scheint nicht den Timer-Konstruktor zu unterstützen, der ein TimeSpan-Objekt akzeptiert, was es John erlauben würde, den Zeitraum in Ticks festzulegen. – Dave

+0

Das funktioniert super, habe gerade eine schnelle Wait-Funktion geschrieben. Dave, was rauchst du? NETMF unterstützt nicht nur einen TimeSpan im Konstruktor eines Timers (siehe die Überladungen, bro), aber das ist für diese Lösung völlig irrelevant. Setzen Sie sich einfach in eine Warteschleife und warten Sie, bis die gewünschte Anzahl von Ticks verstrichen ist. Siehe die Funktion, die ich in der Bearbeitung hinzugefügt habe. – BrainSlugs83

+1

Handy zu wissen, aber persönlich würde ich immer noch PWM für die LED-Sache verwenden. –

0

In seinem Kommentar zu Seidleroni's answer BrainSlugs83 schlägt vor, „in einem langen Schleife sitzen und für die gewünschte Anzahl der Ticks warten verstreichen. Die Funktion Ich sehe in der Edit hinzugefügt“. Aber ich kann die Funktion, die der Bearbeitung hinzugefügt wurde, nicht sehen. Ich nehme an, es so etwas wie dies 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; 
    } 
} 
0

Ein Punkt, dass man nicht darüber nachdenken könnte, ist, dass der Code auf dem .NET-Namespace System setzt, die auf der Echtzeit-Uhr in Ihrem PC basieren. Beachten Sie, dass die Antworten auf den Timer im Gerät angewiesen sind.

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

PWM ist eine gute Möglichkeit, den Gleichstrom künstlich zu steuern (durch Variieren der Pulsbreite), aber das Variieren der PWM-Frequenz ist immer noch eine Funktion der Zeit am Ende des Tages.

Anstatt Verzögerungen zu verwenden .... wie Schlaf .... möchten Sie vielleicht einen Thread spawnen und es die Helligkeit verwalten lassen. Das Verwenden von Sleep ist im Grunde immer noch eine geradlinige prozedurale Methode und Ihr Code wird nur in der Lage sein, dies zu tun, wenn Sie einen einzelnen Thread verwenden.

Verwandte Themen