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

מונה תדר ברזולוציה גבוהה: 5 שלבים (עם תמונות)
מונה תדר ברזולוציה גבוהה: 5 שלבים (עם תמונות)

וִידֵאוֹ: מונה תדר ברזולוציה גבוהה: 5 שלבים (עם תמונות)

וִידֵאוֹ: מונה תדר ברזולוציה גבוהה: 5 שלבים (עם תמונות)
וִידֵאוֹ: כל מה שאנחנו יודעים על הפלייסטיישן 5 | חדשות 2024, יולי
Anonim

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

עריכה: הקוד זמין כעת ב- GitLab:

gitlab.com/WilkoL/high-resolution-frequency-counter

שלב 1: ספירת תדרים של בית הספר הישן

ספירת תדרים של אולד סקול
ספירת תדרים של אולד סקול
ספירת תדרים של אולד סקול
ספירת תדרים של אולד סקול

הדרך הישנה של בית הספר למדוד את תדירות האות היא באמצעות לוגיקה AND-gate, הזנת האות הנמדד ליציאה אחת ואות בעל זמן גבוה של שנייה אחת בדיוק ליציאה השנייה וספירת הפלט. זה עובד די טוב לאותות של כמה קילוהרץ עד ל- GHz. אבל מה אם אתה רוצה למדוד אות בתדר נמוך עם רזולוציה טובה? נניח שאתה רוצה למדוד את תדירות החשמל (כאן 50 הרץ). בשיטת האסכולה הישנה תראה 50 קבוע בתצוגה שלך אם יש לך מזל, אך סביר יותר שתראה את מתג התצוגה מ- 49 ל- 50 או 50 ל- 51. הרזולוציה היא 1 הרץ, וזהו. לעולם לא תראה 50.002 הרץ אלא אם אתה מוכן להגדיל את זמן השער ל -1000 שניות. זה יותר מ -16 דקות, למדידה אחת!

דרך טובה יותר למדוד אותות בתדירות נמוכה היא למדוד את תקופתו. אם ניקח את החשמל שוב כדוגמה, יש לו תקופה של 20 אלפיות השנייה. קח את אותו ההיגיון AND-gate, הזן אותו עם, נניח 10 מגה-הרץ (0.1 פולסים) והאות שלך ביציאה השנייה ויוצאים 200,000 פולסים, כך שזמן התקופה הוא 20000.0 uS וזה מתרגם בחזרה ל -50 הרץ. כאשר אתה מודד פעימות 199650 בלבד התדירות היא 50.087 הרץ, זה הרבה יותר טוב, וזה רק בזמן מדידה של שנייה אחת. לרוע המזל זה לא עובד טוב עם תדרים גבוהים יותר. קח לדוגמה, כעת אנו רוצים למדוד 40 קילוהרץ. עם אותה תדר קלט של 10 מגהרץ כמו ההפניה אנו מודדים כעת רק 250 פולסים. כאשר אנו סופרים רק 249 פולסים החישוב נותן 40161 הרץ ועם 251 התוצאה היא 39840 הרץ. זו לא החלטה מקובלת. כמובן שהגדלת תדירות ההתייחסות משפרת את התוצאות אך יש גבול למה אתה יכול להשתמש בבקר מיקרו.

שלב 2: הדרך ההדדית

הדרך ההדדית
הדרך ההדדית
הדרך ההדדית
הדרך ההדדית

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

ברגע שהאות הזה עובר מ- LOW ל- HIGH, הפלט של ה- D-flipflop מעביר את מצב כניסת ה- D ליציאה (Q). אות RISING זה הולך ומשמש להתחלת ספירת אות הכניסה כמו גם אות שעון התייחסות.

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

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

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

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

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

עכשיו זה רק חישוב כדי לקבוע את תדירות אות הכניסה.

דוגמה, נניח שיש לנו את האותות האלה ואנו רוצים למדוד קלט f. ההפניה היא 10 מגה -הרץ, המיוצר על ידי מתנד קריסטל קוורץ. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), זמן המדידה הוא כ. שנייה אחת

בתקופה זו ספרנו 32 פולסים. כעת, תקופה אחת של האות הזה לוקחת 1 / 31.416 = 31830.9 ארה ב. אז 32 תקופות לקחו לנו 1.0185892 שניות, שזה קצת יותר משנייה.

בשנייה 1.0186 זו גם נספר 10185892 פולסים של אות ההתייחסות.

זה נותן לנו את המידע הבא: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

הנוסחה לחישוב התדירות המתקבלת היא זו: freq = (input_count * f_reference) / ref_count

בדוגמה שלנו כלומר: f-input = (32 * 10000000) / 10185892 = 31.416 הרץ

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

שלב 3: חומרה והסכימה שלה

חומרה והסכימה שלה
חומרה והסכימה שלה
חומרה והסכימה שלה
חומרה והסכימה שלה

הכנתי כמה מוני תדרים מסוג זה. מזמן הכנתי אחד עם ATMEGA328 (אותו בקר כמו שיש בארדואינו), מאוחר יותר עם בקרי מיקרו ARM מ- ST. האחרון נעשה עם STM32F407 בשעון של 168 מגה -הרץ. אבל עכשיו תהיתי מה אם אני עושה את אותו הדבר עם אחד קטן בהרבה. בחרתי ב- ATTINY2313, שיש לו רק 2Kbyte של זיכרון FLASH ו -128 בתים של זיכרון RAM. התצוגה שיש לי היא MAX7219 עם 8 שבעה תצוגות קטע עליה, תצוגות אלה זמינות ב- eBay תמורת 2 יורו בלבד. ניתן לקנות ATTINY2313 בסביבות 1.5 יורו שאר החלקים בהם השתמשתי עולים רק סנט ליחידה. היקר ביותר היה כנראה קופסת הפרויקטים מפלסטיק. מאוחר יותר החלטתי להפעיל אותו על סוללת ליתיום-יון, כך שהייתי צריך להוסיף מייצב מתח (3.3V), מודול טעינת סוללה והסוללה עצמה. זה מעלה את המחיר במקצת, אבל אני מניח שאפשר לבנות אותו בפחות מ -20 יורו.

