دقة زمنية أكبر باستخدام .NET Micro Framework على لوحة NetDuino (لتعويل LED)؟

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

سؤال

أنا أقوم برمجة أ 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

حتى لو كانت هناك طريقة أخرى لإنجاز التعتيم من خلال عدم استخدام دقة وقت أكبر ، فأنا لعبة.

هل كانت مفيدة؟

المحلول

هذا لا يجيب على سؤالك حول الحصول على حل أفضل للوقت ، لكنه يحل مشكلتك في تغيير السطوع على قاد. يجب أن تستخدم PWM وحدة ل NetDuino.

أساسيات NetDuino: باستخدام تعديل عرض النبض (PWM) هو مقال رائع حول كيفية استخدامه.

نصائح أخرى

لقد واجهت مشكلة مماثلة في الماضي واستخدمت الطريقة التالية إلى الوقت في نطاق microsecond. يحدد السطر الأول عدد القراد الموجود في مللي ثانية (لقد مر وقت منذ أن استخدمت هذا ، لكنني أعتقد أن 1 علامة microseconds). يحصل السطر الثاني على مقدار الوقت الذي كان فيه النظام قيد التشغيل (في القراد). آمل أن يساعد هذا.

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

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

يمكنك استخدام مؤقت لرفع حدث بدلاً من استخدام النوم.

خاصية الفاصل الزمني في مؤقت مضاعفة بحيث يمكنك الحصول على أقل من مللي ثانية.

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

في تعليقه إجابة سيدلروني يقترح 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;
    }
}

النقطة التي قد لا تفكر فيها هي أن التعليمات البرمجية الخاصة بك تعتمد على مساحة اسم نظام .NET ، والتي تستند إلى الساعة في الوقت الفعلي في جهاز الكمبيوتر الخاص بك. لاحظ أن الإجابات تعتمد على المؤقت في الجهاز.

المضي قدمًا ، أود أن أقترح أن تأخذ لحظة لتأهيل مصدر المعلومات التي تستخدمها في الكود الخاص بك - هل هو .NET مناسب (والذي يعتمد بشكل أساسي على جهاز الكمبيوتر الخاص بك) ، أو الجهاز الذي يعمل عليه الرمز ( أيهما سيكون له مساحة اسم غير النظام ، على سبيل المثال)؟

PWM هي وسيلة جيدة للتحكم في التيار التيار بشكل مصطنع (من خلال تغيير عرض النبض) ، ولكن تغيير تردد PWM سيظل وظيفة الوقت في نهاية اليوم.

بدلاً من استخدام التأخير .... مثل النوم .... قد ترغب في تفريخ خيط وجعله يدير السطوع. لا يزال استخدام النوم في الأساس طريقة إجرائية خط مستقيم وسيكون الكود الخاص بك قادرًا فقط على القيام بهذا الشيء الوحيد إذا كنت تستخدم مؤشر ترابط واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top