résolution temporelle plus en utilisant .NET Micro Framework à bord Netduino (pour la variation d'une LED)?

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

Question

Je suis une programmation Netduino carte utilisant le .NET Micro Framework 4.1 et que vous souhaitez obtenir une résolution temporelle plus élevée que millisecondes. C'est parce que je tente d'obscurcir une LED par le clignotement vraiment rapide.

Le problème est que l'exemple de code utilise Thread.Sleep (..) qui prend un certain nombre de millisecondes.

Exemple de code de http://netduino.com/projects/ montrant le problème en question:

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

Même s'il y a une autre façon d'accomplir la gradation par l'absence d'une résolution temporelle de plus, je suis jeu.

Était-ce utile?

La solution

Cela ne répond pas à votre question à obtenir une meilleure résolution temporelle, mais il ne résout votre problème avec le changement de la luminosité sur une LED . Vous devez utiliser le module PWM pour le Netduino.

Netduino Principes de base: Utilisation (Pulse Width Modulation PWM) est un grand article sur la façon de l'utiliser.

Autres conseils

J'ai eu un problème similaire dans le passé et utilisé la méthode suivante pour le temps dans la plage de microsecondes. La première ligne détermine le nombre de tiques sont en un millième de seconde (sa fait un moment que je, mais je pense que 1 tick était de 10 microsecondes). La deuxième ligne reprend de la quantité de temps que le système a été activé (en tics). J'espère que cela aide.

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

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

Vous pouvez utiliser une minuterie pour déclencher un événement au lieu d'utiliser le sommeil.

La propriété Intervalle sur une minuterie est un double de sorte que vous pouvez avoir moins d'une milliseconde sur elle.

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

Dans son commentaire à réponse de Seidleroni BrainSlugs83 suggère « sit dans une boucle d'attente et d'attendre le nombre désiré de tiques à s'écouler. Voir la fonction I ajoutée dans l'édition ». Mais je ne vois pas la fonction ajoutée à la modifier. Je suppose que ce serait quelque chose comme ceci:

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 point que vous pourriez ne pas penser est sur le point que votre code se fonde sur l'espace de noms System .NET, qui est basé sur l'horloge en temps réel dans votre PC. Notez que les réponses reposent sur la minuterie dans l'appareil.

Aller de l'avant, je vous suggère de prendre un moment pour qualifier la source de l'information que vous utilisez dans votre code - est-il .NET approprié (ce qui est fondamentalement basé sur votre PC) ou le dispositif est le code en cours d'exécution sur (ce qui aura un espace de noms autre que système, par exemple)?

PWM est un bon moyen pour commander le courant continu artificiellement (en faisant varier la largeur d'impulsion), mais en faisant varier la fréquence de découpage sera toujours en fonction du temps à la fin de la journée.

Plutôt que des retards d'utilisation .... comme sommeil .... vous pourriez vouloir frayer un fil et avoir à gérer la luminosité. Le sommeil est toujours en utilisant essentiellement une méthode de procédure de ligne droite et votre code ne sera en mesure de le faire une chose si vous utilisez un seul thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top