לפני זמן מה פרסמנו מידע נוסף על פונקציית millis() de Arduinoכעת נעמיק ב- טיימר ארדואינו, כדי להתחיל עם תכונה זו עבור התכונה, הבן כיצד הלוח הזה עם MCU מנהל זמן, כמו גם פונקציות אחרות מעבר ל-millis().
מהו טיימר Arduino?
El טיימר Arduino, או טיימר, היא פונקציה המיושמת על ידי חומרה (במיקרו-בקר, בעזרת גביש הקוורץ שיוצר את פולסי השעון ושקובע את ה"קצב", ללא צורך בחומרה חיצונית או ICs 555) המאפשרת שליטה באירועים זמניים הודות לשעונים פְּנִימִי. לדוגמה, לגרום למשימה להתרחש במרווחים, ביצוע מדידות זמן מדויקות וכו', ללא תלות בקוד הסקיצה.
תאר לעצמך שאתה משתמש ב- פונקציית delay(), זה יחסום את הביצוע ב- Arduino MCU עד שיחלוף הזמן שצוין ואז ימשיך עם התוכנית, אך הטיימר לא יחסום. זה יהיה העיתוי כאשר ה-MCU ימשיך לבצע הוראות אחרות בו-זמנית. זה היתרון הגדול.
הטיימר קשור ל הפרעות של Arduino, מכיוון שהם יבוצעו דרכם כדי להשתתף במשימה מסוימת. במילים אחרות, ה- Arduino Timer הוא פונקציה המופעלת בזמן מסוים, ומבצעת פונקציית פסיקה. לכן חשוב לדעת גם על ההפרעות הללו.
מצבים
ל-Arduino טיימר יש 2 מצבי הפעלה, היכולת להשתמש בו ב:
- אות PWM: אתה יכול לשלוט על סיכות ארדואינו (~).
- CTC (נקה טיימר בהשוואת התאמה): סופר את הזמן בתוך מונה וכאשר הוא מגיע לערך המצוין בפנקס של הטיימרים, ההפרעה מבוצעת.
כמה טיימרים יש לו? סוגי טיימרים
שם 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 עד שהם יהיו שווים ואז לבצע פעולה. לכן, תדר פסיקה ניתן על ידי הנוסחה:
מהירות פסיקה (הרץ) = תדר שעון Arduino / Prescaler (ערך אוגר המשווה + 1)
למרבה המזל, אסור לנו לשנות רשומות של ה- Arduino Timers, מכיוון שהוא יטופל על ידי הספריות שבהן אנו משתמשים בקוד. אבל אם לא נעשה בהם שימוש, יש להגדיר אותם.
דוגמאות ב- 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 UNO Rev3