- רכיבים נדרשים
- MCP4725 DAC מודול (ממיר דיגיטלי לאנלוגי)
- תקשורת I2C ב- MCP4725
- תרשים מעגל והסבר
- תכנות STM32F103C8 להמרה דיגיטלית לאנלוגית
- בדיקת ה- DAC עם STM32
כולנו יודעים שמיקרו-בקרים עובדים רק עם ערכים דיגיטליים אבל בעולם האמיתי עלינו להתמודד עם אותות אנלוגיים. לכן ADC (ממירים אנלוגיים לדיגיטליים) נמצא שם כדי להמיר ערכים אנלוגיים בעולם האמיתי לצורה דיגיטלית, כך שמיקרו-בקרים יוכלו לעבד את האותות. אבל מה אם אנו זקוקים לאותות אנלוגיים מערכים דיגיטליים, אז הנה מגיע ה- DAC (ממיר דיגיטלי לאנלוגי).
דוגמה פשוטה לממיר דיגיטלי לאנלוגי היא הקלטת שיר באולפן שבו זמר אומן משתמש במיקרופון ושר שיר. גלי קול אנלוגיים אלו מומרים לצורה דיגיטלית ואז מאוחסנים בקובץ בפורמט דיגיטלי וכאשר מנגנים את השיר באמצעות הקובץ הדיגיטלי המאוחסן ערכים דיגיטליים אלה מומרים לאותות אנלוגיים להפקת רמקולים. אז במערכת זו משתמשים ב- DAC.
ניתן להשתמש ב- DAC ביישומים רבים כגון בקרת מנוע, בהירות בקרה של נורות LED, מגבר שמע, מקודדי וידאו, מערכות לרכישת נתונים וכו '.
כבר ממשקנו את מודול DAC MCP4725 עם Arduino. היום נשתמש באותו MCP4725 DAC IC לתכנון ממיר דיגיטלי לאנלוגי באמצעות המיקרו-בקר STM32F103C8.
רכיבים נדרשים
- STM32F103C8
- MCP4725 DAC IC
- פוטנציומטר 10k
- תצוגת LCD 16x2
- קרש לחם
- חוטי חיבור
MCP4725 DAC מודול (ממיר דיגיטלי לאנלוגי)
MCP4725 IC הוא מודול ממיר דיגיטלי לאנלוגי בן 12 סיביות המשמש להפקת מתח אנלוגי פלט מ (0 עד 5 וולט) והוא נשלט באמצעות תקשורת I2C. זה מגיע גם עם EEPROM זיכרון לא נדיף.
ל- IC זה רזולוציה של 12 סיביות. פירוש הדבר שאנו משתמשים (0 עד 4096) כקלט לספק את פלט המתח ביחס למתח הייחוס. מתח ייחוס מרבי הוא 5 וולט.
נוסחה לחישוב מתח היציאה
מתח O / P = (מתח / רזולוציה הפניה) x ערך דיגיטלי
לדוגמא אם אנו משתמשים ב- 5V כמתח ייחוס ונניח שהערך הדיגיטלי הוא 2048. אז כדי לחשב את תפוקת DAC.
מתח O / P = (5/4096) x 2048 = 2.5V
Pinout של MCP4725להלן התמונה של MCP4725 עם ציון ברור של שמות סיכות.
סיכות של MCP4725 |
להשתמש |
הַחוּצָה |
יציאות מתח אנלוגי |
GND |
GND לפלט |
SCL |
קו שעון סדרתי I2C |
SDA |
קו נתונים סידורי I2C |
VCC |
מתח התייחסות כניסה 5V או 3.3V |
GND |
GND לקלט |
תקשורת I2C ב- MCP4725
ניתן לממשק DAC IC זה עם כל מיקרו-בקר המשתמש בתקשורת I2C. תקשורת I2C דורשת שני חוטים SCL ו- SDA בלבד. כברירת מחדל, כתובת I2C עבור MCP4725 היא 0x60. עקוב אחר הקישור למידע נוסף על תקשורת I2C ב- STM32F103C8.
סיכות I2C ב- STM32F103C8:
SDA: PB7 או PB9, PB11.
SCL: PB6 או PB8, PB10.
תרשים מעגל והסבר
חיבורים בין STM32F103C8 ו- 16x2 LCD
פין LCD לא |
שם פין LCD |
שם פין STM32 |
1 |
קרקע (GND) |
קרקע (G) |
2 |
VCC |
5V |
3 |
VEE |
סיכה ממרכז פוטנציומטר לצורך ניגודיות |
4 |
בחר הרשמה (RS) |
PB11 |
5 |
קריאה / כתיבה (RW) |
קרקע (G) |
6 |
הפעל (EN) |
PB10 |
7 |
נתונים נתונים 0 (DB0) |
אין חיבור (NC) |
8 |
נתונים ביט 1 (DB1) |
אין חיבור (NC) |
9 |
נתונים ביט 2 (DB2) |
אין חיבור (NC) |
10 |
נתונים ביט 3 (DB3) |
אין חיבור (NC) |
11 |
נתונים ביט 4 (DB4) |
PB0 |
12 |
נתונים ביט 5 (DB5) |
PB1 |
13 |
נתונים ביט 6 (DB6) |
PC13 |
14 |
נתונים ביט 7 (DB7) |
PC14 |
15 |
LED חיובי |
5V |
16 |
LED שלילי |
קרקע (G) |
חיבור בין MCP4725 DAC IC ל- STM32F103C8
MCP4725 |
STM32F103C8 |
מולטימטר |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
הַחוּצָה |
PA1 |
בדיקה חיובית |
GND |
GND |
בדיקה שלילית |
VCC |
3.3 וולט |
NC |
מחובר גם פוטנציומטר, כאשר סיכה מרכזית מחוברת לכניסה אנלוגית PA1 (ADC) של STM32F10C8, סיכה שמאלית מחוברת ל- GND והסיכה הימנית ביותר מחוברת ל -3.3 V של STM32F103C8.
במדריך זה נחבר MCP4725 DAC IC עם STM32 ונשתמש בפוטנציומטר 10k כדי לספק ערך קלט אנלוגי לסיכה STM32 ADC PA0. ואז השתמש ב- ADC כדי להמיר ערך אנלוגי לצורה דיגיטלית. לאחר מכן שלח את הערכים הדיגיטליים האלה ל- MCP4725 באמצעות אוטובוס I2C. לאחר מכן המירו את אותם ערכים דיגיטליים לאנלוגיים באמצעות ה- DAC MCP4725 IC ואז השתמשו בפין ADC אחר PA1 של STM32 כדי לבדוק את הפלט האנלוגי של MCP4725 מהסיכה OUT. לבסוף הציגו את שני ערכי ה- ADC וה- DAC עם מתחים בתצוגת LCD 16x2.
תכנות STM32F103C8 להמרה דיגיטלית לאנלוגית
אין צורך כעת במתכנת FTDI כדי להעלות קוד ל- STM32F103C8. כל שעליך לעשות הוא לחבר אותו למחשב דרך יציאת USB של STM32 ולהתחיל לתכנת עם ARDUINO IDE. בקר בקישור זה למידע נוסף על תכנות ה- STM32 ב- Arduino IDE. התוכנית המלאה להדרכת STM32 DAC זו ניתנת בסוף.
ראשית כלול ספרייה עבור I2C ו- LCD באמצעות ספריית wire.h, SoftWire.h ו- liquidcrystal.h. למידע נוסף על I2C במיקרו-בקר STM32 כאן.
#לִכלוֹל
לאחר מכן הגדר אתחל את סיכות ה- LCD בהתאם לסיכות ה- LCD המחוברות ל- STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
לאחר מכן הגדירו את כתובת I2C של MCP4725 DAC IC. כתובת I2C המוגדרת כברירת מחדל של MCP4725 DAC היא 0x60
#define MCP4725 0x60
בהגדרת הריק ()
ראשית התחל את תקשורת I2C בסיכות PB7 (SDA) ו- PB6 (SCL) של STM32F103C8.
Wire.begin (); // מתחיל תקשורת I2C
לאחר מכן הגדר את תצוגת ה- LCD במצב 16x2 והציג הודעת קבלת פנים.
lcd.begin (16,2); lcd.print ("מעגל מעגל"); עיכוב (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC עם MCP4725"); עיכוב (2000); lcd.clear ();
בלולאה הריקנית ()
1. ראשית במאגר שים את ערך בת הפקד (0b01000000).
(010 סטים MCP4725 במצב כתיבה) חיץ = 0b01000000;
2. ההצהרה הבאה קוראת את הערך האנלוגי מסיכה PA0 וממירה אותו לערך דיגיטלי שנע בין 0 ל4096 מכיוון ש- ADC הוא ברזולוציה של 12 סיביות ומאוחסן במשתנה adc .
adc = analogRead (PA0);
3. הצהרה הבאה זו היא נוסחה המשמשת לחישוב המתח מערך הקלט ADC (0 עד 4096) עם מתח הייחוס 3.3V.
צף ipvolt = (3.3 / 4096.0) * adc;
4. שים את ערכי הסיביות המשמעותיים ביותר במאגר על ידי העברת 4 סיביות ימינה במשתנה ADC, וערכי הסיביות המשמעותיים ביותר במאגר על ידי העברת 4 סיביות לשמאל במשתנה adc .
חיץ = adc >> 4; חיץ = adc << 4;
5. ההצהרה הבאה קוראת ערך אנלוגי מסיכת ADC PA1 של STM32 שהוא פלט DAC (סיכה OUTPUT של MCP4725 DAC IC). ניתן לחבר סיכה זו גם למולטימטר כדי לבדוק את מתח המוצא.
לא חתום אנלוגי קריאה = analogRead (PA1);
6. יתר על כן ערך המתח מהמשתנה אנלוגי מחושב באמצעות הנוסחה עם המשפט הבא.
צף opvolt = (3.3 / 4096.0) * אנלוגי לקרוא;
7. באותה לולאה בטלה () יש כמה משפטים אחרים שמוסברים להלן
מתחיל את השידור עם MCP4725:
Wire.beginTransmission (MCP4725);
שולח את בקרת הבקרה אל I2C
Wire.write (חיץ);
שולח את ה- MSB ל- I2C
Wire.write (חיץ);
שולח את ה- LSB ל- I2C
Wire.write (חיץ);
מסיים את השידור
Wire.endTransmission ();
כעת הציג את התוצאות בתצוגת LCD 16x2 באמצעות lcd.print ()
lcd.setCursor (0,0); lcd.print ("A IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (אנלוגי); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); עיכוב (500); lcd.clear ();
בדיקת ה- DAC עם STM32
כאשר אנו משתנים את ערך ה- ADC והמתח הקלט על ידי סיבוב הפוטנציומטר, גם ערך DAC והמתח המוצא משתנה. כאן ערכי הקלט מוצגים בשורה הראשונה וערכי הפלט בשורה השנייה בתצוגת LCD. מולטימטר מחובר גם לסיכת הפלט MCP4725 כדי לאמת את המתח האנלוגי.
הקוד השלם עם סרטון הדגמה מופיע להלן.