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

מתח אנלוגי מהיר במיוחד מארדואינו: 10 שלבים (עם תמונות)
מתח אנלוגי מהיר במיוחד מארדואינו: 10 שלבים (עם תמונות)

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

וִידֵאוֹ: מתח אנלוגי מהיר במיוחד מארדואינו: 10 שלבים (עם תמונות)
וִידֵאוֹ: What is Servo Motor 2024, יולי
Anonim
Image
Image

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

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

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

אם אהבתם את המדריך הזה, אנא שקלו להצביע עבורו!:)

שלב 1: בניית המעגל

בניית המעגל
בניית המעגל

כדי לבנות את המעגל, תזדקק לדברים הבאים:

א) Arduino המבוסס על Atmega328P Atmel 16MHz, כגון Arduino Uno או Arduino Nano.

ב) שני נגדים בעלי ערך R שהם לפחות 150Ω.

ג) שני קבלים בעלי ערך C כך ש- C = 0.0015 / R, דוגמאות:

  • R = 150Ω ו- C = 10µ
  • R = 1.5kΩ ו- C = 1µ
  • R = 15kΩ ו- C = 100nF
  • R = 150kΩ ו- C = 10nF

הסיבות לבחירת ערכים אלה הן כפולות. בעיקרון, אנו רוצים לשמור על הזרם על הפינים של הארדואינו מתחת לזרם המדורג המרבי של 40mA. שימוש בערך 150Ω מגביל את הזרם ל 30mA בעת שימוש במתח האספקה של Arduino של 5V. ערכים גדולים יותר של R יקטינו את הזרם ולכן הם מקובלים.

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

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

שלב 2: הגדרת האוסילוסקופ

הגדרת האוסילוסקופ
הגדרת האוסילוסקופ

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

א) הגדר את הטאטא האופקית לשליטה על ידי ערוץ B (ציר ה- X).

ב) הגדר את האוסילוסקופ למצב ערוץ כפול.

ג) הגדר את הוולט/div בשני הערוצים כך שיוכל להציג מתח מ 0V עד 5V. הגדרתי את שלי ל- 0.5V/div.

ד) הגדר את מצב הצימוד ל- DC בשני הערוצים.

ה) התאם את המיקום של X ו- Y כך שהנקודה תהיה בפינה השמאלית התחתונה של המסך כאשר ה- Arduino כבוי.

שלב 3: הורד והפעל את התוכנה

Image
Image

הורד את התוכנה מהתצוגה הווקטורית המהירה עבור מאגר Arduino. התוכנה בעלת רישיון תחת GNU Affero Public License v3 וניתנת לשימוש חופשי ולשינוי בהתאם לתנאי הרישיון.

פתח את הקובץ "fast-vector-display-arduino.ino" ב- Arduino IDE והעלה אותו ל- Arduino שלך. לרגע תראה אנימציה של "שנה טובה" על מסך האוסילוסקופ שלך.

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

שלב 4: צור ציור מותאם אישית משלך

להבין מדוע PWM כל כך איטי
להבין מדוע PWM כל כך איטי

אם ברצונך ליצור ציור משלך, תוכל להדביק קואורדינטות נקודתיות בסקיצה של ארדואינו בקו המגדיר את USER_PATTERN.

גיליתי ש- Inkscape הוא כלי די טוב ליצירת ציור מותאם אישית:

  1. צור טקסט באמצעות גופן גדול ונועז כגון Impact.
  2. בחר את אובייקט הטקסט ובחר "אובייקט לנתיב" מתפריט "נתיב".
  3. בחר אותיות בודדות וחפף אותן ליצירת צורה מחוברת
  4. בחר "איחוד" מהתפריט "נתיב" כדי לשלב אותם לעקומה אחת.
  5. אם יש חורים באותיות כלשהן, חותכים חריץ קטן על ידי ציור מלבן בעזרת כלי המלבן וחסר אותו מהמתאר בעזרת הכלי "הבדל".
  6. לחץ פעמיים על הנתיב להצגת הצמתים.
  7. מלבן בחר את כל הצמתים ולחץ על הכלי "צור פינת צמתים נבחרים".
  8. שמור את קובץ ה- SVG.

