آموزش آردوینو

آموزش تایمر آردوینو بخش دوم

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

در قسمت قبل از آموزش تایمر ، به شرح رجیستر‌های تایمر در حد آشنایی و همچنین عمل کرد تایمر پرداختیم. در این آموزش کتابخانه‌‌هایی معرفی خواهیم کرد کار با  Timer1 , Timer3 , Timer4 و Timer5 را بسیار آسان می‌کند و بدون درک زیادی از رجیستر‌ها قادر خواهید بود برنامه‌هایی که نیاز به استفاده از تایمر می‌باشند را بنویسید. این مجموعه ، اولین مجموعه‌ای از تایمر‌هایی ۱۶ بیتی می‌باشد که برای اولین بار توسط تیم تخصصی دیجی اسپارک بر روی وب قرار گرفته است.در ادامه با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.

در قسمت قبل آموختیم که تایمر یک المان در خارج از cpu می‌باشد که وظیفه‌ی آن شمارش زمان ‌می‌باشد.در صورتی که با تایمر آشنایی ندارید ، پیشنهاد می‌کنیم آموزش قبلی تایمر را از لینک زیر مطلاعه کنید.

آموزش تایمر آردوینو بخش اول

 

در Arduino‌های سری مگا از ۶  تایمر و ۱۵ عدد خروجی PWM استفاده شده است که به شرح زیر می‌باشند:

  • پین ۴ و ۱۳ که به وسیله Timer0 کنترل می‌شوند
  • پین ۱۱ و ۱۲ به وسیله Timer1 کنترل می‌شوند
  • پین ۹ و ۱۰ در اختیار Timer2 قرار دارند
  • پین ۲ ، ۳ و ۵ در اختیار Timer3 قرار دارند
  • پین ۶ ، ۷ و ۸ به وسیله Timer4 کنترل  می‌شوند
  • پین ۴۶ ، ۴۵ و ۴۵ به وسیله Timer5 کنترل می‌شوند

 

 

 

 در هنگام برنامه‌نویسی برای قسمت تایمر ممکن است در زمانی که از کتابخانه و یا توابع استفاده می‌کنید ممکن است با مشکلاتی از قبیل زیر روبه‌رو شوید :

هنگام استفاده از Timer1 ، در صورتی که از کتابخانه Servo استفاده می‌کنید ، دیگر نمی‌توانید از پین ۹ و ۱۰ به عنوان PWM استفاده کنید. این قضیه در آردوینو‌های سری مگا کمی پیچیده تر می‌باشد. در آردوینو مگا هر تایمر توانایی راه اندازی ۱۲ عدد سروو موتور را دارد. برای راه ندازی ۱۲ سروو موتور اولی از Timer5 استفاده می‌شود (بنابراین از PWM برای پین‌های ۴۴ ، ۴۵ و ۴۶ نمی‌توانید استفاده کنید). برای راه اندازی ۲۴ عدد سروو موتور از Timer1 و Timer5 استفاده می‌شود ( بنابر این نمی‌توانید از PWM برای پین‌های ۱۱ ، ۱۲ ، ۴۴ ، ۴۵ و ۴۶ استفاده کنید) . اگر قصد راه‌اندزی۳۶ عدد سروو موتور را دارید ، آردوینو از Timer1 , Timer3  و Timer5 برای انجام این کار استفاده می‌کند (بنابراین نمی‌توانید از پین‌های ۲ , ۳ , ۵ , ۱۱ , ۱۲ , ۴۴, ۴۵ و ۴۶ به عنوان PWM استفاده کنید). و در آخر اگر می‌خواهید ۴۸ عدد سروو موتور را راه ‌اندازی کنید ، آردوینو برای راه اندازی آن‌ها از تمام تایمر‌های ۱۶ بیتی ( تایمر ۱ ،۳ ، ۴ و ۵) استفاده می‌کند و در این حالت شما تمام پین ‌های PWM را از دست می‌دهید.

 

برنامه نویسی تایمر در Arduino

برای شروع برنامه‌نویسی ابتدا کتابخانه تایمر‌های ۱۶ بیتی را از لینک زیر دانلود کنید.سپس مجموعه کتابخانه‌ها را به نرم‌افزار آردوینو اضافه نمایید. در فایل ضمیمه شده ، ۴ عدد کتابخانه موجود می‌باشد که از کتابخانه Timer1 می‌توان برای برنامه نویسی تایمر شماره ۱ در آردوینوها Uno , nano ,MEGA و… استفاده نمود و از کتابخانه‌های Timer3 , Timer4 ,Timer5 در آردوینوهای سری مگا استفاده می‌شود.

 

 

دانلود کتابخانه تایمرهای ۱۶ بیتی آردوینو (Timer1,Timer3,Timer4 , Timer5)

 

 

توابع کتابخانه

 

