- מהו מחולל פונקציות DDS?
- להבין את העבודה של מחולל הפונקציות AD9833 IC
- רכיבים נדרשים לבניית מחולל הפונקציות מבוסס AD9833
- מחולל פונקציות מבוסס AD9833 - תרשים סכמטי
- מחולל פונקציות מבוסס AD9833 - קוד ארדואינו
- בדיקת מחולל הפונקציות המבוסס על AD9833
- שיפורים נוספים
אם אתה חובב אלקטרוני כמוני שרוצה להסתובב עם מעגלים אלקטרוניים שונים, לפעמים מחולל פונקציות הגון הופך להיות חובה. אבל בעלות על אחת היא בעיה מכיוון שציוד בסיסי כזה יכול לעלות הון. בניית ציוד בדיקה משלך היא לא רק זולה יותר אלא גם דרך נהדרת לשפר את הידע שלך.
אז במאמר זה, אנו הולכים לבנות מחולל אותות פשוט עם Arduino ו- AD9833 DDS מחולל פונקציות מודול שיכול לייצר גלי סינוס, ריבוע ומשולש בתדר מרבי של 12 מגה-הרץ ביציאה. ולבסוף, אנו הולכים לבדוק את תדירות הפלט בעזרת האוסצילוסקופ שלנו.
בנינו בעבר מחולל גל סינוס פשוט, מחולל גל מרובע ומחולל גלי משולש בעזרת מעגלים אנלוגיים בסיסיים. אתה יכול לבדוק את אלה אם אתה מחפש כמה מעגלים בסיסיים של מחוללי צורות גל. כמו כן, אם אתה רוצה לבנות מחולל פונקציות Arduino זול יותר מבלי להשתמש במודול AD9833, אתה יכול לבדוק את פרויקט DIY Arduino Wave Generator Project.
מהו מחולל פונקציות DDS?
כפי שהשם מרמז, מחולל פונקציות הוא מכשיר שיכול להפיק צורת גל ספציפית בתדר מסוים עם ההגדרה. לדוגמא, שקול שיש לך מסנן LC שעבורו ברצונך לבדוק את תגובת תדר הפלט שלך, אתה יכול לעשות זאת בקלות בעזרת מחולל פונקציות. כל שעליך לעשות הוא להגדיר את תדר הפלט ואת צורת הגל הרצויים שלך, ואז אתה יכול לכונן אותו כלפי מטה או למעלה כדי לבדוק את התגובה. זו הייתה רק דוגמה אחת, אתה יכול לעשות עם זה דברים נוספים ככל שהרשימה עוד ארוכה.
DDS מייצג סינתזה דיגיטלית ישירה. זהו סוג של מחולל צורות גל המשתמש בממירים דיגיטליים לאנלוגיים (DAC) כדי לבנות אות מהיסוד. שיטה זו משמשת במיוחד ליצירת גל סינוס. אך ה- IC בו אנו משתמשים יכול לייצר אותות גל מרובעים או משולשים. הפעולות שהתרחשו בתוך שבב DDS הן דיגיטליות כך שהוא יכול להחליף את התדר מהר מאוד או שהוא יכול לעבור מאות אחד למשנהו במהירות רבה. למכשיר זה יש רזולוציית תדרים משובחת עם ספקטרום תדרים רחב.
להבין את העבודה של מחולל הפונקציות AD9833 IC
בלב הפרויקט שלנו הוא מחולל IC מתכנת AD9833 מתוכנן ומפותח על ידי מכשירים אנלוגיים. זוהי צריכת חשמל נמוכה, מחולל צורת גל לתכנות מסוגל לייצר סינוס, משולש, ואת כיכר גל עם תדירות מקסימלית של 12 מגה-הרץ. זהו IC ייחודי מאוד המסוגל לשנות את תדירות הפלט והשלב בעזרת תוכנה בלבד. יש לו ממשק SPI בעל 3 חוטים ולכן התקשורת עם IC זה הופכת לפשוטה וקלה מאוד. תרשים הבלוקים הפונקציונלי של IC זה מוצג להלן.
העבודה של IC זה היא פשוטה מאוד. אם נתבונן בתרשים הבלוקים הפונקציונאלי לעיל, נצפה שיש לנו מצבר פאזה שתפקידו לאחסן את כל הערכים הדיגיטליים האפשריים של גל סינוס, החל מ- 0 עד 2π. לאחר מכן, יש לנו את ה- SIN ROM שתפקידו להמיר את מידע הפאזה שאחר כך ניתן למפות ישירות למשרעת. ה- SIN ROM משתמש במידע השלב הדיגיטלי ככתובת לטבלת בדיקה וממיר את מידע השלב למשרעת. ולבסוף, יש לנו ממיר דיגיטלי לאנלוגי של 10 סיביות שתפקידו לקבל את הנתונים הדיגיטליים מ- SIN ROM ולהמיר אותם למתח האנלוגי המתאים, זה מה שאנחנו מקבלים מהפלט. ביציאה יש לנו גם מתג שנוכל להפעיל או לכבות רק עם קוד תוכנה קטן. נדבר על כך בהמשך המאמר.הפרטים שאתה רואה לעיל הם גרסה מפושטת מאוד של המתרחש בתוך ה- IC, ורוב הפרטים שאתה רואה לעיל לקוחים מגליון הנתונים AD9833, אתה יכול גם לבדוק אותו למידע נוסף.
רכיבים נדרשים לבניית מחולל הפונקציות מבוסס AD9833
הרכיבים הנדרשים לבניית מחולל הפונקציות המבוסס על AD9833 מפורטים להלן, תכננו את המעגל הזה עם רכיבים גנריים מאוד, מה שמקל מאוד על תהליך השכפול.
- ארדואינו ננו - 1
- מחולל פונקציות DDS AD9833 - 1
- תצוגת OLED 128 X 64 - 1
- מקודד סיבובי גנרי - 1
- שקע חבית DC - 1
- וסת מתח LM7809 - 1
- קבלים 470uF - 1
- קבלים 220uF - 1
- קבלים 104pF - 1
- נגד 10K - 6
- מתגי מישוש - 4
- מסוף בורג 5.04 מ"מ - 1
- כותרת נקבה - 1
- מקור כוח 12V - 1
מחולל פונקציות מבוסס AD9833 - תרשים סכמטי
תרשים המעגל השלם עבור מחולל הפונקציות מבוסס AD9833 ו- Arduino מוצג להלן.
אנו הולכים להשתמש ב- AD9833 עם Arduino כדי ליצור את התדר הרצוי שלנו. ובסעיף זה נסביר את כל הפרטים בעזרת הסכימה; תן לי לתת לך סקירה קצרה על מה שקורה במעגל. נתחיל במודול AD9833. מודול AD9833 הוא מודול מחולל הפונקציות והוא מחובר לארדואינו על פי הסכימה. כדי להניע את המעגל, אנו משתמשים בווסת מתח LM7809, עם קבל ניתוק ראוי, זה הכרחי מכיוון שרעש האספקה יכול להפריע לאות הפלט וכתוצאה מכך פלט לא רצוי. כמו תמיד, הארדואינו עובד כמוח לפרויקט זה. להצגת התדר שנקבע ומידע חשוב אחר, חיברנו מודול תצוגת OLED 128 X 64. כדי לשנות את טווח התדרים, אנו משתמשים בשלושה מתגים. הראשון מכוון את התדר ל- Hz, השני מגדיר את תדר הפלט ל- KHz, והשלישי מכוון את התדר ל- MHz, יש לנו גם כפתור נוסף שניתן להשתמש בו כדי להפעיל או להשבית את הפלט. לבסוף, יש לנו את המקודד הסיבובי,ועלינו לחבר נגדו איזה נגע משיכה אחרת המתגים האלה לא יעבדו מכיוון שאנו בודקים את אירוע לחיצת הכפתור בשיטת האיחוד. המקודד הסיבובי משמש לשינוי התדר ומתג המישוש בתוך המקודד הסיבובי משמש לבחירת צורת הגל שנקבעה.
מחולל פונקציות מבוסס AD9833 - קוד ארדואינו
הקוד השלם המשמש בפרויקט זה נמצא בתחתית עמוד זה. לאחר הוספת קבצי הכותרת הנדרשים וקבצי המקור, אתה אמור להיות מסוגל לקמפל ישירות את קובץ ה- Arduino. אתה יכול להוריד את ספריית ad9833 Arduino וספריות אחרות מהקישור המופיע למטה, אחרת תוכל להשתמש בשיטת מנהל הלוחות להתקנת הספרייה.
- הורד את ספריית AD9833 מאת ביל וויליאמס
- הורד את SSD1306 OLED Library על ידי Adafruit
- הורד את ספריית ה- GFX של Adafruit
ההסבר לקוד ב- ino. הקובץ הוא כדלקמן. ראשית, אנו מתחילים לכלול את כל הספריות הנדרשות. הספרייה עבור מודול AD9833 DDS מלווה תחילה את הספרייה עבור OLED וספריית המתמטיקה נדרשת לחלק מהחישובים שלנו.
# כלול // LIbrary עבור AD9833 מודול # כלול
לאחר מכן, אנו מגדירים את כל סיכות הכניסה והפלט הדרושות עבור הכפתורים, המתג, המקודד הסיבובי ו- OLED.
#define SCREEN_WIDATA_PINH 128 // תצוגת OLED רוחב בפיקסלים # הגדר SCREEN_HEIGHT 64 // גובה תצוגת OLED, בפיקסלים # הגדר SET_FREQUENCY_HZ A2 // כפתור לחיצה להגדרת תדר בהרץ # הגדר SET_FREQUENCY_KHZ A3 // כפתור לחצן להגדרת תדירות ב- Khz A6 // כפתור לחיצה להגדרת תדר ב- Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // לחצן לחיצה להפעלה / השבתה של הפלט #define FNC_PIN 4 // Fsync נדרש על ידי מודול AD9833 #define CLK_PIN 8 // Pin Pin of the Encoder #define DATA_P / פין נתונים של המקודד # הגדר BTN_PIN 9 // לחצן לחיצה פנימי על המקודד
לאחר מכן אנו מגדירים את כל המשתנים הדרושים הנדרשים בקוד זה. ראשית, אנו מגדירים מונה משתנה שלם שיאחסן את ערך המקודד הסיבובי. שני המשתנים הבאים clockPin ו- clockPinState מאחסנים את פסל הסיכה הנדרש להבנת כיוון המקודד. יש לנו משתנה זמן המכיל את ערכי הטיימר-דלפק הנוכחיים, משתנה זה משמש לשיפור כפתורים. לאחר מכן, יש לנו מודול משתנה ארוך לא חתום המכיל את התדר המחושב שעומד להיות מיושם. לאחר מכן, יש לנו את עיכוב ההפחתה. ניתן לכוונן עיכוב זה כנדרש. לאחר מכן, יש לנו שלושה משתנים בוליאניים set_frequency_hz,set_frequency_Khz ו- set_frequency_Mhz שלושת המשתנים הללו משמשים לקביעת ההגדרה הנוכחית של המודול. נדבר על כך ביתר פירוט בהמשך המאמר. לאחר מכן, יש לנו את המשתנה המאחסן את הסטטוס של צורת גל הפלט, צורת גל הפלט המוגדרת כברירת מחדל היא גל סינוס. ולבסוף, יש לנו את המשתנה encoder_btn_count המחזיק בספירת כפתורי המקודד המשמשת לקביעת צורת גל הפלט.
מונה int = 1; // ערך מונה זה יגדל או יקטן אם כאשר מקודד הסיבובי מסובב int clockPin; // מציין מיקום למעמד הסיכה המשמש את המקודד הסיבובי int clockPinState; // מציין מיקום לסטטוס הסיכה המשמש את המקודד הסיבובי זמן לא חתום = 0; // משמש להפצה של מודול ארוך לא חתום Frequency; // משמש לקביעת תדר פלט debounce ארוך = 220; // ביטול עיכוב ביטול bool btn_state; // משמש לאפשר השבתת פלט של מודול ה- AD98333 bool set_frequency_hz = 1; // תדירות ההשבתה של מודול ה- AD9833 bool set_frequency_khz; bool set_frequency_mhz; מחרוזת waveSelect = "SIN"; // צורת גל הפעלה של המודול int encoder_btn_count = 0; // משמש לבדיקת לחצן מקודד לחץ על הבא, יש לנו שני האובייקטים אחד הוא לתצוגת OLED ואחד אחר מיועד למודול AD9833.תצוגת Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
לאחר מכן, יש לנו את פונקציית ההתקנה () שלנו, בפונקציית ההתקנה הזו, אנו מתחילים עם הפעלת סדרת הבאגים. אנו מאתחלים את מודול AD9833 בעזרת שיטת start (). לאחר מכן, הגדרנו את כל הפינים המקודדים הסיבוביים שהוקצו כקלט. ואנו שומרים את ערך סיכת השעון במשתנה clockPinState, זהו שלב הכרחי עבור המקודד הסיבובי.
לאחר מכן, אנו מגדירים את כל סיכות הכפתור כקלט ומאפשרים את תצוגת ה- OLED בעזרת שיטת display.begin () , כמו כן אנו בודקים אם קיימות שגיאות עם משפט if . כאשר זה נעשה, אנו מנקים את התצוגה ומדפיסים מסך הפתיחה של ההפעלה, אנו מוסיפים עיכוב של 2 שניות שהוא גם העיכוב למסך הספלאש, ולבסוף, אנו קוראים לפונקציה update_display () שמנקה את המסך ומעדכן את להציג שוב. הפרטים של שיטת update_display () יידונו בהמשך המאמר.
הגדרת חלל () {Serial.begin (9600); // אפשר Serial @ 9600 baud gen.Begin (); // זו חייבת להיות הפקודה הראשונה לאחר הכרזת האובייקט pinMode AD9833 (CLK_PIN, INPUT); // הגדרת סיכות כסיכת קלט (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // הגדרת סיכות כ pinMode קלט (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); אם (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// כתובת 0x3D עבור 128x64 Serial.println (F ("הקצאת SSD1306 נכשלה")); ל (;;); } display.clearDisplay (); // נקה את תצוגת המסך. SetTextSize (2); // הגדר תצוגת גודל טקסט. SetTextColor (לבן); // הגדר תצוגת LCD צבעונית. setCursor (30, 0); // הגדר תצוגת עמדת סמן display.println ("AD9833"); // הדפס את תצוגת הטקסט הזו.setCursor (17, 20); // הגדר את עמדת הסמן display.println ("פונקציה"); // הדפס את תצוגת הטקסט הזו. SetCursor (13, 40); // הגדר תצוגת עמדת סמן display.println ("גנרטור"); // הדפס את תצוגת הטקסט הזו. תצוגה (); // עדכן את עיכוב התצוגה (2000); // עיכוב של שני עדכוני התצוגה של SEC (); // פונקציית עדכון תצוגת שיחה}
לאחר מכן, יש לנו את פונקציית הלולאה שלנו (), כל הפונקציות העיקריות נכתבות בסעיף הלולאה.
ראשית, אנו קוראים את סיכת השעון של המקודד הסיבובי ואוחסנים אותו במשתנה clockPin עליו הכרזנו קודם. לאחר מכן, בהצהרת if , אנו בודקים אם הערך הקודם של הסיכה והערך הנוכחי של הסיכה דומה או לא ונבדוק גם את הערך הנוכחי של הסיכה. אם הכל נכון, אנו בודקים אם יש את סיכת הנתונים, אם נכון זה אומר שהמקודד מסתובב נגד כיוון השעון ואנחנו מקטינים את ערך המונה בעזרת הפקודה נגד. אחרת אנו מגדילים את ערך המונה באמצעות הפקודה counter ++. לבסוף, שמנו הצהרת if נוספת כדי לקבוע את הערך המינימלי ל- 1. לאחר מכן אנו מעדכנים את clockPinState עם השעון הנוכחי Pinערך לשימוש עתידי.
loop loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } אחר {counter ++; // Encoder is rotating CW so increment} if (counter <1) counter = 1; Serial.println (מונה); update_display (); }
לאחר מכן, יש לנו את הקוד לזהות לחיצת כפתור. בחלק זה גילינו את הכפתור בתוך המקודד בעזרת כמה הצהרות מקוננות אם (digitalRead (BTN_PIN) == LOW && millis () - זמן> להוקיע), בהצהרה זו, ראשית נבדוק אם הכפתור הסיכה נמוכה או לא, אם היא נמוכה, היא נלחצת. ואז שוב אנו בודקים את ערך הטיימר עם עיכוב ההפצה, אם שתי ההצהרות נכונות, אז אנו מכריזים על כך שפעולת לחיצת כפתור מוצלחת אם כן אנו מגדילים את ערך encoder_btn_count לאחר מכן, אנו מכריזים על הצהרה נוספת אם להגדיר את ערך המונה המקסימלי ל -2, אנו זקוקים לה מכיוון שאנו משתמשים בה כדי לקבוע את צורת גל הפלט.שלושת הרציפות אם הצהרות עושות זאת, אם הערך הוא אפס, נבחר צורת גל סינוס, אם זה אחד, זה גל מרובע, ואם הערך הוא 2, זה גל משולש. בכל שלושת הצהרות ה- if הללו אנו מעדכנים את התצוגה בפונקציה update_display () . ולבסוף, אנו מעדכנים את משתנה הזמן בערך מונה הטיימר הנוכחי.
// אם אנו מזהים אות LOW, הלחצן נלחץ אם (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // הגדל את הערכים אם (encoder_btn_count> 2) // אם הערך גדול מ- 2 אפס אותו ל- 0 {encoder_btn_count = 0; } אם (encoder_btn_count == 0) {// אם הערך הוא 0 גל סינוס נבחר waveSelect = "SIN"; // עדכן את משתנה המחרוזת בערך sin_date_display (); // עדכן את התצוגה} אם (encoder_btn_count == 1) {// אם הערך הוא גל מרובע אחד נבחר waveSelect = "SQR"; // עדכן את משתנה המחרוזת בערך SQR update_display (); // עדכן את התצוגה} אם (encoder_btn_count == 2) {// אם הערך הוא גל משולש אחד נבחר waveSelect = "TRI"; // עדכן את משתנה המחרוזת בערך TRI update_display ();// עדכן את התצוגה} זמן = מילי (); // עדכן את משתנה הזמן}
לאחר מכן, אנו מגדירים את כל הקוד הדרוש הנדרש כדי להגדיר את כל הכפתורים עם עיכוב ההפעלה. מכיוון שהלחצנים מחוברים לסיכות האנלוגיות של הארדואינו, אנו משתמשים בפקודת הקריאה האנלוגית כדי לזהות לחיצת כפתור אם ערך הקריאה האנלוגי מגיע מתחת ל -30, ואז אנו מזהים לחיצת כפתור מוצלחת ונחכה ל 200 ms בדוק אם מדובר בלחיצת כפתור בפועל או רעש בלבד. אם הצהרה זו נכונה, אנו מקצים למשתנים הבוליאניים ערכים המשמשים לקביעת ערכי הרץ, חצ, ו Mhz של מחולל הפונקציות. לאחר מכן אנו מעדכנים את התצוגה ומעדכנים את משתנה הזמן. אנו עושים זאת עבור כל ארבעת הכפתורים המחוברים לארדואינו.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // עדכן ערכים בוליאניים set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // עדכן את זמן התצוגה = מילי (); // עדכן את משתנה הזמן} אם (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // עדכן ערכים בוליאניים set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = מונה * 1000; update_display (); // עדכן את זמן התצוגה = millis (); // עדכן את משתנה הזמן} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// בדוק סיכה אנלוגית עם עיכוב ההפצה set_frequency_hz = 0; // עדכן ערכים בוליאניים set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = מונה * 1000000; update_display ();// עדכן את זמן התצוגה = מילי (); // עדכן את משתנה הזמן} אם (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// בדוק סיכה אנלוגית עם עיכוב ההנמכה btn_state =! btn_state; // הפוך את מצב הכפתור gen.EnableOutput (btn_state); // אפשר / השבת את הפלט של מחולל הפונקציות בהתאם למצב כפתור update_display (); // עדכן את זמן התצוגה = millis (); // עדכן את משתנה הזמן}}// עדכן את משתנה הזמן}}// עדכן את משתנה הזמן}}
לבסוף, יש לנו את הפונקציה update_display (). בפונקציה זו עשינו הרבה יותר מסתם עדכון תצוגה זו מכיוון שלא ניתן לעדכן חלק מסוים בתצוגה ב- OLED. כדי לעדכן אותו, עליך לצבוע אותו מחדש בערכים חדשים. זה הופך את תהליך הקידוד להרבה יותר קשה.
בתוך פונקציה זו, אנו מתחילים עם ניקוי התצוגה. לאחר מכן, הגדרנו את גודל הטקסט הנדרש. לאחר מכן, הגדרנו את הסמן ואת מחולל הפונקציות המודפס עם התצוגה. Println ("פונקציית פונקציה"); פקודה. הגדרנו שוב את גודל הטקסט ל -2 והסמן ל (0,20) בעזרת פונקציית display.setCursor (0, 20).
זה המקום בו אנו מדפיסים את המידע לאיזה גל מדובר.
display.clearDisplay (); // ראשית נקה את תצוגת התצוגה. SetTextSize (1); // הגדר גודל טקסט display.setCursor (10, 0); // הגדר תצוגת מיקום סמן.println ("מחולל פונקציות"); // הדפס את תצוגת הטקסט. setTextSize (2); // הגדר תצוגת גודל טקסט. setCursor (0, 20); // הגדר מיקום סמן
לאחר מכן, אנו בודקים את המשתנים הבוליאניים לפרטי תדרים ומעדכנים את הערך במשתנה moduleFrequency. אנו עושים זאת עבור ערכי הרץ, kHz ו- MHz. לאחר מכן, אנו בודקים את המשתנה waveSelect ומזהים איזה גל נבחר. כעת, יש לנו את הערכים לקביעת סוג הגל והתדר.
אם (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// בדקו אם לחצן להגדרת התדר בהרץ נלחץ moduleFrequency = counter; // עדכן את המשתנה moduleFrequency עם ערך המונה הנוכחי} אם (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// בדוק אם לחצן להגדרת התדר ב- KHz נלחץ על moduleFrequency = מונה * 1000; // עדכן את המשתנה moduleFrequency עם ערך המונה הנוכחי אך אנו מכפילים 1000 כדי להגדיר אותו על KHZ} אם (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// בדקו אם לחצן להגדרת התדר ב- MHz נלחץ = מונה * 1000000; אם (moduleFrequency> 12000000) {moduleFrequency = 12000000;// אל תתנו לתדירות להיות פומפייה שמונה 12Mhz = 12; }} אם (waveSelect == "SIN") {// גל סינוס נבחר display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } אם (waveSelect == "SQR") {// Sqr גל נבחר display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } אם (waveSelect == "TRI") {// גל Tri נבחר display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // עדכן את מודול AD9833. Serial.println (moduleFrequency); }} אם (waveSelect == "SQR") {// גל Sqr נבחר display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } אם (waveSelect == "TRI") {// גל Tri נבחר display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // עדכן את מודול AD9833. Serial.println (moduleFrequency); }} אם (waveSelect == "SQR") {// גל Sqr נבחר display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } אם (waveSelect == "TRI") {// גל טרי נבחר display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // עדכן את מודול AD9833. Serial.println (moduleFrequency); }
אנו קובעים את הסמן ומעדכנים את ערכי הנגד. שוב אנו בודקים את הבוליאני כדי לעדכן את טווח התדרים בתצוגה, עלינו לעשות זאת מכיוון שעקרון העבודה של ה- OLED הוא מוזר מאוד.
display.setCursor (45, 20); display.println (מונה); // הדפיסו את המידע הנגדי בתצוגה. אם (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("הרץ"); // הדפס הרץ בתצוגת התצוגה. תצוגה (); // כאשר כל הסטים מעדכנים את התצוגה} אם (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // כאשר כל הסטים מעדכנים את התצוגה} אם (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // כאשר כל הסטים מעדכנים את התצוגה}
לאחר מכן, אנו בודקים את משתנה לחיצת הכפתור כדי להדפיס את הפלט / הפלטו אל ה- OLED. שוב זה צריך להיעשות בגלל מודול ה- OLED.
אם (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("פלט מופעל"); // פלט הדפסה לתצוגת התצוגה. תצוגה (); display.setTextSize (2); } אחר {display.setTextSize (1); display.setCursor (65, 45); display.print ("פלט כבוי"); // פלט ההדפסה לתצוגת התצוגה. תצוגה (); display.setTextSize (2); }
זה מסיים את סוף תהליך הקידוד שלנו. אם אתה מבולבל בשלב זה, תוכל לבדוק את ההערות בקוד להבנה נוספת.
בדיקת מחולל הפונקציות המבוסס על AD9833
כדי לבדוק את המעגל, נעשה שימוש בהתקנה שלעיל. כפי שאתה יכול לראות, חיברנו מתאם מתח 12 וולט DC לשקע החבית DC וחיברנו את אוסצילוסקופ האנטק לפלט המעגל. חיברנו גם את האוסצילוסקופ למחשב הנייד כדי להמחיש ולמדוד את תדר הפלט.
לאחר שנעשה זאת, הגדרנו את תדר המוצא ל 5 Khz בעזרת המקודד הסיבובי ואנו בודקים את גל הסינוס המוצא ובוודאי, זהו גל סינוס 5 Khz בפלט.
לאחר מכן, שינינו את צורת גל הפלט לגל משולש אך התדר נשאר זהה, צורת גל הפלט מוצגת למטה.
ואז שינינו את התפוקה לגל מרובע וצפינו בפלט, וזה היה גל מרובע מושלם.
שינינו גם את טווחי התדרים ובדקנו את הפלט וזה עבד היטב.
שיפורים נוספים
מעגל זה מהווה הוכחה מושגית בלבד וזקוק לשיפורים נוספים. ראשית, אנו זקוקים למחשבי PCB באיכות טובה וכמה מחברי BNC איכותיים עבור הפלט אחרת איננו יכולים להשיג תדר גבוה יותר. המשרעת של המודול נמוכה מאוד, אז כדי לשפר את זה, אנחנו זקוקים לכמה מעגלי מגבר-על כדי להגביר את מתח המוצא. ניתן לחבר פוטנציומטר על מנת לשנות את משרעת הפלט. ניתן לחבר מתג לקיזוז האות; זו גם תכונה חובה. ויתר על כן, הקוד זקוק לשיפור רב מכיוון שהוא מעט מרכב. לבסוף, יש לשנות את תצוגות ה- OLED אחרת אי אפשר לכתוב קוד מובן בקלות.
זה מסיים את סוף המדריך הזה, אני מקווה שאהבתם את המאמר ולמדתם משהו חדש. אם יש לך שאלות בנוגע למאמר, תוכל להשאיר אותן בסעיף ההערות למטה או להשתמש בפורום האלקטרוניקה שלנו.