تایمر آردوینو: در پروژه های خود با زمان بندی بازی کنید

زمان سنج Arduino UNO

چند وقت پیش اطلاعات بیشتری در مورد آن منتشر کردیم تابع millis(). de آردوینواکنون ما عمیق تر به آن می پردازیم تایمر آردوینو، برای شروع کار با این ویژگی برای این ویژگی، درک کنید که این برد چگونه زمان را با MCU مدیریت می کند، و همچنین سایر توابع فراتر از millis().

تایمر آردوینو چیست؟

تایمر آردوینو

El تایمر آردوینو یا تایمر، عملکردی است که توسط سخت افزار (در میکروکنترلر، با کمک کریستال کوارتز که پالس های ساعت را تولید می کند و "ریتم" را تنظیم می کند، بدون نیاز به سخت افزار خارجی یا آی سی 555) اجرا می شود که به لطف ساعت ها امکان کنترل رویدادهای موقت را فراهم می کند. درونی؛ داخلی. به عنوان مثال، انجام یک کار در فواصل زمانی، اندازه گیری دقیق زمان و غیره، مستقل از کد طرح.

کومو Arduino UNO این دارای یک تراشه MCU است که در 16 مگاهرتز کار می کند، 16.000.000 می تواند در هر ثانیه اجرا شود. دستورالعمل ها برای اجرا به چرخه های X نیاز دارند، نه همه آنها در یک چرخه ساعت اجرا می شوند، به عنوان مثال، دستورالعمل های 16 بیتی به چرخه های بیشتری در این معماری AVR نیاز دارند.

تصور کنید که از تابع delay().، این کار اجرا را در MCU آردوینو تا زمان مشخص شده مسدود می کند و سپس برنامه را ادامه می دهد، اما تایمر مسدود نمی شود. زمانی که MCU به اجرای همزمان دستورالعمل‌های دیگر ادامه می‌دهد، زمان‌بندی خواهد شد. این مزیت بزرگ است.

تایمر مربوط به وقفه ها از آردوینو، زیرا آنها از طریق آنها برای حضور در یک کار خاص اجرا می شوند. به عبارت دیگر، تایمر آردوینو تابعی است که در زمان مشخصی راه اندازی می شود و یک تابع وقفه را اجرا می کند. به همین دلیل است که دانستن این وقفه ها نیز مهم است.

حالت ها

تایمر آردوینو دارد 2 حالت عملیاتی، امکان استفاده از آن در:

  • سیگنال PWM: شما می توانید کنترل کنید پین های آردوینو (~).
  • CTC (پاک کردن تایمر در مقایسه با مسابقه): زمان را در داخل یک شمارنده می شمارد و زمانی که به مقدار مشخص شده در یک ثبات از تایمرها رسید، وقفه اجرا می شود.

چند تایمر داره؟ انواع تایمر

Arduino UNO توابع میلی

آنجا 3 تایمر روی بشقاب ها Arduino UNO، اگرچه ممکن است در سایر صفحات بالایی موارد بیشتری وجود داشته باشد:

  • تایمر 0: 8 بیتی، می تواند از 0 تا 255 (256 مقدار ممکن) شمارش کند. توسط توابعی مانند delay()، millis() و micros(). اصلاح آن برای عدم تغییر برنامه ها توصیه نمی شود.
  • تایمر 1: برابر با تایمر 0. مورد استفاده توسط کتابخانه Servo در UNO (تایمر 5 برای MEGA).
  • تایمر 2: 16 بیتی و می تواند از 0 تا 65.525 (65.536 مقدار ممکن) متغیر باشد. برای تابع tone() استفاده می شود، اگر استفاده نشود، می تواند آزادانه برای برنامه شما استفاده شود.
  • تایمر 3، 4، 5 (فقط در آردوینو MEGA): همه 16 بیتی

تایمر آردوینو چگونه کار می کند؟

تایمر، تایمر

قادر بودن با تایمر آردوینو کار کنید، بسیار مهم است که بدانید همه اینها چگونه به صورت الکترونیکی در MCU این برد توسعه کار می کند:

  • فرکانس ساعت: تعداد سیکل هایی است که در هر ثانیه قادر به توسعه است، در مورد آردوینو 16 مگاهرتز است یا همان چیزی است که سیگنال ساعت 16.000.000 بار در ثانیه نوسان می کند (سیکل).
  • عادت زنانه: با T نشان داده می شود و در ثانیه اندازه گیری می شود و معکوس چرخه ها است. به عنوان مثال، T=1/C، که منجر به 1/16000000 = 0.0000000625 می شود، مدت زمانی که برای تکمیل هر چرخه طول می کشد. و فرکانس معکوس دوره است، بنابراین f = 1/T.
  • چرخه: هر یک از تکرارهای سیگنال است که در واحد زمان رخ می دهد. در آردوینو 16M در ثانیه خواهد بود. یا همین طور است، در این مورد، وقتی 16 میلیون چرخه می گذرد، یک ثانیه می گذرد. بنابراین، می توان گفت که یک چرخه 625 ns طول می کشد.
  • لبه یک سیگنال: سیگنال های ساعت مربع هستند و لبه ها می توانند در حال افزایش یا کاهش باشند. یک یال خط مستقیم سیگنال است زمانی که از:
    • 0 (کم) به 1 (بالا): لبه بالارونده.
    • 1 (بالا) تا 0 (کم): لبه سقوط.