הדבר החשוב הוא שהציור שלך צריך להיות בעל שביל אחד סגור וללא חורים. ודא שיש לעיצוב שלך פחות מ -130 נקודות.

שלב 5: הדבק את הקואורדינטות מקובץ ה- SVG לתוך ה- IDE של Arduino

  1. פתח את קובץ SVG והעתק את הקואורדינטות. אלה יוטמעו ברכיב "הנתיב". ניתן להתעלם מצמד הקואורדינטות הראשון; להחליף אותם ב 0, 0.
  2. הדבק את הקואורדינטות בסקיצה של Arduino בתוך הסוגריים מיד אחרי "#define USER_PATTERN".
  3. החלף את כל הרווחים בפסיקים, אחרת תקבל שגיאת הידור. הכלי "החלף ומצא" עשוי להועיל.
  4. הידור והפעל!
  5. אם יש לך בעיות, צפה בקונסולה הטורית אם יש שגיאות. במיוחד תראה הודעות אם לתבנית שלך יש יותר מדי נקודות למאגר הפנימי. במקרים כאלה, התמונה תציג הבהוב מוגזם.

שלב 6: הבין מדוע PWM כל כך איטי

ראשית, נסקור את התנהגותו של הקבל בזמן הטעינה.

קבל המחובר למקור מתח Vcc יעלה את המתח שלו על פי עקומה מעריכית. עקומה זו היא אסימפטוטית, כלומר היא תאט כאשר היא מתקרבת למתח המטרה. לכל מטרה מעשית, המתח "קרוב מספיק" לאחר 5 שניות RC. ה- RC נקרא "קבוע הזמן". כפי שראינו קודם, הוא תוצר של ערכי הנגד והקבל במעגל שלך. הבעיה היא ש- 5 RC הוא זמן ארוך למדי לעדכון כל נקודה בתצוגה גרפית. זה מוביל להבהובים רבים!

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

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

שלב 7: עברו מ- a ל- B, טיפה טיפה מהר יותר

קבל מ- a ל- B, טיפה טיפה מהר יותר
קבל מ- a ל- B, טיפה טיפה מהר יותר

נניח שיש לנו קבל שכבר טעון עד Va. נניח שאנו משתמשים ב- analogWrite () כדי לכתוב את הערך החדש של b. מהו פרק הזמן המינימלי שיש לך להמתין להשגת המתח Vb?

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

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

אז אם לא מחכים לזמן הזה, אנו רואים שיפור. הזמן t_ab למעשה קצת יותר קצר מ- 5 RC.

אבל רגע, אנחנו יכולים לעשות הרבה יותר טוב! תסתכל על כל החלל הזה מעל v_b. זהו ההבדל בין Vcc, המתח המרבי העומד לרשותנו לבין ה- Vb שאליו אנו מתכוונים להגיע. האם אתה יכול לראות כיצד המתח הנוסף הזה יכול לעזור לנו להגיע לאן שאנו רוצים להגיע הרבה יותר מהר?

שלב 8: קבל מא 'ל- B, עם מטען טורבו

קבל מא 'לב', עם מטען טורבו!
קבל מא 'לב', עם מטען טורבו!

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

בשיטה זו ניתן לשנות את המתח בקבל מ- V_a ל- V_b תוך חלקיק מהזמן מאשר שימוש ב- PWM בלבד. כך אתה משיג מקומות, מותק!

שלב 9: הבנת הקוד

