- חומרים נדרשים
- ADC ב- STM8S103F3P6
- תרשים מעגל לקריאת ערכי ADC ב- STM8S והצגה על LCD
- ספריית ADC עבור STM8S103F3P6
- תוכנית STM8S לקריאת מתח אנלוגי ותצוגה על גבי LCD
- קריאת מתח אנלוגי משני פוטנציומטרים באמצעות STM8S
אם אתה קורא קבוע שעוקב אחר הדרכות המיקרו-בקר STM8S שלנו, היית יודע שבמדריך האחרון שלנו למדנו כיצד לממשק LCD 16x2 עם STM8s. כעת, המשך איתו במדריך זה, נלמד כיצד להשתמש בתכונת ADC במיקרו-בקר STM8S103F3P6 שלנו. ADC הוא ציוד היקפי שימושי מאוד על מיקרו-בקר שמשמש לעתים קרובות על ידי מתכנתים משובצים למדידת יחידות שנמצאות בשינוי מתמיד כמו מתח משתנה, זרם, טמפרטורה, לחות וכו '.
כידוע "אנו חיים בעולם אנלוגי עם מכשירים דיגיטליים", כלומר כל מה שסביבנו כמו מהירות רוח, עוצמת אור, טמפרטורה וכל מה שאנחנו מתמודדים איתו כמו מהירות, מהירות, לחץ וכו 'הם אנלוגיים באופיים. אך המיקרו-בקרים והמיקרו-מעבדים שלנו הם מכשירים דיגיטליים והם לא יוכלו למדוד את הפרמטרים הללו ללא ציוד היקפי חשוב בשם Analog to Digital Converters (ADC). אז במאמר זה, בואו ללמוד כיצד להשתמש ב- ADC במיקרו-בקר STM8S עם קומפילר COMIC C.
חומרים נדרשים
במאמר זה נקרא שני ערכי מתח אנלוגיים משני פוטנציומטרים ונציג את ערך ה- ADC שלו על גבי צג LCD בגודל 16x2. לשם כך נצטרך את הרכיבים הבאים.
- לוח פיתוח STM8S103F3P6
- מתכנת ST-Link V2
- LCD בגודל 16x2
- פוטנציומטרים
- חוטי חיבור
- נגד 1k
ADC ב- STM8S103F3P6
ישנם סוגים רבים של ADC ולכל מיקרו-בקר יש מפרט משלו. ב- STM8S103F3P6 יש לנו ADC עם רזולוציה של 5 ערוצים ו -10 סיביות; ברזולוציה של 10 סיביות, נוכל למדוד את הערך הדיגיטלי בין 0 ל -1024 ו- ADC של 5 ערוצים מציין שיש לנו 5 פינים על המיקרו-בקר שיכולים לתמוך ב- ADC, 5 פינים אלה מודגשים בתמונה למטה.
כפי שאתה יכול לראות, כל חמשת הסיכות הללו (AIN2, AIN3, AIN4, AIN5 ו- AIN6) מרובות עם ציוד היקפי אחר, כלומר מלבד רק כסיכת ADC, ניתן להשתמש בפינים אלה גם לביצוע תקשורת אחרת כמו למשל, הסיכה 2 ו- 3 (AIN5 ו- AIN 6) לא יכולות לשמש רק עבור ADC אלא יכולות לשמש גם לתקשורת טורית ולפונקציות GPIO. שים לב שלא ניתן יהיה להשתמש באותו סיכה לכל שלוש המטרות, כך שאם אנו משתמשים בשני הפינים הללו עבור ADC, אז לא נוכל לבצע תקשורת טורית. מאפיינים חשובים אחרים של ADC עבור STM8S103P36 ניתן למצוא בטבלה שלהלן הלקוחה מגליון הנתונים.
בטבלה שלעיל, Vdd מייצג מתח הפעלה ו- Vss מייצג את הקרקע. אז במקרה שלנו על לוח הפיתוח שלנו, יש לנו את המיקרו-בקר הפועל על 3.3 וולט, אתה יכול לבדוק את תרשים המעגלים של לוח הפיתוח מההתחלה עם הדרכה STM8S. עם 3.3 וולט כמתח הפעלה, ניתן לכוון את תדר שעון ה- ADC שלנו בין 1 ל -4 מגה הרץ וטווח מתח ההמרה שלנו הוא בין 0 וולט ל -3.3 וולט. המשמעות היא ש- ADC של 10 סיביות יקרא 0 כאשר 0V (Vss) יסופק ויקרא מקסימום 1024 כאשר 3.3V (Vdd) יסופק. אנו יכולים לשנות את זה 0-5V בקלות על ידי שינוי מתח ההפעלה של ה- MCU במידת הצורך.
תרשים מעגל לקריאת ערכי ADC ב- STM8S והצגה על LCD
דיאגרמת המעגל המלאה בה נעשה שימוש בפרויקט זה מובאת להלן, והיא דומה מאוד להדרכה LCD STM8S עליה דנו קודם.
כפי שאתה יכול לראות, הרכיבים הנוספים היחידים מלבד ה- LCD הם שני פוטנציומטרים POT_1 ו- POT_2 . סירים אלה מחוברים ליציאות PC4 ו- PD6, שהן סיכות ANI2 ו- ANI6 כפי שנדון בתמונת pinout קודם.
הפוטנציומטרים מחוברים בצורה כזו שכאשר אנו משתנים אותה נקבל 0-5 וולט על הפינים האנלוגיים שלנו. אנו נתכנת את הבקר שלנו לקרוא את המתח האנלוגי הזה בערך דיגיטלי (0 עד 1024) ולהציג אותו על גבי מסך ה- LCD. אז גם נחשב את ערך המתח המקביל ונציג אותו על גבי ה- LCD, זכור שהבקר שלנו מופעל על ידי 3.3 וולט, כך שגם אם נספק 5 וולט לסיכה ADC, הוא יוכל לקרוא רק מ 0 וולט ל -3.3 וולט..
לאחר סיום החיבורים, החומרה שלי נראית כך כמוצג להלן. אתה יכול לראות את שני הפוטנציומטרים מימין ואת מתכנת ST-link משמאל.
ספריית ADC עבור STM8S103F3P6
כדי לתכנת פונקציות ADC ב- STM8S, נשתמש במהדר Cosmic C יחד עם ספריות SPL. אך כדי להקל על התהליכים, הכנתי קובץ כותרת נוסף שניתן למצוא ב- GitHub עם הקישור למטה.
ספריית ADC עבור STM8S103F3P6
אם אתה יודע מה אתה עושה, אתה יכול ליצור קובץ כותרת באמצעות הקוד שלעיל ולהוסיף אותו לספריית "כלול קבצים" בדף הפרויקט שלך. אחר כך עקוב אחר ההתחלה עם מדריך STM8S כדי לדעת כיצד להגדיר את סביבת התכנות והמהדר שלך. לאחר ההתקנה שלך מוכנה, IDE שלך צריך לכלול את קבצי הכותרת הבאים, לפחות אלה המוקפים באדום.
קובץ הכותרת שלעיל מורכב מפונקציה הנקראת ADC_Read () . ניתן לקרוא לפונקציה זו בתוכנית הראשית שלך כדי לקבל את ערך ה- ADC בכל סיכה. לדוגמה, ADC_Read (AN2) יחזיר את ערך ADC על סיכה AN2 כתוצאה מכך. הפונקציה מוצגת למטה.
לא חתום int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {int result int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ENABLE); ADC1_StartConversion (); בעוד (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); תוצאה = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
כפי שאתה רואה, אנו יכולים להעביר שמונה פרמטרים לפונקציה זו וזה מגדיר כיצד מוגדרת ה- ADC. בקוד הספרייה שלנו לעיל, הגדרנו את מצב ההמרה לרציף ואז נעביר את מספר הערוץ לפרמטר. ואז עלינו להגדיר את תדר המעבד של הבקר שלנו, כברירת מחדל (אם לא חיברת גביש חיצוני), ה- STM8S שלך יעבוד עם מתנד פנימי של 16 מגה-הרץ. אז הזכרנו את " ADC1_PRESSEL_FCPU_D18 " כערך לפני הסקלר . בתוך פונקציה זו אנו משתמשים בשיטות אחרות המוגדרות על ידי קובץ הכותרת SPL stm8s_adc1.h . אנו מתחילים על ידי דה-אתחול של סיכות ADC ואז ADC1_Init () כדי לאתחל את היקפי ADC. ההגדרה של פונקציה זו ממדריך המשתמש של SPL מוצגת להלן.
לאחר מכן, הגדרנו את הדק החיצוני באמצעות טיימר ונשבית את הדק החיצוני מכיוון שלא נשתמש בו כאן. ואז יש לנו את היישור שמוגדר ימינה ושני הפרמטרים האחרונים משמשים להגדרת ההדק של שמיט, אך אנו נשבית אותו לצורך הדרכה זו. לכן, אם לומר את זה בקצרה, אנו נעבור את ה- ADC שלנו במצב המרה רציף על סיכת ה- ADC הנדרשת כאשר ההדק החיצוני והדק Schmitt מושבת. תוכל לבדוק את גליון הנתונים אם אתה זקוק למידע נוסף על אופן השימוש בהדק החיצוני או באפשרות ההדק Schmitt, לא נדון בכך במדריך זה.
תוכנית STM8S לקריאת מתח אנלוגי ותצוגה על גבי LCD
הקוד השלם המשמש בקובץ main.c נמצא בתחתית דף זה. לאחר הוספת קבצי הכותרת הנדרשים וקבצי המקור, אתה אמור להיות מסוגל לקמפל ישירות את הקובץ הראשי. הסבר הקוד בקובץ הראשי הוא כדלקמן. לא אסביר על תוכנית STM8S LCD מכיוון שכבר דנו בכך במדריך הקודם.
מטרת הקוד תהיה לקרוא ערכי ADC משני פינים ולהמיר אותם לערך מתח. אנו נציג גם את ערך ה- ADC וגם את ערך המתח על גבי ה- LCD. אז השתמשתי בפונקציה בשם LCD_Print Var שלוקחת משתנה בפורמט שלם וממירה אותו לדמות כדי להציג אותו על גבי ה- LCD. השתמשנו באופרטורים הפשוטים (%) ומחלקים (/) כדי לקבל כל ספרה מהמשתנה ולהכניס משתנים כמו d1, d2, d3 ו- d4 כמוצג להלן. אז נוכל להשתמש בפונקציה LCD_Print_Char כדי להציג את התווים הללו על גבי ה- LCD.
בטל LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
הבא תחת הפונקציה העיקרית, יש לנו ארבעה משתנים שהוכרזו. שניים מהם משמשים לשמירת ערך ADC (0 עד 1024) והשניים האחרים משמשים לקבלת ערך המתח בפועל.
לא חתום int ADC_value_1 = 0; לא חתום int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
בשלב הבא עלינו להכין את פינים GPIO ואת תצורת השעון לקריאת המתח האנלוגי. כאן נקרא את המתח האנלוגי מפינים AIN2 ו- AIN6 שהם הפינים PC4 ו- PD6 בהתאמה. עלינו להגדיר את הסיכה במצב צף כפי שמוצג להלן. אנו גם נאפשר את היקפי השעון עבור ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // אפשר שעון היקפי עבור ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
עכשיו שהסיכות מוכנות, עלינו להיכנס לולאה האינסופית כדי לקרוא את המתח האנלוגי. מכיוון שיש לנו את קובץ הכותרת שלנו, אנו יכולים לקרוא בקלות את המתח האנלוגי מהסיכות AIN2 ו- AIN 6 באמצעות השורות הבאות.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
השלב הבא הוא להמיר קריאת ADC זו (0 עד 1023) למתח אנלוגי. בדרך זו אנו יכולים להציג את ערך המתח המדויק שניתן לסיכה AIN2 ו- AIN6. את הנוסחאות לחישוב המתח האנלוגי ניתן לתת על ידי-
מתח אנלוגי = קריאת ADC * (3300/1023)
במקרה שלנו על בקרי STM8S103F3, יש לנו ADC עם רזולוציית 10 סיביות, אז השתמשנו ב- 1023 (2 ^ 10) . כמו כן, על הפיתוח שלנו הוא מעביר את הבקר עם 3.3V שהוא 3300, לכן חילקנו 3300 על ידי 1023 בנוסחאות הנ"ל. בערך 3300/1023 ייתן לנו 3.226, אז בתוכנית שלנו, יש לנו את השורות הבאות כדי למדוד את מתח ה- ADC בפועל באמצעות מתח ה- ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) להמיר ערך ADC 1 ל- 0 ל- 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // להמיר ערך ADC 1 ל- 0 ל- 3300mV
החלק הנותר של הקוד משמש רק להצגת ארבעת הערכים הללו על גבי מסך ה- LCD. יש לנו גם עיכוב של 500ms כך שה- LCD יתעדכן לכל 500mS. אתה יכול להפחית זאת עוד אם אתה זקוק לעדכונים מהירים יותר.
קריאת מתח אנלוגי משני פוטנציומטרים באמצעות STM8S
הידר את הקוד והעלה אותו ללוח הפיתוח שלך. אם נתקלת בשגיאת קומפילציה, ודא שהוספת את כל קבצי הכותרת וקבצי המקור כפי שפורט קודם. לאחר העלאת הקוד, אתה אמור לראות הודעת קבלת פנים קטנה שאומרת "ADC ב- STM8S" ואז אתה אמור לראות את המסך שלמטה.
הערך D1 ו- D2 מציינים את ערך ה- ADC מהסיכה Ain2 ו- AIN6 בהתאמה. בצד ימין מוצגים גם ערכי המתח המקבילים. ערך זה צריך להיות שווה למתח המופיע על סיכה AIN2 ו- AIN6 בהתאמה. אנחנו יכולים לבדוק את אותו הדבר באמצעות מולטימטר, אנו יכולים גם לשנות את הפוטנציומטרים כדי לבדוק אם גם ערך המתח משתנה בהתאם.
עבודה מלאה ניתן למצוא גם בסרטון למטה. מקווה שנהנית מההדרכה ולמדת משהו שימושי, אם יש לך שאלות, השאיר אותן בסעיף ההערות למטה. אתה יכול גם להשתמש בפורומים שלנו כדי להתחיל דיון או לפרסם שאלות טכניות אחרות.