برای فراخوانی کتابخانه‌ها به برنامه  همانند زیر عمل می‌کنیم

 

تمام توابع زیر در تایمر ۱، ۳ ، ۴ ، ۵ یکسان می‌باشند.

 

initialize(microseconds)

در هنگام شروع استفاده از تایمر ، این تابع حتما باید در ابتدای کار فراخوانی شود. آرگمانی که به آن می‌دهیم بر حسب میروثانیه می‌باشد و مقدار زمانی که تایمر باید شمارش کند را مشخص می‌کند. به طور پیش فرض مقدار این تابع ۱ ثانیه می‌باشد. کمترین مقدار برای این تابع ۱ میکروثانیه  و بیشترین مقدار برای آن ۸۳۸۸۴۸۰ میکرو ثانیه یا تقریبا ۸٫۳ ثانیه می‌باشد.

برای مثال اگر بخواهیم تایمر شماره ۱ ، ۰٫۵ ثانیه شمارش کند باید همانند قطعه کد زیر عمل کنیم :

 

setPeriod(microseconds)

بعد از اینکه توسط تابع initialize مقدار دوره زمانی نایمر را تعیین کردید ، به  وسیله‌ی این تابع می‌توانید یک دوره زمانی جدید به تایمر معرفی کنید. به عنوان مثال دوره زمانی ۲٫۵ ثانیه را به تایمر معرفی می‌کنیم :

 

 

stop()

عمل شمارش زمان را متوقف می‌کند.

 

resume()

این تابع  از همان جایی که عمل stop انجام شده است ، عمل شمارش را ادامه می‌دهد ( این تابع مقدار تایمر را صفر نمی‌کند )

 

 

start()

این تابع برای شروع کار دوباره تایمر است.

 

 

restart()

این تابع مقدار تایمر را صفر می‌کند و عمل شمارش را از سر می‌گیرد.

 

pwm(pin, duty)

به وسیله این تابع مقدار pwm  برای pin مورد نظر کانفیگ می‌شود. در صورتی که بخواهیم برای اولین بار به یک پین ، pwm اعمال کنیم ، ابتدا باید این تابع را فراخوانی کنیم.

pin : شماره پین مربوط به Timer

duty : مقدار pwm که عددی بین ۰ تا ۱۰۲۳ می‌باشد ( صفر به معنی این که pin همیشه در وضعیت LOW قرار دارد و ۱۰۲۳ به این معنی است که pin همیشه در وضعیت HIGH قرار دارد).

در مثال زیر مقدار duty cycle ، برابر ۵۱۲ می باشد و به پین شماره ۹ اعمال می‌شود.

setPwmDuty(pin, duty)

 

این تابع تقریبا همانند تابع فوق می‌باشد با این تفاوت دیگر عمل کانفیگ کردن را انجام نمی‌دهد  و سرعتش کمی بیشتر از تابع فوق می‌باشد.

disablePwm(pin)

این تابع اعمال pwm را بر روی pin غیر فعال می‌کند و از آن به بعد می‌توان از آن به عنوان ورودی خروجی دیجیتال استفاده شود.

 

 

attachInterrupt(function)

به وسیله‌ی این تابع ، تابع وقفه‌ای که برای عمل سر ریز شدن تایمر نوشتیم را به برنامه معرفی می‌کنیم. به عنوان مثال در قطعه کد زیر تایمر هرگاه مقدارش ۲ ثانیه شود ، تابع callback فراخوانی می‌شود.

detachInterrupt()

به وسیله این تابع ، تابع وقفه‌ای که به برنامه معرفی کرده بودیم ، غیر فعال می‌شود.

 

 

پروژه : در برنامه‌ی زیر یک LED که به پین شماره ۱۲ آردوینو متصل  می‌باشد هر ۱ ثانیه یک بار چشمک می‌زند.

 

 

درباره نویسنده

علیرضا قربانی

