טיימר Arduino: שחקו בתזמון בפרויקטים שלכם

שעון עצר Arduino UNO

לפני זמן מה פרסמנו מידע נוסף על פונקציית millis() de Arduinoכעת נעמיק ב- טיימר ארדואינו, כדי להתחיל עם תכונה זו עבור התכונה, הבן כיצד הלוח הזה עם MCU מנהל זמן, כמו גם פונקציות אחרות מעבר ל-millis().

מהו טיימר Arduino?

טיימר ארדואינו

El טיימר Arduino, או טיימר, היא פונקציה המיושמת על ידי חומרה (במיקרו-בקר, בעזרת גביש הקוורץ שיוצר את פולסי השעון ושקובע את ה"קצב", ללא צורך בחומרה חיצונית או ICs 555) המאפשרת שליטה באירועים זמניים הודות לשעונים פְּנִימִי. לדוגמה, לגרום למשימה להתרחש במרווחים, ביצוע מדידות זמן מדויקות וכו', ללא תלות בקוד הסקיצה.

קומו Arduino UNO יש לו שבב MCU שעובד במהירות של 16 מגה-הרץ, ניתן לבצע 16.000.000 בכל שנייה. ההוראות צריכות X מחזורים לביצוע, לא כולן מבוצעות באותם מחזורי שעון, למשל, ה-16 סיביות זקוקות ליותר מחזורים בארכיטקטורת AVR זו.

תאר לעצמך שאתה משתמש ב- פונקציית delay(), זה יחסום את הביצוע ב- Arduino MCU עד שיחלוף הזמן שצוין ואז ימשיך עם התוכנית, אך הטיימר לא יחסום. זה יהיה העיתוי כאשר ה-MCU ימשיך לבצע הוראות אחרות בו-זמנית. זה היתרון הגדול.

הטיימר קשור ל הפרעות של Arduino, מכיוון שהם יבוצעו דרכם כדי להשתתף במשימה מסוימת. במילים אחרות, ה- Arduino Timer הוא פונקציה המופעלת בזמן מסוים, ומבצעת פונקציית פסיקה. לכן חשוב לדעת גם על ההפרעות הללו.

מצבים

ל-Arduino טיימר יש 2 מצבי הפעלה, היכולת להשתמש בו ב:

  • אות PWM: אתה יכול לשלוט על סיכות ארדואינו (~).
  • CTC (נקה טיימר בהשוואת התאמה): סופר את הזמן בתוך מונה וכאשר הוא מגיע לערך המצוין בפנקס של הטיימרים, ההפרעה מבוצעת.

כמה טיימרים יש לו? סוגי טיימרים

Arduino UNO פונקציות מיליס

שם 3 טיימרים על הצלחות Arduino UNO, למרות שייתכן שיש עוד בצלחות עליונות אחרות:

  • טיימר 0: 8 סיביות, יכול לספור מ-0 עד 255 (256 ערכים אפשריים). משמש על ידי פונקציות כמו delay(), millis() ו-micros(). השינוי שלו אינו מומלץ כדי לא לשנות את התוכניות.
  • טיימר 1: שווה לטיימר 0. בשימוש על ידי ספריית הסרוו ב-UNO (טיימר 5 עבור MEGA).
  • טיימר 2: 16 סיביות, ויכול לנוע בין 0 ל-65.525 (65.536 ערכים אפשריים). משמש עבור הפונקציה tone(), אם לא נעשה בה שימוש, ניתן להשתמש בה באופן חופשי עבור היישום שלך.
  • טיימר 3, 4, 5 (רק ב-Arduino MEGA): כולם 16 סיביות.

איך עובד ה-Arduino טיימר?

טיימרים, טיימרים

אל לעבוד עם טיימר Arduino, חיוני לדעת איך כל זה עובד באופן אלקטרוני ב-MCU של לוח הפיתוח הזה:

  • תדר שעון: זה מספר המחזורים לשנייה שהוא מסוגל לפתח, במקרה של ארדואינו זה 16 מגהרץ, או מה שזה אותו הדבר, אות השעון מתנודד 16.000.000 פעמים בשנייה (מחזורים).
  • תקופה: מיוצג על ידי ה-T, והוא נמדד בשניות, והוא היפוך של המחזורים. לדוגמה, T=1/C, שיגרום ל-1/16000000 = 0.0000000625, הזמן שייקח לכל מחזור להשלים. והתדירות היא היפוך של התקופה, אז f = 1/T.
  • מחזור: היא כל אחת מהחזרות של האות המתרחשות ליחידת זמן. ב-Arduino זה יהיה 16M בשנייה. או מה זהה, במקרה הזה, כשחלפו 16 מיליון מחזורים, חלפה שנייה אחת. לכן, ניתן לומר שמחזור אחד לוקח 625 ns.
  • קצה של אות: אותות השעון הם מרובעים, והקצוות יכולים לעלות או לרדת. קצה הוא הקו הישר של האות כאשר הוא משתנה מ:
    • 0 (נמוך) עד 1 (גבוה): קצה עולה.
    • 1 (גבוה) עד 0 (נמוך): קצה נופל.

קצוות חשובים כי טיימרים של Arduino מודדים מחזורים מקצוות האות. א) כן הקונטאדור זה גדל עם כל מחזור וכאשר הוא מגיע לערך האוגר, ההפסקה מבוצעת.

לכן, ברגע שאתה יודע זאת, אם יש לך 16Mhz ב- Arduino MCU, ובשימוש בטיימר של 8 סיביות, ניתן לומר שפסיקות יתרחשו כל 16 מיקרומטרים (256/16000000) או 4 אלפיות השנייה עבור 16 סיביות (65536/16000000). לכן, אם תגדיר את האוגר מונה 16 סיביות למקסימום, עם הערך 65535, ההפרעה תתרחש ב-4 אלפיות השנייה כדי לבצע כל משימה שהיא.

כאשר המונה מגיע לערך המקסימלי האפשרי, זה יחזור ל-0 שוב. כלומר, מתרחשת הצפה והיא תספור אחורה מההתחלה.

כדי לשלוט בקצב העלייה של הטיימר אתה יכול גם להשתמש קדם-סקאלר, שלוקח את הערכים 1, 8, 64, 256 ו-1024 ומשנה את התזמון כך:

מהירות טיימר (Hz) = תדר שעון של Arduino / Prescaler

אם זה 1, ה-prescaler הבקר יגדל ל-16 מגה-הרץ, אם הוא 8 עד 2 מגה-הרץ, אם הוא 64-250 קילו-הרץ, וכן הלאה. זכור שיהיה משווה מצב מונה טיימר כדי להשוות את הערך של המונה וה-prescaler עד שהם יהיו שווים ואז לבצע פעולה. לכן, תדר פסיקה ניתן על ידי הנוסחה:

1+ נובע מכך שהאוגר המונה נכלל באינדקס ב-0, כלומר הוא לא מתחיל לספור ב-1, אלא ב-0.

מהירות פסיקה (הרץ) = תדר שעון Arduino / Prescaler (ערך אוגר המשווה + 1)

למרבה המזל, אסור לנו לשנות רשומות של ה- Arduino Timers, מכיוון שהוא יטופל על ידי הספריות שבהן אנו משתמשים בקוד. אבל אם לא נעשה בהם שימוש, יש להגדיר אותם.

דוגמאות ב- Arduino IDE

Arduino IDE, סוגי נתונים, תכנות

על מנת להבין את כל זה קצת יותר טוב, כאן אני מציג שני קודי סקיצה עבור Arduino IDE שאיתם תוכלו להתנסות בשימוש בטיימרים. הראשון הוא קוד שיהבהב נורית המחוברת לפין Arduino 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
}

תכנת את ההבהוב או ההבהוב של הנורית, כמו במקרה הקודם כל שנייה, אך הפעם באמצעות 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

לקנות צלחת Arduino UNO Rev3

היה הראשון להגיב

השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.