שְׁאֵלָה:
כמה מדויק העיתוי של pulseIn ()?
Peter Bloomfield
2014-02-20 17:03:18 UTC
view on stackexchange narkive permalink

השתמשתי בפונקציה pulseIn () לעיבוד קידוד נתונים בינארי מבוסס PWM. זה עובד היטב להבחנת פולסים באורכים שונים באופן משמעותי, למשל. 500us לעומת 1500us. זה הופך אותו ליותר ממספיק לטיפול בשלטים IR טיפוסיים.

עם זאת, אני רוצה ליצור מערכת IR משלי שיכולה להשתמש ביותר מ -2 אורכי דופק, כך שהעברת נתונים יכולה להתרחש מהר יותר. באופן אידיאלי, הייתי רוצה להשתמש בשמונה אורכי דופק שונים לקידוד אוקטלי (למשל 200us, 400us, 600us וכו ').

שמתי לב לשינויים משמעותיים למדי בערכים שהוחזרו על ידי pulseIn () אם כי (+/- 10%). אני מצפה שלפחות חלק ממנו הוצג על ידי מודולי משדר ומקלט IR, אך אין לי ציוד מספיק טוב כדי לאמת זאת.

בהנחה שאוכל להקל על אותה שגיאה חיצונית, הוא pulseIn () עשוי להיות מדויק מספיק בכדי להבחין בין פולסים דומים כאלה?

שתיים תשובות:
#1
+11
mpflaga
2014-02-21 09:38:55 UTC
view on stackexchange narkive permalink

הפונקציה pulsein () מאבדת מאוד, בכך שהיא לולאה קשה ומחזירה מספר * את מחזורי השעון המשוערים שלוקח לכל לולאה

  ... // חכה ל הדופק לעצור בזמן ((* portInputRegister (port) & bit) == stateMask) {if (numloops ++ == maxloops) להחזיר 0; רוחב ++;} // להמיר את הקריאה למיקרו-שניות. הלולאה נקבעה // שאורכה 20 מחזורי שעון ויש להם כ 16 שעונים בין הקצה // לתחילת הלולאה. תהיה שגיאה כלשהי שהוצגה על ידי // מטפלי הפסיקה. return clockCyclesToMicroseconds (רוחב * 21 + 16); 

השיטה המדויקת ביותר לקליטת עיתוי ה- PIN היא שימוש בתכונה INPUT CAPTURE. הסתכלו על הדוגמה הזו. זה מאפשר לכידת קלט פי 1 של מעבד לרזולוציה מקסימלית וכל קצה של סיכת הקלט לוכד את ערך השעון של הטיימר לקריאה משירות Interrupt שנוצר. זה גם מאפשר להפסיק את הצפת הטיימר כדי לשמור על זמן מוחלט גדול, כדי להילכד. מאז ה- 1x יתגלגל די מהר. הלוכדים מאחסנים את הזמן במערך לקריאה לפי הלולאה הראשית.


היכן שעבור אותות מעל IR הספרייה האופיינית לשימוש היא ספריית shirriff / Arduino-IRremote. איפה שיש לו כמה הדגמות שיקראו וישלחו את ה- IR מאות מפושט. לאפשר לבנות סקיצה של העיצוב שלהם. קוד זה במקור יוצר הפסקת טיימר הסוקרת את סיכת הקלט בקצב שנקבע על ידי

  #define USECPERTICK 50 // microseconds per tick interrupt tick  

in את הקובץ IRremote.h. למטרותיי יש לי לשנות אותו ל 25 לנו. איפה שאני מוצא את זה עדיין יכול להיות חסר זרמי דופק לסירוגין.

שים לב שהמודולציה מתבצעת בצורה הטובה ביותר בתוך מקלט ה- IR, שמציב בתורו את אות העניין הזה. איפה להוסיף קצת רקע. שימוש באפנון אופייני של 38KHz, משווה לרזולוציה מינימלית של 26.3uS לכל מחזור הדופק. הספרייה של שריף מציגה בדרך כלל שרוב הקופות או הסיביות בסדר גודל של 10+ פעימות. שנראים כמתאימים לתזמונים הרצויים שלך.

microtherion / Arduino-IRremote עבודת שריף משפרת את הקליטה על ידי החלפת הסדר הפסקת הזמן של הפין בעזרת PinChangeInterrupts. אשר מיזגתי למזלג mpflaga / Arduino-IRremote שלי, שמוסיף עוד כמה תכונות.

אז אתה יכול להשתמש בכל אחת מהספריות שלעיל. לחלופין, צור אפליקציה משלך המשתמשת באחת מהאפשרויות הבאות כדי ללכוד קצוות.

  1. סקרים באירוע טיימר (למשל 50uS)
  2. לוכדת את המיקרו () על PinChangeInterrupt / li>
  3. משתמש בהפסקות לכידת קלט כדי לתפוס את הזמן המדויק
תשובה מבריקה. ה- Arduino-IRremote היא ספרייה באיכות גבוהה מאוד. קל לקריאה, ויש לו הרבה עיצוב מחושב היטב שמשמעותו שהוא אמין מאוד.
#2
+2
TheDoctor
2014-02-20 20:22:36 UTC
view on stackexchange narkive permalink

הנה כמה נתוני בדיקה של מבחן pulseIn . ארדואינו אחד שלח מה שהיה אמור להיות פולסים של 14us והשני ירק את הנתונים האלה:

18,18,18,12,18,18,18,18,18,18,18 , 18,18,18,18,18,18,24,19,18,18,18,18,18,24,18,18,18,19,18,18,12,18,18,19,18 , 18,18,18,18,18,18,18,18,18,18,19,18,19,24,18,18,18,18,18,18,18,24,18,18,18 , 18,18,18,18,18,18,18,18,18,18,19,18,18,18,18,18,18,18,18,18,18,19,18,18,18 , 11,18

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



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...