שְׁאֵלָה:
כיצד אוכל לדעת את תדירות הדגימה?
user3284376
2014-03-11 02:30:34 UTC
view on stackexchange narkive permalink

אני מתחיל להתבלבל קצת לגבי קצב הדגימה והמדרגות וכו '. יש לי את קוד הארדואינו הזה:

  #include <eHealth.h>extern נדיף טיימר ארוך לא חתום0_אוברו_ספירה; צף fanalog0; אנלוגי 0; זמן לא חתום; בייט serialByte; הגדרת חלל () {Serial.begin (9600);} loop loop () {while (Serial.available () >0) {serialByte = Serial.read (); if (serialByte == 'S') {while (1) {fanalog0 = eHealth.getECG (); // השתמש ב- timer0 = > 1 סמן כל 4 us time = (timer0_overflow_count << 8) + TCNT0; // המרת מיקרו-שניות. זמן = (זמן * 4); // הדפס בקובץ להדמיה // Serial.print(time); //Serial.print (""); Serial.print (fanalog0,5); Serial.print ("\ n"); אם (Serial.available () >0) {serialByte = Serial.read (); אם (serialByte == 'F') הפסקה; }}}}}  

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

שבע תשובות:
#1
+22
alexan_e
2014-03-11 03:23:02 UTC
view on stackexchange narkive permalink

מהירות השעון של Arduino ADC נקבעת ב- ..arduino-1.5.5 \ hardware \ arduino \ avr \ cores \ arduino \ wiring.c

הנה החלק הרלוונטי

  #if מוגדר (ADCSRA) // הגדר גורם מקדמה מקדימה של A / D ל 128 // 16 MHz / 128 = 125 KHz, בטווח 50-200 KHz הרצוי. // XXX: זה לא יעבוד כראוי למהירויות שעון אחרות, ו / / קוד זה צריך להשתמש ב- F_CPU כדי לקבוע את גורם הגודל המוקדם. sbi (ADCSRA, ADPS2); sbi (ADCSRA, ADPS1); sbi (ADCSRA, ADPS0); // אפשר המרות A / D sbi (ADCSRA, ADEN); # endif  

עבור Arduino של 16 מגהרץ, שעון ה- ADC מוגדר ל- 16 MHz / 128 = 125 KHz. כל המרה ב- AVR אורכת 13 שעוני ADC כך ש 125 קילוהרץ / 13 = 9615 הרץ.

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

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

כמו כן, הזמן שבין חותמות הזמן שלי עולה מ ~ 1300 עד ~ 16400, בוודאי שהם צריכים להישאר זהים? כלומר ב 9600, ב 115200, הם גדלים רק לכ 1500 לאחר זמן רב.
@user3284376 לגבי קוד חותמת הזמן שלך, אני חושב שהוא לא יכול לעבוד בכל עת (יכול להיות מוטה על ידי כמה הפרעות בזמן הלא נכון). אני ממליץ לך לפרסם שאלה ספציפית כיצד להשיג תזמון דיוק גבוה בארדואינו ולהניח שם את החלק הרלוונטי בקוד שלך.
#2
+7
Salar Khan
2015-09-26 18:05:19 UTC
view on stackexchange narkive permalink

רציתי גם לקבל קצב דגימה גבוה לפרויקט. מתברר שניתן להגדיר את סיביות ADPS2, ADPS1, ADPS0 של רישום ADCSRA כך שתקבל קצב דגימה של 76923 s / s או 76.8 ks / s. אבל, היזהר שאני מפעיל את ה- ADC של ארדואינו במצב ריצה חופשית, השורות הבאות עבדו עבורי.

  #ifndef cbi # define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit)) # endif # ifndef sbi # define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit)) # endifvoid setup () {// הגדר את Prescaler ל- 16 (16000KHz / 16 = 1MHz) ) // אזהרה: מעל 200KHz תוצאות 10 סיביות אינן מהימנות .//ADCSRA | = B00000100; sbi (ADCSRA, ADPS2); cbi (ADCSRA, ADPS1); cbi (ADCSRA, ADPS0); // הגדר ADIE ב- ADCSRA ( 0x7A) כדי לאפשר את ההפרעה של ADC. תוצאות 10 סיביות אינן מהימנות. המשמעות היא שהגדלת קצב הדגימה תפחית את דיוק התוצאות. אז אני משתמש רק ב 8 הביטים העליונים מכיוון שבמדרגה זו, 8 הביטים העליונים אמינים. אתה יכול לפרט יותר בעמוד זה, הבחור הזה מתנדנד! הוא ביצע אוסצילוסקופ בקצב דגימה גבוה באמצעות UNO  http://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/ 
#3
+4
user34028
2015-12-21 01:32:34 UTC
view on stackexchange narkive permalink

שליחת 11 סיביות על סדרתית בבאוד של 9600, אך לצורך הדגימה, אני שומר אותה במערך עם עיכוב קטן ככל האפשר, ואז ברגע שזה נעשה, אני שולח אותו דרך היציאה הטורית כדי לקרוא אותה על ידי פיתון תַסרִיט. אני עושה זאת עבור FFT באמצעות matplotlib. אני מקשיב לאות 0-5V, ואז מבלי להשתמש בפונקציית ה- delay (), אני שומר את ערכי analogRead () במערך זה. בשבריר שנייה הקריאה מתבצעת, ואז זריקת הנתונים הסדרתית מתחילה. כאשר כיולתי את תדר הקלט באמצעות טון () מארדואינו מחובר אחר, הבנתי שעלי לחלק את האינדקס ב 8915 על מנת להגיע לדיוק בתוך .1 הרץ. מכיוון שצריך לחלק את תדירות הדגימה כדי לקבל את מרווחי האינדקס המתאימים, אני מניח שתדר הדגימה של ארדואינו (לפחות שלי עם הקוד שלי) הוא 8915 הרץ.

#4
+3
Cybergibbons
2014-03-11 03:14:33 UTC
view on stackexchange narkive permalink

בכל לולאה אתה מדפיס 8 תווים בקישור סדרתי של 9600bps. כל תו לוקח 10 ביטים (התחלה אחת, 8 ביטים לדמות, עצירה אחת). זה אומר שאתה יכול לעבור רק את הלולאה הזו ~ 120 פעמים לשנייה.

הפונקציה analogRead () יכולה לדגום בערך 9600 פעמים / שנייה בתיאוריה, באופן ריאלי זה בערך 8600 פעמים / שנייה

אתה מוגבל על ידי התקשורת הטורית.

אז עלייה ל 115200, נותנת 1440 פעמים לשנייה, האם זה קצב הדגימה?
תן או קח, כן. עליך לזכור כי סידורי דורש שהקצה השני יגיב, ולכן אתה תלוי בכך שהמחשב יגיב. זה לא דטרמיניסטי ולכן תקבלו עצבנות.
אתה צודק בסוף הדברים של ארדואינו, הכל נראה בסדר, אבל בפייתון הדברים הרבה יותר איטיים, איזה סוג דברים הייתי צריך לעשות כדי להגדיל את הביצועים בסוף הדברים?
אתה לא צריך להסתכל על זה כבעיה בביצועים הסדרתיים במחשב האישי, אבל איך אתה מקבל את הדגימה שתתנתק משליחת הנתונים.
@Cybergibbons - לא, מכיוון שהדבר פועל ב- Uno שבו ה- USB והסידורי מנותקים, אין תלות במחשב מעבר להנפקת תו ה- S ולא הוצאת ה- F. הסקיצה שפורסמה כאן והפלטפורמה שעליה הוא פועל תזרוק בשמחה נתונים סדרתיים על מיקרו ה- USB הסידורי הנלווה, בלי להתעלם אם זה או משהו בקצה השני של ה- USB עומד בקצב.
#5
+1
ThermoRestart
2019-07-06 01:52:31 UTC
view on stackexchange narkive permalink

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

קצב הדגימה הוא התדירות בה המכשיר (ארדואינו) יכול ליצור מחדש ייצוג דיגיטלי של ערכים אנלוגיים נכנסים.

קצב שידור הוא קצב העברת המידע בערוץ תקשורת. הוא מתאר את קצב התקשורת בין המיקרו-בקר לעולם החיצון (המחשב).

אני ממליץ על קישור החלפת אלקטרוניקה זו. https://electronics.stackexchange.com/questions/135056/sampling-rate-data-rate-and-bandwidth

#6
  0
E_Sh
2019-11-14 04:39:03 UTC
view on stackexchange narkive permalink

8915Hz - זה קרוב מאוד ל 125000/14 ~ = 8928.6 הניחוש הראשוני שלי שנדרש פער אחד בדיוק בין המרות סמוכות שעון ADC אחד לדגימה ו 13 שעוני ADC להמרה עצמה. שגיאה קטנה יכולה להיות השפעה של מקור שעון לא מושלם של Arduino. אני עדיין לא בטוח. נושא זה ממשי עבורי כעת, שכן נתונים שנדגמו חייבים להזין מסנן דיגיטלי.

אני לא בטוח למה אתה מתכוון כשאתה אומר "נושא זה אמיתי עבורי כעת, שכן נתונים שנדגמו חייבים להזין פילטר דיגיטלי.". האם יש לך בעיה דומה?
כל המרה מתחילה בקצה עולה של שעון ADC, ולפחות_ מחזור שעון ADC אחד מאבד קוד ביצוע. אז כן, 8928.6 הרץ הוא המהיר ביותר שאתה יכול לקבל על ידי קריאת 'analogRead ()' בלולאה הדוקה, v.s. 9615.4 הרץ עקבי מאוד במצב ריצה חופשית.
#7
  0
Gil
2020-08-20 00:34:06 UTC
view on stackexchange narkive permalink

האם שקלת להשיג מנתח לוגאים או מנתח לוגיקה דומה. הזולים הפשוטים עובדים נהדר ומאפשרים לך לבצע מדידות אלה די בקלות. זה עובד טוב יותר מאשר היקף ברוב היישומים שלי. אם יש חפיפה של אות זה יופיע. אני פשוט מקדיש סיכה אחת לבדיקה וקוראת לזה testpin. פשוט הגדרו גבוה כשמתחילים בשגרה ואז נמוך בסיום. יש לו 8 כניסות כך שתוכלו לראות את הקשר בין האותות. אתה יכול לפקח על A / D, להתחיל את ההדק ולהניח את הסידורי על סיכה אחרת. עדיין נותרו לכם 6 דברים אחרים. השקיעו איתו כמה שעות וזה יהפוך לאחד הכלים החשובים ביותר שלכם. אני משתמש במנטה לינוקס אז אני פשוט שומר אותו על מסך אחר כך שלחיצה פשוטה מביאה אותו לתצוגה והוא יפעל בין אם החלון נראה או לא. היזהר אם יש לך כניסות שאינן בשימוש, הן ישמשו כאנטנה ויקלטו אותות תועים במיוחד מהחלפת ספקי כוח. פשוט בחר את הערוצים שאתה רוצה או התעלם מהערכים שאינם רלוונטיים. המנתחים המובנים עושים עבודה קצרה של אותות טוריים.



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