להבין את הקוד
להבין את הקוד

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

  • נתוני הגרפיקה נשמרים ב- PROGMEM (כלומר, זיכרון פלאש) כרשימת נקודות.
  • כל שילוב של פעולות תרגום, קנה מידה וסיבוב משולבים למטריצת טרנספורמציה אפינית. זה נעשה פעם אחת בתחילת כל מסגרת אנימציה.
  • הנקודות נקראות אחת-אחת מנתוני גרפיקה וכל אחת מהן מוכפלת במטריצת השינוי המאוחסנת.
  • הנקודות שהשתנו מוזנות באמצעות אלגוריתם מספריים אשר חותך נקודות מחוץ לאזור הגלוי.
  • באמצעות טבלת בדיקת עיכוב RC, הנקודות מומרות למתח נהיגה ולעיכובים בזמן. טבלת בדיקת עיכוב RC מאוחסנת ב- EEPROM וניתנת לשימוש חוזר עבור מספר ריצות של הקוד. בעת ההפעלה, טבלת בדיקת RC נבדקת לדיוק וכל ערכים שגויים מתעדכנים. השימוש ב- EEPROM חוסך זיכרון RAM יקר.
  • מתח והעיכובים נכתבים למסגרת הלא פעילה במאגר המסגרות. מאגר המסגרות מכיל מקום למסגרת פעילה ולמסגרת לא פעילה. לאחר כתיבת מסגרת שלמה, המסגרת הלא פעילה הופכת לפעילה.
  • שגרת שירות קטיעה שוב ושוב מציירת את התמונה על ידי קריאת ערכי מתח ועיכובים ממאגר המסגרות הפעיל. בהתבסס על ערכים אלה, הוא מתאים את מחזורי העבודה של סיכות הפלט. טיימר 1 משמש למדידת עיכוב הזמן עד לכמה ננו -שניות של דיוק, ואילו טיימר 2 משמש לשליטה על מחזור ההפעלה של סיכות.
  • הסיכה עם השינוי הגדול ביותר במתח היא תמיד "טעונה טורבו" עם מחזור עבודה של אפס או 100%, המספק את זמן הטעינה או הפריקה המהירה ביותר. הסיכה עם שינוי מתח פחות מונעת באמצעות מחזור הפעלה שנבחר להתאים את זמן המעבר של הסיכה הראשונה-התאמת הזמן הזו חשובה על מנת להבטיח כי קווים יימשכו ישר באוסילוסקופ.

שלב 10: במהירות רבה מגיע אחריות רבה

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

  1. הוא רגיש במיוחד לתזמון. לאחר שנגיע לרמת מתח היעד, יש להעביר מיד את סיכת הנהיגה למצב PWM רגיל על מנת להימנע מירידה במתח היעד.
  2. זה דורש ידע על קבוע RC, ולכן יש להזין ערכים אלה מראש. עם ערכים שגויים, העיתוי יהיה שגוי והמתחים לא נכונים. עם PWM רגיל, יש אחריות שתסתפקו במתח הנכון לאחר זמן מה, גם אם קבוע ה- RC אינו ידוע.
  3. חישוב מרווח הזמן המדויק לטעינת הקבל דורש משוואות לוגריתמיות איטיות מדי לחישוב בזמן אמת על הארדואינו. יש לחשב אותם מראש לפני כל מסגרת אנימציה ולשמור אותם בזיכרון איפשהו.
  4. תוכניות העוסקות בשיטה זו חייבות להתמודד עם העובדה שהעיכובים מאוד לא ליניאריים (הם למעשה אקספוננציאליים). מתחי מטרה ליד Vcc או GND ייקח לסדרי גודל רבים יותר להגיע למתחים ליד נקודת האמצע.

כדי להתגבר על מגבלות אלה, קוד הגרפיקה הווקטורית שלי עושה את הדברים הבאים:

  1. הוא משתמש בטיימר 1 במהירות 16 קילוהרץ ושגרת שירות להפרעה לצורך מניפולציה ותזמון מדויק של הפלט.
  2. זה דורש שימוש ספציפי של קבוע זמן RC לשימוש, המגביל את הבחירות של ערכי הקבלים והנגד.
  3. הוא מאחסן את עיכובי הזמן לכל הנקודות במסגרת אנימציה במאגר זיכרון. המשמעות היא שהשגרה שמחשבת את עיכובי הזמן פועלת בקצב איטי בהרבה משגרת השירות להפריע שמעדכנת את סיכות הפלט. כל מסגרת נתונה עשויה להיות צבועה כמה עשרות פעמים לפני שערכת עיכובים חדשה למסגרת הבאה תהיה מוכנה לשימוש.
  4. השימוש במאגר זיכרון מעמיד אילוץ על מספר הנקודות שניתן לצייר לכל מסגרת. אני משתמש בקידוד יעיל בחלל כדי להפיק את המרב מה- RAM הזמין, אך הוא עדיין מוגבל לכ -150 נקודות. מעבר למאה נקודות בערך, התצוגה ממילא תתחיל להבהב, כך שזו נקודה חשובה!

מוּמלָץ: