মিলিস () ব্যবহার করে আরডুইনো সময় রাখা কি সঠিক না সঠিক?


9

আমি কিছু ডেটা রেকর্ড করতে আরডুইনো ব্যবহার করছি। আমার আরডুইনো স্কেচে আমি millis()ফাংশনটিও ব্যবহার করেছিলাম যাতে আমি যে মূল্যটি পরিমাপ করছি তার প্রতিটি সময় কীভাবে নেওয়া হবে তা ট্র্যাক রাখতে পারি। তবে, আমি লক্ষ্য করেছি যে সময়টি সঠিক নয়। উদাহরণস্বরূপ, বাস্তব জীবনে 30 সেকেন্ড কেবল 10 সেকেন্ড হিসাবে আসে (উদাহরণস্বরূপ)।

আমি কি এই কথাটি ঠিক করেছিলাম যে আরডুইনো বিলম্বের ক্রিয়াটি ব্যবহারের সময়কে প্রভাবিত করে millis()? অন্য কথায় ধরুন আমার 50 বিলম্ব হয়েছে, তার মানে কি এই millis()ফাংশনটি সেই সময়কালের জন্যও বন্ধ হয়ে যায় এবং তারপরে সংযোগের সময়কাল ধরে অব্যাহত থাকে? আমি এটি লক্ষ্য করেছি যখন আমি কিছু ডেটা চক্রান্ত করার চেষ্টা করেছি এবং সন্ধান করেছি যে আমার ডেটাতে পিকগুলির ফ্রিকোয়েন্সি খুব বেশি ঘন ঘন সময় পার হয়ে গিয়েছিল given সুতরাং আমি জানতে চাই যে এটি সময়ের এই অমিলের জন্য যুক্তি কিনা এবং যদি তাই হয় তবে আমি কীভাবে এটি ঠিক করব যাতে প্রতিটি নমুনা হওয়ার সময়টি রাখতে পারি?

এখানে কিছু প্রসঙ্গ দেওয়া আমার স্কেচ:

#include <eHealth.h>    

unsigned long time;
// The setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);  
}

// The loop routine runs over and over again forever:
void loop() {

  float ECG = eHealth.getECG();
  time = millis();
  Serial.print(time);
  Serial.print(" ");
  Serial.print(ECG, 5); 
  Serial.println("");    

  delay(50);
}

আপনি কি অফিশিয়াল ইউনো বোর্ড ব্যবহার করছেন?
পিটার ব্লুমফিল্ড

1
তৈরি মানগুলির পরিবর্তে প্রকৃত সময় নির্ধারণ (একটি সিরিয়াল মনিটর যা টাইমস্ট্যাম্পগুলি লাইনগুলি আদর্শ) সম্ভবত কী ঘটছে তা নির্ধারণ করতে সহায়তা করবে।
ইগনাসিও ওয়াজকেজ-আব্রাম

3
এর গণনা millis()বাধাপ্রাপ্ত চালিত, সুতরাং delay()এটি প্রভাবিত করা উচিত নয়।
মাইক্রোথেরিয়ন

আমার একই সমস্যা আছে তবে আমি যখন এটিকে (মিলিস ()) জটিল কোডের সাথে একীভূত করি তখনই। আমি অনুমান করি কোডের জটিলতা কোডের জটিলতার সাথে আরও বেশি বিলম্বিত হওয়ার পথে এটির যথার্থতাকে প্রভাবিত করে। এটি এড়ানোর কোনও উপায় আছে কি? সম্ভবত বিচ্ছিন্ন আরটিসি মডিউল ব্যবহার করছেন?
জোসিপ 7171

উত্তর:


10

millis()বিঘ্নিত চালিত তাই delay()এটি প্রভাব ফেলবে না, এটি কমপক্ষে কোনও এটিমেগা ভিত্তিক বোর্ডে নয়।

বলতে না যে millis()সম্পূর্ণই পারেন সঠিক। টাইমারটির প্রতিটি টিক হ'ল 1 মিমি নয়, তবে 1.024 মিমি। সংশোধন না হওয়া পর্যন্ত এই ত্রুটি ধীরে ধীরে জমে থাকে। এটি TIMER0_OVF (টাইমার 0 ওভারফ্লো) বাধা হ্যান্ডলারের বাস্তবায়নে দেখা যায়।

অসম্পূর্ণতার আরেকটি উত্স হ'ল দোলক / স্ফটিক, যা হুবহু 16MHz নয়। এটি যদিও খুব কাছাকাছি, এবং যতক্ষণ না তাপমাত্রা খুব বেশি পরিবর্তন হয় না, তুলনামূলকভাবে স্থিতিশীল।

উপরের অর্থ হ'ল ব্যবহার করার সময় আপনি প্রায় 1 মিমি বাইরে থাকতে পারেন millis()। এটি আপনার সমস্যার মতো শোনাচ্ছে না।

আর একটি সম্ভাব্য সমস্যা getECG()হ'ল যা করছে তা - এটি খুব ধীর হতে পারে।

float eHealthClass::getECG(void)
    {
        float analog0;
        // Read from analogic in. 
        analog0=analogRead(0);
        // binary to voltage conversion
        return analog0 = (float)analog0 * 5 / 1023.0;   
    }

analogRead() ধীর, তবে এর মতো লুপকে প্রভাবিত করতে এতটা ধীর নয়।

লোকেদের আমি যে অন্য সমস্যাটি দেখেছি তা হ'ল তারা যখন ঘড়ির গতি পরিবর্তন করে তবে বোর্ডস.এসটিএসটি সঠিকভাবে পরিবর্তন করে না। এর অর্থ হ'ল millis()বাস্তবায়নে ব্যবহৃত ধ্রুবকগুলি ভুল এবং সময়গুলি ভুল।

আপনি যদি প্রতি 50 মিমি অবধি মানগুলি পড়তে চান তবে এটি কার্যকর করার আরও ভাল উপায় হল নিম্নলিখিতটি করা

static long lastUpdate;

if (millis() - lastUpdate > 50)
{
    lastUpdate = millis();
    //Do stuff
}

আপনি যে টাইমস্ট্যাম্পগুলি পাচ্ছেন তা আমাদের সত্যিই দেখতে হবে। আপনি যদি 30 এর দশকে 10-এর দশকে দেখছেন তবে কর্মক্ষেত্রে আরও কিছু আছে।


2
দয়া করে মনে রাখবেন, ইউনোর জন্য, ঘড়িটি স্ফটিক-চালিত নয়, কেবল একটি সিরামিক রেজোনেটর ব্যবহার করে যা স্ফটিকের চেয়ে কম নির্ভুল।
jfpoil ব্যাখ্যা

@ jfpoil ব্যাখ্যার পক্ষে আহ ভালো। পরিকল্পিত এ খুঁজছি , এই CSTCE16M0V53-R0 হবে Murata CERALOCK ডিভাইস
ক্রিস ও

রেজোনেটরগুলির প্রাথমিক সহনশীলতা (প্রায়শই 0.5-2%) এবং তাপমাত্রার দুর্বলতা থাকে তবে আপনি যদি সময় ব্যবহার করতে সময় লুপগুলি ক্যালিব্রেট করেন তবে তাপমাত্রা যতক্ষণ না সরবে ততক্ষণ তারা ঠিক থাকতে পারে।
সাইবার্বিবনস

2
মিলিস () এখনও এমন টাইমারটিতে কাজ করে যা প্রতি 1.024 মিমি টিক্স করে তবে ত্রুটি মিটার ভেরিয়েবল যখন খুব বেশি হয়ে যায় তখন তারা বৃদ্ধি করার আকারে ত্রুটি ক্ষতিপূরণ যোগ করেছে। আমি মনে করি এটি আসলে রোমান ব্ল্যাকের অ্যালগরিদম। সুতরাং সময় নির্ধারণের ঠিক 1 মিমি খুব কাছাকাছি হওয়া উচিত। github.com/arduino/Arduino/blob/master/hardware/arduino/cores/...
EternityForest

যারা এখনও আগ্রহী তাদের জন্য, জে রবার্টের উত্তরে আমি যে মন্তব্য পোস্ট করেছি তা দেখুন, আমার নিজের উত্তর নেই বলে আমার উত্তর নেই, যেহেতু আমার কাছে একটি নেই, আমি সমস্যাটি পুনরায় চাপিয়ে দিয়েছি।
ব্যবহারকারী 3284376

2

কোনও উল্লেখযোগ্য ভগ্নাংশ eHealth.getECG()কল সময়কাল জন্য যদি বাধা বন্ধ করা হয় , millis()এর গণনা পিছনে পড়তে পারে। অন্যথায়, millis()আপনি বর্ণিত 3x ত্রুটিগুলির চেয়ে অনেক বেশি সঠিক সময়টি ফিরিয়ে দেওয়া উচিত।

