risoluzione temporale maggiore utilizzando .NET Micro Framework a bordo Netduino (per dimming un LED)?

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

Domanda

Sto programmando un href="http://netduino.com/" rel="nofollow"> Netduino bordo utilizzando il .NET Micro Framework 4.1 e vuole ottenere una risoluzione temporale superiore millisecondi. Questo è perché sto tentando di oscurare un LED lampeggia per davvero veloce.

Il problema è che il codice di esempio utilizza Thread.Sleep (..) che prende un numero di millisecondi.

http://netduino.com/projects/ che mostra il problema in questione:

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

Anche se c'è un altro modo per ottenere oscuramento non usando una risoluzione temporale maggiore, sto gioco.

È stato utile?

Soluzione

Questo non risponde alla tua domanda su come ottenere una migliore risoluzione temporale, ma non risolve il problema con il cambiamento della luminosità su un LED . Si deve usare il PWM modulo per il Netduino.

Netduino Nozioni di base: Usando Pulse Width Modulation ( PWM) è un grande articolo su come usarlo.

Altri suggerimenti

Ho avuto un problema simile in passato e utilizzato il seguente metodo per tempo nel range microsecondo. La prima linea determina quanti zecche sono in un millisecondo (suo stato un po 'che ho usato questo, ma penso 1 tick era di 10 microsecondi). La seconda linea diventa la quantità di tempo che il sistema è stato (in tick). Spero che questo aiuta.

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

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

È possibile utilizzare un timer per generare un evento invece di utilizzare il sonno.

La proprietà Interval su un timer è una doppia, quindi si può avere meno di un millisecondo su di esso.

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

Nel suo commento alla risposta di Seidleroni BrainSlugs83 suggerisce "sit in un ciclo occupato e attesa per il numero desiderato di zecche a elapse. Vedere la funzione ho aggiunto nella modifica". Ma non riesco a vedere la funzione aggiunta alla modifica. Suppongo che sarebbe qualcosa di simile:

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

Un punto che non si potrebbe pensare è che il codice si basa sul namespace System NET, che si basa sul orologio in tempo reale sul PC. Si noti che le risposte si basano sul timer nel dispositivo.

In futuro, vorrei suggerire che si prende un momento per qualificare la fonte delle informazioni che si sta utilizzando nel codice - è .Net corretto (che è fondamentalmente basata sul PC), o il dispositivo il codice è in esecuzione su (che avrà uno spazio dei nomi diverso sistema, per esempio)?

PWM è un buon metodo per controllare la corrente DC artificialmente (variando la larghezza di impulso), ma variando la frequenza PWM sarà ancora una funzione di tempo alla fine della giornata.

Invece di usare ritardi .... come dormire .... si potrebbe desiderare di generare un filo e farlo gestire la luminosità. Utilizzando sonno è ancora fondamentalmente un metodo procedurale linea retta e il codice sarà solo in grado di fare questa cosa, se si utilizza un singolo thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top