لبه ها مهم هستند زیرا تایمرهای آردوینو چرخه ها را از لبه های سیگنال اندازه گیری می کنند. الف) بله کنتادور با هر چرخه افزایش می یابد و هنگامی که به مقدار ثبات می رسد، وقفه اجرا می شود.

بنابراین، هنگامی که این را بدانید، اگر دارید 16 مگاهرتز در آردوینو MCUو از یک تایمر 8 بیتی استفاده می شود، می توان گفت که وقفه هر 16 میکروثانیه (256/16000000) یا 4 میلی ثانیه برای 16 بیت (65536/16000000) رخ خواهد داد. بنابراین، اگر رجیستر شمارنده 16 بیتی را با مقدار 65535 روی حداکثر تنظیم کنید، آنگاه وقفه در 4 میلی ثانیه رخ می دهد تا هر کاری که باشد انجام شود.

وقتی شمارنده به حداکثر مقدار ممکن رسید، دوباره به 0 برمی گردد. یعنی سرریز اتفاق می افتد و از اول به عقب برمی گردد.

برای کنترل میزان افزایش تایمر نیز می توانید استفاده کنید یک پیش مقیاس کننده، که مقادیر 1، 8، 64، 256 و 1024 را می گیرد و زمان بندی را به این صورت تغییر می دهد:

سرعت تایمر (هرتز) = فرکانس ساعت آردوینو / پیش مقیاس کننده

اگر 1 باشد پیش مقیاس کننده کنترل کننده به 16 مگاهرتز، اگر 8 تا 2 مگاهرتز باشد، اگر 64 تا 250 کیلوهرتز باشد و غیره افزایش می یابد. به یاد داشته باشید که یک مقایسه کننده حالت شمارنده تایمر وجود خواهد داشت تا مقدار شمارنده و پیش مقیاس کننده را تا زمانی که با هم برابر شوند مقایسه کرده و سپس یک عمل را اجرا کنید. بنابراین، فرکانس وقفه با فرمول داده می شود:

+1 به این دلیل است که رجیستر شمارنده با 0 نمایه می شود، یعنی از 1 شروع به شمارش نمی کند، بلکه از 0 شروع به شمارش می کند.

سرعت وقفه (هرتز) = آردوینو / فرکانس ساعت پیش مقیاس کننده (مقدار ثبت مقایسه کننده + 1)

خوشبختانه ما نباید سوابق را اصلاح کنید از تایمرهای آردوینو، زیرا توسط کتابخانه هایی که ما در کد استفاده می کنیم مراقبت می شود. اما اگر از آنها استفاده نمی شود، باید پیکربندی شوند.

نمونه هایی در Arduino IDE

Arduino IDE، انواع داده، برنامه نویسی

برای درک بهتر همه اینها، در اینجا دو کد طرح برای Arduino IDE را نشان می‌دهم که با استفاده از آنها می‌توانید استفاده از تایمر را تجربه کنید. اولین کدی است که هر ثانیه یک LED متصل به پین ​​8 آردوینو چشمک می زند:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

چشمک زدن یا چشمک زدن LED را مانند حالت قبلی هر ثانیه برنامه ریزی کنید، اما این بار با استفاده از آن CTC یعنی مقایسه:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

اطلاعات بیشتر در مورد برنامه نویسی آردوینو

بشقاب بخر Arduino UNO نسخه 3

محتوای مقاله به اصول ما پیوست اخلاق تحریریه. برای گزارش یک خطا کلیک کنید اینجا.

اولین کسی باشید که نظر

نظر خود را بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند با *

*

*

  1. مسئول داده ها: میگل آنخل گاتون
  2. هدف از داده ها: کنترل هرزنامه ، مدیریت نظرات.
  3. مشروعیت: رضایت شما
  4. ارتباط داده ها: داده ها به اشخاص ثالث منتقل نمی شوند مگر با تعهد قانونی.
  5. ذخیره سازی داده ها: پایگاه داده به میزبانی شبکه های Occentus (EU)
  6. حقوق: در هر زمان می توانید اطلاعات خود را محدود ، بازیابی و حذف کنید.

آزمون انگلیسیکاتالان را تست کنیدمسابقه اسپانیایی