علیرضا قربانی هستم دانشجوی مهندسی پزشکی. چیزهای خیلی زیادی رو در دنیا دوست دارم. یک گیک هستم و یشه گفت یک هکر. نه به معنی دزدی پسورد و ایمیل مردم. به معنی عشق به دونستن و عشق به تحقیق درباره خیلی از چیزهایی که می بینم و می‌شنوم. اگر بخوام علاقه‌مندی‌ درجه یکم رو نام ببرم میتونم بگم برنامه نویسی و بعد از اون امبدد سیستم ها.

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۹ دیدگاه

  • با سلام و تشکر از آموزش خوبتون
    لینک دانلود فایل کتابخانه تایمر دچار مشکله شده.بی زحمت مجددا آپلود بفرمائید

  • سلام
    واقعا عالی
    دارم با شما جلو میام ولی فکر میکنم انسجام کافی بین مطالب مخلف نیست ینی یک خط سیر کلی نداره ولی هر مطلب خوب و کامل گفته شده
    بازم ممنون
    درضمن کتابخانه تایمر ظاهرا مشکل داره

  • با سلام و احترام …دوست عزیز میشه راهنمایی کنین این کتابخانه ها را چگونه میشه تهیه کرد …..ایا از سایت خاصی تهیه میکنین …..؟ و ما چگونه میتونیم به این کتابخانه ها دسترسی داشته باشیم

      • سلام دوستان من در پروؤه خودم که با اردوینو مگا کار می کنم به تایمر چهار و پنج نیاز دارم ولی لینک کتاب خانه این تایمر متاستفانه خراب شده از سایت زیر این کتاب خانه را نیز دانلود کردم ولی متاستفانه ازدینو نمی شناسه
        http://forum.arduino.cc/index.php?topic=220775.0
        اگه کسی این کتاب خونه را داره لطفا تو سایت اپلود کنید
        با سپاس فروان

  • سلام.
    تشکر میکنم از مطلب آموزندتون.
    عزیز برای مقدار دهی ۱ ساعته باید این زمان رو به میکروثانیه جلوی تابع نوشت؟

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

    • سلام
      لینک بررسی شد، مشکلی برای دانلود وجود ندارد.
      با کلیک بر روی لینک وارد صفحه محصول آردوینو arduino mega2560 خواهید شد. سپس در قسمت دانلود ، لینک دانلود کتابخانه تایمر ۱۶ بیتی آردوینو قرار گرفته شده است.

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

  • با سلام من کتابخونه رو دانلود کردم و به نرم افزار اضافه کردم بعد موقع کامپایل کد اروو میگیره از قسمت فراخوانی کتابخونه مشکل از کجاس؟؟

  • سلام عزیز توروخدا کمکم کن مشکلم راه اندازی کانتر با آردوینو هست من همجااارو زیرو رو کردم چرا جایی صحبت از کانتر آردوینو نیست؟مثلا چجوری میشه وقتی cpu کاره خودشو میکنه تعداد پالسهای ورودی رو شمرد؟؟کانتر یک قسمت خیلیی مهم و پرررکاربرد هست در زمینه avr حتما یجوری میشه راش انداخت مطمئنم شما میتونی کمکم کنی ممنون

    • با سلام
      ضمن تشکر از توجه شما و عذرخواهى بابت تاخیر در پاسخگویى

      volatile int IRQcount;
      int pin = 2;
      int pin_irq = 0; //IRQ that matches to pin 2

      void setup() {
      // put your setup code here, to run once:
      Serial.begin (9600);
      attachInterrupt(pin_irq, IRQcounter, RISING);
      }

      void IRQcounter() {
      IRQcount++;
      }

      void loop() {
      // put your main code here, to run repeatedly:
      IRQcount = 0;
      delay(25);
      int result = IRQcount;
      Serial.print(F(“Counted = “));
      Serial.println(result);
      }

      `

      در کد فوق سنسوری که قصد شمردن تیک‌ های آن را دارید، به پین شماره ۲ که دارای اینتراپت خارجی است متصل کنید.

      • ممنون از و اینکه شما عالی بود مرسی بسیار کا آمد هست برنامه ای که نوشتین. اما بنده مد نظر دارم ک با کانترهای آردوینو کار کنم یعنی پالس رابه پایه های T0یا T1 بدیم چجوری و با چه کدهایی میشه کانتر آردوینو رو راه اندازی کرد. تشکر

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

  • یه برنامه ساده نوتم که با تایمر یک کار میکنه . زمانیکه به عنوان یه چشمک زن ساده کار میکنه درست عمل میکنه ولی زمانیکه یه شرط ساده میذارم .تایمر زمانش کلا صفر میشه . اگه میدونید ایراد کار کجاست ممنون میشم راهنمایی کنید
    اینم برنامه :

    #include

    //after get card (switch is on)delay 1 second and turn on led
    volatile int card_in_key = 6 ;
    const boolean card_in = 1 ;
    volatile boolean t1_flag = 0;

    void setup()
    {

    delay(100);
    pinMode(card_in_key,INPUT_PULLUP);
    pinMode(7,OUTPUT);
    Timer1.initialize(1000000); // 1 s
    Timer1.attachInterrupt(delay_time); //

    }

    void loop() {
    while ( digitalRead(card_in_key)== card_in )
    {
    delayMicroseconds(50); // add after
    if (t1_flag == 0 )
    {
    Timer1.restart();
    t1_flag = 1;
    }
    }
    delay(100); // delay ms added after the timer 1 not work
    digitalWrite(7 , HIGH );
    Timer1.stop();
    t1_flag = 0 ;
    }

    void delay_time(){

    t1_flag = 1;
    digitalWrite(7 , LOW ) ;
    }

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