שימוש בפוטנציומטר דיגיטלי MCP41xx עם Arduino

נסה את הכלי שלנו לביטול בעיות





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

מאת אנקיט נגי



מבוא ל- MC41010

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

תאנה. MC41010 IC pinout

תאנה. MC41010 IC pinout



MC41010 הוא חבילת IC כפולה עם 8 פינים. בדיוק כמו כל פוטנציומטר אנלוגי IC זה מגיע ב- 5k, 10k, 50k ו- 100k. במעגל זה משתמשים בפוטנציומטר 10k
MC4131 כולל 8 מסופים הבאים:

סיכה לא. שם סיכה תיאור קטן

1 CS סיכה זו משמשת לבחירת העבד או ההיקפי המחובר לארדואינו. אם זה
נמוך אז MC41010 נבחר ואם זה גבוה אז MC41010 נבחר.

2 שעון משותף / סידורי SCLK, ארדואינו נותן שעון לאתחול העברת נתונים מ
ארדואינו ל- IC ולהיפך.

3 SDI / SDO נתונים סידוריים מועברים בין ארדואינו ל- IC באמצעות סיכה זו
4 מסוף קרקע VSS של ארדואינו מחובר לסיכה זו של IC.

5 PA0 זהו מסוף אחד של הפוטנציומטר.

6 PW0 מסוף זה הוא מסוף מגבים של הפוטנציומטר (לשינוי התנגדות)
7 PB0 זהו מסוף נוסף של הפוטנציומטר.

8 VCC כוח ל- IC ניתן באמצעות סיכה זו.

IC זה מכיל פוטנציומטר אחד בלבד. בחלק מה- IC יש לכל היותר שני פוטנציומטרים מובנים. זֶה
ערך ההתנגדות בין מגב וכל מסוף אחר משתנה ב 256 צעדים, מ 0 ל 255. מכיוון שאנו משתמשים בערך הנגד 10k של הנגד משתנה בשלבים של:
10k / 256 = 39 אוהם לכל שלב בין 0 ל 255

רכיבים

אנו זקוקים לרכיבים הבאים לפרויקט זה.

1. ארדו
2. MC41010 IC
3. נגן 220 אוהם
4. לד
5. חוטי חיבור

צור חיבורים כפי שמוצג באיור.

1. חבר סיכת cs לסיכה דיגיטלית 10.
2. חבר את סיכת SCK לסיכה דיגיטלית 13.
3. חבר את פין SDI / SDO לסיכה דיגיטלית 11.
4. VSS לסיכה טחונה של ארדואינו
5. סיכה של PA0 עד 5V של ארדואינו
6. PB0 לקרקע של ארדואינו
7. PWO לסיכה אנלוגית A0 של arduino.
8. VCC עד 5 וולט של ארדואינו.

קוד התוכנית 1

קוד זה מדפיס את שינוי המתח על פני מסוף המגבים והאדמה על צג סידורי של Arduino IDE.