שלב 4: הקוד

הקוד
הקוד
הקוד
הקוד

הקוד נכתב ב- C עם Atmel (Microchip) Studio 7 ותוכנת ב- ATTINY2313 באמצעות OLIMEX AVR_ISP (שיבוט?). פתח את (main.c) בקובץ ה- zip למטה אם אתה רוצה לעקוב אחר התיאור כאן.

אִתחוּל

תחילה ה- ATTINY2313 נקבע לשימוש בגביש חיצוני מכיוון שמתנד RC הפנימי אינו מועיל למדידת כל דבר. אני משתמש בקריסטל של 10 מגהרץ שאני מכוון לתדר הנכון של 10 000 000 הרץ עם קבל משתנה קטן. האתחול דואג להגדיר יציאות לכניסות ויציאות, הגדרת הטיימרים ומאפשר הפרעות ואיתחול של ה- MAX7219. TIMER0 מוגדר לספירת שעון חיצוני, TIMER1 השעון הפנימי וגם ללכוד את ערך הדלפק בקצה העולה של ICP, המגיע מה- D-flipflop.

אחליט על התוכנית הראשית אחרונה, אז להלן שיטות ההפרעה.

TIMER0_OVF

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

TIMER1_OVF

TIMER1 יכול לספור עד 65536 (16 סיביות), כך שה- TIMER1_OVF מפריע גם סופר את מספר הצפות. אבל זה עושה יותר. הוא גם יורד מ -152 ל -0 שלוקח כשנייה אחת ואז מגדיר סיכת פלט, עובר לכניסת D של הכפכף. והדבר האחרון שנעשה בשגרת ההפסקה הזו הוא הפחתת מונה הזמן הקצוב, מ -765 ל -0, שאורך כ -5 שניות.

TIMER1_CAPT

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

להלן שתי פונקציות לשליטה ב- MAX7219

SPI

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

MAX7219

הפרוטוקול להתקנת ה- MAX7219 הוא גם די פשוט לאחר שקראת את המדריך שלו. הוא צריך ערך של 16 סיביות לכל ספרה שמורכבת מ -8 סיביות למספר הספרות (1 עד 8) ואחריו 8 סיביות למספר שהיא צריכה להציג.

PROG-PROG

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

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

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

הבא הוא חישוב התדירות בפועל. אני בוודאי לא רוצה להשתמש במספרים צפים על מיקרו -בקר עם רק 2 קילו -בייט של פלאש ורק 128 בתים של RAM אני משתמש במספרים שלמים. אבל התדרים יכולים להיות כמו 314.159 הרץ, עם מספר עשרוני. לכן אני מכפיל את תדר הקלט לא רק בתדר ההתייחסות אלא גם במכפיל ואז מוסיף מספר לאן הנקודה העשרונית צריכה להגיע. המספרים האלה יהיו גדולים מאוד מאוד כאשר אתה עושה זאת. לְמָשָׁל. עם כניסה של 500 קילוהרץ, התייחסות של 10 מגהרץ ומכפיל של 100, זה נותן 5 x 10^14, זה ממש ענק! הם לא יתאימו יותר למספר 32 סיביות אז אני משתמש במספרים של 64 סיביות שיגיעו עד 1.8 x 10^19 (שעובד מצוין ב- ATTINY2313)

והדבר האחרון שצריך לעשות הוא לשלוח את התוצאה לתצוגה MAX7219.

הקוד מתאסף לכ- 1600 בתים, כך שהוא מתאים לפלאש של 2048 בתים הזמין ב- ATTINY2313.

רשימות הנתיכים אמורות לקרוא כך:

0xFF מורחב

0xDF גבוה

0xBF נמוך

שלב 5: דיוק ודיוק

דיוק ודיוק
דיוק ודיוק
דיוק ודיוק
דיוק ודיוק
דיוק ודיוק
דיוק ודיוק

דיוק ודיוק הם שתי חיות נפרדות. הדיוק כאן הוא שבע ספרות, מהו הדיוק בפועל תלוי בחומרה ובכיול. כיליתי את 10 מגה -הרץ (5 מגה -הרץ בנקודת הבדיקה) עם מונה תדרים אחר שיש לו מתנד ממושמע ב- GPS.

וזה עובד די טוב, התדר הנמוך ביותר שניסיתי הוא 0.2 הרץ, הגבוה ביותר 2 מגה -הרץ. זה נקודתי. מעל 2 מגה -הרץ הבקר מתחיל לאבד הפרעות, לא ממש מפתיע כשאתה יודע שבאות קלט של 2 מגה -הרץ TIMER0 מייצר מעל 7800 הפרעות בשנייה. וגם ה- ATTINY2313 צריך לעשות דברים אחרים, ההפרעות מה- TIMER1, בעוד 150 הפרעות בשנייה וכמובן לבצע את החישובים, שליטה בתצוגה וב- D-flipflop. כאשר אתה מסתכל על המכשיר בפועל תראה שאני משתמש רק בשבע מתוך שמונה הספרות של התצוגה. אני עושה זאת מכמה סיבות.

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

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

מוּמלָץ: