תוכן עניינים:

ממוצע פועל לפרויקטים של המיקרו -בקר שלך: 6 שלבים
ממוצע פועל לפרויקטים של המיקרו -בקר שלך: 6 שלבים

וִידֵאוֹ: ממוצע פועל לפרויקטים של המיקרו -בקר שלך: 6 שלבים

וִידֵאוֹ: ממוצע פועל לפרויקטים של המיקרו -בקר שלך: 6 שלבים
וִידֵאוֹ: ✔ האם אתה מטומטם? במבחן הזה תגלה ! ( רק 12% מצליחים ) 2024, נוֹבֶמבֶּר
Anonim
ממוצע פועל לפרויקטים של המיקרו -בקר שלך
ממוצע פועל לפרויקטים של המיקרו -בקר שלך

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

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

שלב 1: שימוש במקרה: החלקת מדידות ADC

מקרה שימוש: החלקת מדידות ADC
מקרה שימוש: החלקת מדידות ADC

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

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

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

בתמונה למעלה השתמשתי בממוצע פועל של 32 מדידות אחרונות. תראה ששיטה זו אינה 100% חסינת כשל אך היא משפרת את הדיוק באופן משמעותי (היא לא גרועה יותר מאשר ממוצע של 32 דגימות בכל פעם). אם אתה רוצה לחשב ממוצע של 32 מדידות בכל פעם, זה ייקח מעל 0.25 ms ב- Arduino UNO למדידות בלבד!

שלב 2: שימוש במקרה: מדידת רכיב DC של אות המיקרופון

מקרה שימוש: מדידת רכיב DC של אות המיקרופון
מקרה שימוש: מדידת רכיב DC של אות המיקרופון
מקרה שימוש: מדידת רכיב DC של אות המיקרופון
מקרה שימוש: מדידת רכיב DC של אות המיקרופון
מקרה שימוש: מדידת רכיב DC של אות המיקרופון
מקרה שימוש: מדידת רכיב DC של אות המיקרופון

Arduino יכול למדוד מתח בין 0 ל- Vcc (בדרך כלל 5 V). אות השמע הוא לגמרי AC ואם אתה רוצה למדוד אותו במיקרו -בקר, אתה צריך להטות אותו סביב 1/2 Vcc. בפרויקט UNO של Arduino זה אומר בערך 2.5 V (DC) + אות שמע (AC). בעת שימוש באספקת 10 סיביות ADC ו -5 וולט, הטיה של 2.5 וולט צריכה להיות שווה למדידה של 512. אז כדי לקבל ערך AC של האות, יש להפחית את 512 ממדידת ה- ADC וזהו, נכון?

בעולם אידיאלי, זה יהיה נכון. לרוע המזל החיים האמיתיים מסובכים יותר והטיה האותות שלנו נוטה להיסחף. נפוץ מאוד הוא רעש של 50 הרץ (60 הרץ אם אתה גר בארה ב) מרשת חשמל. בדרך כלל זה לא כל כך בעייתי אבל טוב לדעת שזה קיים. בעייתית יותר היא סחף ליניארי מחימום רכיבים. אתה מגדיר בזהירות את תיקון קיזוז DC בהתחלה והוא לאט לאט מתרחק כשהיישום שלך פועל.

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

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

אנו יודעים שהערך הממוצע של כל אות AC הוא 0. באמצעות ידע זה אנו יכולים לנכות שהערך הממוצע של אות AC+DC הוא הטיה של DC. כדי להסיר אותו, אנו יכולים לקחת ממוצע פועל של הערכים האחרונים ולחסור אותו מקריאת ADC הנוכחית. שים לב שעליך להשתמש בממוצע ריצה מספיק ארוך. עבור אודיו, עשירית השנייה (מספר הדגימות תלוי בקצב הדגימה שלך) אמורה להספיק אך דע כי ממוצעים ארוכים יותר עובדים טוב יותר. בתמונה הראשונה אתה יכול לראות דוגמה לחישוב הטיה DC אמיתית עם ממוצע פועל עם 64 אלמנטים בקצב דגימה של 1 קילוהרץ (פחות ממה שהמלצתי אבל זה עדיין עובד).

שלב 3: חישוב

תַחשִׁיב
תַחשִׁיב

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

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

אתה עשוי לחשוב: "זה לא נשמע יעיל מדי … חייבת להיות דרך טובה יותר לעשות זאת." ואתה צודק.

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

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

שלב 4: הקוד

הקוד
הקוד

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

המצבר צריך להתחיל לאתחל ל -0, אותו דבר לגבי כל האלמנטים בקו העיכוב. במקרה אחר ממוצע הריצה שלך תמיד יהיה שגוי. אתה תראה ש- delayLine_init דואג לאתחל את שורת העיכוב, עליך לדאוג למצבר בעצמך.

הוספת רכיב לעיכוב הקו קלה כמו הורדת האינדקס של האלמנט החדש ב -1, וודא שהוא אינו מצביע על הצד של מערך קו העיכוב. לאחר הורדת אינדקס כאשר הוא 0, הוא יסתובב ל -255 (מכיוון שמדובר במספר שלם ללא סימן של 8 סיביות). אופרטור מודולו (%) בגודל מערך קו העיכוב יבטיח שהמדד יצביע על אלמנט תקף.

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

קל, נכון?

אל תהסס להתנסות בשימוש בקוד המצורף כדי להבין טוב יותר כיצד כל זה עובד. כפי שהוא נראה כרגע, arduino קורא ערך אנלוגי על פין אנלוגי A0 ומדפיס "[ערך ADC], [ממוצע פועל]" ביציאה טורית בקצב 115200 באוד. אם תפתח את הקושר הסידורי של arduino בקצב שידור נכון, תראה שתי שורות: ערך ADC (כחול) וחלק מוחלק (אדום).

שלב 5: תוספות

תוספות
תוספות

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

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

ממשיך הלאה.

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

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

טריק: קווי עיכוב ארוכים תופסים הרבה זיכרון. זה יכול להפוך במהירות לבעיה. אם אתה מוגבל מאוד בזיכרון ולא אכפת לך מדיוק, אתה יכול להעריך את ממוצע הריצה על ידי השמטת עיכוב לחלוטין ולעשות זאת במקום זאת: להפחית מצבר 1/N * מהמצבר ולהוסיף ערך חדש (לדוגמא של 8 ממוצע ריצה ארוך: מצבר = מצבר * 7/8 + newValue). שיטה זו נותנת תוצאה שגויה אך זוהי שיטה הגונה לחישוב ממוצע ריצה כאשר אוזל הזיכרון.

בלשנות: "ממוצע פועל/ממוצע" משמש בדרך כלל כאשר מתייחסים לממוצע זמן אמת בעוד "ממוצע נע/ממוצע" בדרך כלל פירושו שאלגוריתם פועל במערך נתונים סטטי כגון גיליון אלקטרוני של Excel.

שלב 6: מסקנה

אני מקווה שההנחיה הייתה קלה מספיק להבנה ושהיא תעזור לך בפרויקטים הבאים שלך. אל תהסס לפרסם שאלות בתגובות למטה אם יש משהו לא ברור.

מוּמלָץ: