שְׁאֵלָה:
איך לתפוס במדויק את זמן ההגעה של קצה קלט?
AJMansfield
2017-03-16 05:08:56 UTC
view on stackexchange narkive permalink

ב- Arduino / ATmega328p, מודולי הטיימר / PWM של 16 סיביות כוללים יחידת לכידת קלט המאפשרת את זמן ההגעה המדויק להקלטת קצה קלט גם אם המעבד עסוק כשמגיע קצה הקלט. (לפרטים עיין ב גליון הנתונים, סעיף 20.9 בעמוד 155).

האם ל- Raspberry Pi יש סוג כלשהו של ציוד היקפי הניתן לחומרה, או דרך אחרת לחותם קלט בדיוק קצה המתרחש בזמן שהמעבד תפוס? ניסיתי לחפש בדף הנתונים BCM2835 ARM ציוד היקפי, אך לא הצלחתי למצוא שום דבר התואם את צרכיי עד כה.

אני מניח שניתן להשיג זאת באמצעות ה- FIQ כדי להפעיל DMA מטיימר המערכת למקום אחר, אך ממסמכי הרישום נראה כי ניתן להגדיר את ה- FIQ רק להפרעות GPU ובסיס. . אני לא בטוח כיצד לגרום ל- FIQ להפעיל הפרעות של GPIO, וגם אם ידעתי איך אני לא בטוח אם זו דרך נכונה להמשיך, או שיש דרך אחרת לעשות זאת בצורה נקייה יותר. / p>

כיצד אוכל לתפוס במדויק את זמן ההגעה של קצה הקלט?

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

* "חותם במדויק קצה קלט המתרחש בזמן שהמעבד תפוס" * -> מכיוון שה- GPIO הם הפרעות חומרה מקוריות וה- Pi בדרך כלל מריץ מערכת הפעלה אמיתית עם ריבוי משימות המגיבה כראוי להפרעות כאלה, אתה אמור להיות מסוגל להשיג משהו בדיוק ברמה של אלפית השנייה באמצעות טכניקות רגילות. במילים אחרות, Atmega328 "תפוסה" היא חיה שונה מאוד מ- BCM2835 "תפוסה" בגלל התוכנה בה הם יכולים לתמוך.
@goldilocks למרבה הצער, דיוק ברמת המילישניות אינו מספיק טוב - האירועים שאני מודד הם לכל היותר רק כמה אלפיות השנייה זה מזה, ואני צריך להיות מסוגל ליצור סדרה של פעימות פלט עם קיזוז תזמון מדויק מאוד מהדק. (האם זה ב- ATMega328 באמצעות פלט PWM להשוות בלוקים; טכניקה דומה מאוד צריכה לעבוד עבור Pi, כל עוד אני באמת יכול להוריד את חותמת הזמן מהטיימר PWM.)
הם עדיין קצת תפוחים ותפוזים במובן שאתה יכול לעשות דברים עם אחד שאתה לא יכול לעשות עם השני. אבל הם הולכים יחד כמו שוקולד וחמאת בוטנים IMO - כך שאם זה רק חותמת הזמן החשובה, ואין שהפי יגיב לדברים בזמן אמת בדיוק משנה של אלפית השנייה, אז פיג'יק ננו על ה- Pi. ישנן דרכים פשוטות עבורן לתקשר (UART, I2C, SPI, gpio interrupts). זה משתמע מכאן שאתה * צריך * את ה- Pi למשהו שאתה לא יכול לעשות עם האטמגה, אבל צריך להיות אפשרי להשתמש בשניהם.
אחד תשובה:
joan
2017-03-16 17:23:08 UTC
view on stackexchange narkive permalink

לפתרון כללי של לינוקס pigpio הוא כנראה הטוב ביותר שאתה הולך למצוא.

הוא משתמש ב- DMA כדי לתפוס את רמות ה- GPIO ומשתמש ב- DMA כדי להחתים את האירוע בזמן. זמן מהשעון מערכת 1MHz.

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

אם אתה עובר במסלול ההפסקה מצפה לחביון ממוצע בין אירוע GPIO להודעה על התהליך באזור 50-100 µs, של חריגים כמובן יכולים להיות הרבה יותר, בקלות 10 שניות של ms, ולא תדעו איזו היא.

pigpio ידגימה ב -1 Msps, אך לא הייתי ממליץ עליה אם המערכת עשויה להיות עסוקה בלעשות דברים ברשת, תקבל ריצוד תזמון DMA כאשר אוטובוס הזיכרון מתחיל להיות עמוס. הייתי להיצמד 500ksps או פחות.

אני לא רואה דרך לפגוש 1μs שלך או מטרה טובה תחת לינוקס.

מניח שאצטרך להשתמש במיקרו-בקר עזר בכדי להתמודד עם לכידת הקלט, ופשוט לדבר איתו כמו I2C או משהו כזה.
@AJMansfield לכמה שינויים ברמה אתה מצפה לשנייה? אפילו ב- I2C המהיר ביותר שלו ב- Pi לא יטפל בדגימת 1 מגה-הרץ. SPI אולי אבל בשני המקרים ה- Pi הוא אדון האוטובוסים. מה אתה מנסה להשיג?
אתה צודק, אבל אני יכול לעשות את רוב העיבודים בזמן אמת ב- mc החיצוני מבלי להזדקק ל pi מעורב, מכיוון שאני צריך לשנות את התצורה רק בסדר גודל של פעם בשנייה, וזה רק צריך לדווח על סטטיסטיקה בסיסית .
מה שאני מנסה לעשות זה לייצר סדרה של פעימות פלט בקיזוז זמן מדויק מאוד מאות ההדק של הקלט; דפוס הדופק עצמו לא ישתנה כל כך הרבה פעמים.


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