আপনি বলেছিলেন যে আপনার স্যাম্পলড সিগন্যালটি আপনার প্রত্যাশার চেয়ে বেশি ফ্রিকোয়েন্সিতে প্রদর্শিত হবে, যা যদি আপনার নমুনার হারটি আপনি চান তার চেয়ে কম হয় happen আপনি কি 20 হার্জেড নমুনা হার ধরে নিচ্ছেন? আপনার লুপটি 50 মিমি থেকে বেশ খানিকটা বেশি সময় নিতে পারে যা আপনি মুদ্রিত সময়ে দেখতে পাবেন, তবে তাদের এখনও ঘড়ির সময় ট্র্যাক করা উচিত। আপনি যদি এটির জন্য অ্যাকাউন্ট না দিয়ে থাকেন তবে 50 মিমি / নমুনা ধরে নিয়েছেন তবে আপনি ডেটার একটি আপাত গতি দেখতে পাবেন।

যদি এটি সমস্যা না হয়, তবে পরবর্তী পদক্ষেপটি আপনি যখন থাকবেন তখন কোনও আউটপুট টগল করা loop()এবং ফ্রিকোয়েন্সি মিটারের ফলে ফলাফলযুক্ত বর্গাকার তরঙ্গের ফ্রিকোয়েন্সি পরিমাপ করা (কিছু সস্তা ডিভিএম এটি করতে পারে) বা 'সুযোগ'। খালি সঙ্গে একই জিনিস loop()। প্রথম পরীক্ষাটি আপনার আসল স্যাম্পলিং হার বা ব্যবধানে থাকবে; দ্বিতীয়টি আপনাকে বলে দেবে millis()(যেমন টাইমার 0 ফ্রিকোয়েন্সি) আপনি প্রত্যাশা করেছিলেন কি না।


1
আমি এটির সাথে আরও ঘুরে বেড়াচ্ছি এবং বুঝতে পেরেছি যে বিষয়টি আরডুইনোর সাথে নয়, বেশিরভাগ অংশের জন্য মিলিস () ফাংশনটি খুব ভালভাবে কাজ করে, কিছু মান কিছুটা 8 মিমি (বিলম্ব) বাদে নয় তবে কি থেকে আপনি বলেছিলেন যে এটি প্রত্যাশিত। আমি বর্ণিত 3x ত্রুটিটি আমি ডেটা গ্রহণের জন্য পাইথন দিকের জিনিসগুলির সত্য। এটির ফলস্বরূপ যে কোনও ফলাফল হতে পারে, আমি পাইথনের পাইসরিয়াল ব্যবহার করছি এবং এটি নরকের মতো ধীর slow
ব্যবহারকারী 3284376

আপনাকে 1/2 @ 'd অনুমানের চেয়ে বেশি দেওয়ার জন্য আপনার বাস্তবায়ন সম্পর্কে আমি পর্যাপ্ত পরিমাণে জানি না, তবে পাইথনের দিকটি কী নমুনা ফেলে দেওয়ার জন্য যথেষ্ট ধীর?
জে রবার্ট

0

একই অবস্থা. আমি যুক্ত করতে পারি যে বাধা বন্ধ থাকলে, পরিমাপ করা সময়টি "আসল সময়"। যাইহোক, আমি এই বিলম্বটি কেন বুঝতে পারি না, কারণ লুপটি যদি খুব বেশি সময় নেয় তবে যাইহোক মিলিস () প্রতিটি সময়ের মধ্যে আরও বেশি দূরত্ব নিয়ে রিয়েল টাইম মানগুলি ফিরিয়ে আনতে পারে


1
"এখানে একই" বলতে কী বোঝায়? উত্তরগুলি তাদের নিজস্ব থাকা উচিত, কারণ স্ট্যাক এক্সচেঞ্জ জিনিসগুলি পুনরায় অর্ডার করতে পারে (কোনও ফোরামের বিপরীতে)। সুতরাং আপনার উত্তর নীচে উপস্থিত কি উত্তর / প্রশ্নের উপর নির্ভর করে "এখানে একই" অর্থ কিছু হতে পারে।
নিক গ্যামন

একটি মন্তব্য হিসাবে এই পোস্টটি আরও উপযুক্ত হবে, যদিও (স্বীকার করেছেন) আপনার যথেষ্ট সুনামের অভাব রয়েছে।
গ্রিননলাইন

দুঃখিত, আমি যদিও আপনি কোনও উত্তর দেওয়ার সময় এটি
স্পষ্টত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.