#include
int CS = 10 // initialising variable CS pin as pin 10 of arduino
int x // initialising variable x
float Voltage // initialising variable voltage
int I // this is the variable which changes in steps and hence changes resistance accordingly.
void setup()
{
pinMode (CS , OUTPUT) // initialising 10 pin as output pin
pinMode (A0, INPUT) // initialising pin A0 as input pin
SPI.begin() // this begins Serial peripheral interfece
Serial.begin(9600) // this begins serial communications between arduino and ic.
}
void loop()
{
for (int i = 0 i <= 255 i++)// this run loops from 0 to 255 step with 10 ms delay between each step
{
digitalPotWrite(i) // this writes level i to ic which determines resistance of ic
delay(10)
x = analogRead(A0) // read analog values from pin A0
Voltage = (x * 5.0 )/ 1024.0// this converts the analog value to corresponding voltage level
Serial.print('Level i = ' ) // these serial commands print value of i or level and voltage across wiper
Serial.print(i) // and gnd on Serial monitor of arduino IDE
Serial.print(' Voltage = ')
Serial.println(Voltage,3)
}
delay(500)
for (int i = 255 i >= 0 i--) // this run loops from 255 to 0 step with 10 ms delay between each step
{
digitalPotWrite(i)
delay(10)
x = analogRead(A0)
Voltage = (x * 5.0 )/ 1024.0 // this converts the analog value to corresponding voltage level
Serial.print('Level i = ' ) // these serial commands print value of i or level and voltage across wiper
Serial.print(i) // and gnd on Serial monitor of arduino IDE
Serial.print(' Voltage = ')
Serial.println(Voltage,3)
}
}
int digitalPotWrite(int value) // this block is explained in coding section
{
digitalWrite(CS, LOW)
SPI.transfer(B00010001)
SPI.transfer(value)
digitalWrite(CS, HIGH)

הסבר על קוד 1:

כדי להשתמש בפוטנציומטר דיגיטלי עם ארדואינו עליך לכלול תחילה את ספריית SPI המסופקת ב- arduino IDE עצמה. פשוט התקשר לספרייה באמצעות פקודה זו:
#לִכלוֹל

בהתקנת החלל, סיכות מוקצות כפלט או כקלט. כמו כן ניתנות פקודות להתחלת SPI ותקשורת סדרתית בין ארדואינו ל- ic שהן:

#include
int CS = 10
int x
float Voltage
int i
void setup()
{
pinMode (CS , OUTPUT)
pinMode (A0, INPUT)
SPI.begin()// this begins Serial peripheral interfece
}
void loop()
{
for (int i = 0 i <= 255 i++)// this run loops from 0 to 255 step with 10 ms delay between each step
{
digitalPotWrite(i)// this writes level i to ic which determines resistance of ic
delay(10)
}
delay(500)
for (int i = 255 i >= 0 i--)// this run loops from 255 to 0 step with 10 ms delay between each step
{
digitalPotWrite(i)
delay(10)
}
}
int digitalPotWrite(int value)// this block is explained in coding section
{
digitalWrite(CS, LOW)
SPI.transfer(B00010001)
SPI.transfer(value)
digitalWrite(CS, HIGH)
}

בלולאה בטלה, עבור לולאה משמש לשינוי ההתנגדות של פוט דיגיטלי בסך 256 צעדים. תחילה מ 0 ל 255 ואז שוב חזרה ל 0 עם עיכוב של 10 אלפיות השנייה לכל שלב:

SPI.begin() and Serial.begin(9600)

פונקציית digitalPotWrite (i) כותבת ערך זה לשינוי התנגדות בכתובת מסוימת של ic.

ניתן לחשב את ההתנגדות בין המגב למסוף הקצה באמצעות הנוסחאות הבאות:

R1 = 10k * (256-level) / 256 + Rw
וגם
R2 = 10k * רמה / 256 + Rw

כאן R1 = התנגדות בין מגב למסוף אחד
R2 = התנגדות בין מגב למסוף אחר
רמה = שלב ברגע מסוים (משתנה 'אני' המשמש לולאה)
Rw = התנגדות מסוף המגבים (ניתן למצוא בגיליון הנתונים של ה- ic)
באמצעות פונקציית digitalPotWrite (), נבחר שבב הפוטנציומטר הדיגיטלי על ידי הקצאת מתח נמוך לסיכה CS. כעת כאשר נבחר ic, יש להתקשר לכתובת עליה ייכתבו הנתונים. בחלק האחרון של הקוד:

העברת SPI (B00010001)

נקראת כתובת שהיא B00010001 לבחירת מסוף המגבים של ה- ic שעליו ייכתבו הנתונים. ומכאן שערך הלולאה כלומר, אני כתוב כדי לשנות את ההתנגדות.

עבודה במעגל:

כל עוד הערך של i ממשיך לשנות את הקלט לסיכה A0 של הארדואינו גם ממשיך להשתנות בין 0 ל -1023. זה קורה מכיוון שמסוף המגבים מחובר ישירות לסיכה A0, ומסוף אחר של פוטנציומטר מחובר ל -5 וולט ולאדמה בהתאמה. כעת כאשר ההתנגדות משתנה כך גם מתח על פניו שנלקח ישירות על ידי ארדואינו כקלט וכך אנו מקבלים ערך מתח על צג סדרתי לערך מסוים של התנגדות.

הדמיה 1:

אלו כמה תמונות סימולציה למעגל זה בערכים שונים של i:

עכשיו רק חבר נורית בסדרה עם נגד 220ohm למסוף המגבים של IC כפי שמוצג באיור.

קוד 2:

for (int i = 0 i <= 255 i++) and for (int i = 255 i>= 0 i--)

הסבר על קוד 2:

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

הסבר עבודה

מכיוון שהד מחובר בין מסוף המגבים לקרקע כאשר ההתנגדות משתנה כך גם המתח על פני הוביל. ומכאן שכשההתנגדות שמעליה מחובר הוביל עולה מ- 0ohm למקסימום כך עולה גם בהירות ה- led. אשר שוב מתפוגגים באטיות בגלל ירידה בהתנגדות ממקסימום ל -0 וולט.

סימולציה 2

סימולציה 3




קודם: כיצד לשלוט במנוע סרוו באמצעות ג'ויסטיק הבא: הכינו מד זרם דיגיטלי מתקדם באמצעות Arduino