Използване на цифров потенциометър MCP41xx с Arduino

Използване на цифров потенциометър MCP41xx с Arduino

В този проект ще свържем цифров потенциометър с arduino. В този демонстрационен потенциометър се използва MCP41010, но можете да използвате всеки цифров потенциометър от серия MC41 **.



От Анкит Неги

ВЪВЕДЕНИЕ В MC41010

Цифровите потенциометри са точно като всеки аналогов потенциометър с три терминала само с една разлика. Докато при аналоговия трябва да промените ръчно позицията на чистачките, в случай на цифров потенциометър позицията на чистачката се настройва според сигнала, подаван към потенциометъра с помощта на който и да е микроконтролер или микропроцесор.





Фиг. MC41010 IC pinout

Фиг. MC41010 IC pinout

MC41010 е 8-пинов двулинеен IC пакет. Подобно на всеки аналогов потенциометър, този IC се предлага в 5k, 10k, 50k и 100k. В тази схема се използва 10k потенциометър
MC4131 има следните 8 терминала:



ПИН № Име на ПИН Малко описание

1 CS Този щифт се използва за избор на подчинен или периферен апарат, свързан към arduino. Ако това е така
Избрано е ниско, тогава MC41010 и ако това е високо, MC41010 е отменено.

2 SCLK споделен / сериен часовник, arduino дава часовник за инициализация на прехвърляне на данни от
Arduino към IC и обратно.

3 SDI / SDO Серийните данни се прехвърлят между arduino и IC чрез този щифт
4 VSS Ground терминал на arduino е свързан към този щифт на IC.

5 PA0 Това е един извод на потенциометъра.

6 PW0 Този терминал е клема на чистачките на потенциометъра (за промяна на съпротивлението)
7 PB0 Това е друг извод на потенциометъра.

8 VCC захранване към IC се дава чрез този щифт.

Този IC съдържа само един потенциометър. Някои интегрални схеми имат вградени най-много два потенциометъра. Това
Стойността на съпротивлението между чистачките и всеки друг терминал се променя на 256 стъпки, от 0 до 255. Тъй като използваме 10k резистор, стойността на резистора се променя на стъпки от:
10k / 256 = 39 ома на стъпка между 0 и 255

КОМПОНЕНТИ

За този проект са ни необходими следните компоненти.

1. ARDUINO
2. MC41010 IC
3. 220 ОМ РЕЗИСТОР
4. LED
5. СВЪРЗВАНЕ НА ЖИЛКИ

Направете връзки, както е показано на фиг.

1. Свържете cs pin към цифров pin ​​10.
2. Свържете SCK щифта към цифров щифт 13.
3. Свържете SDI / SDO щифт към цифров щифт 11.
4. VSS към заземен щифт на arduino
5. PA0 до 5v щифт на arduino
6. PB0 към земя на arduino
7. PWO към аналогов щифт A0 на arduino.
8. VCC до 5 v от arduino.

ПРОГРАМЕН КОД 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:

За да използвате цифров потенциометър с arduino, първо трябва да включите SPI библиотека, която се предоставя в самата IDE на arduino. Просто се обадете на библиотеката с тази команда:
#include

При настройка на празнота щифтовете се присвояват като изход или вход. И команди за започване на SPI и се дава серийна комуникация между arduino и 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)
}

В цикъл void, цикълът for се използва за промяна на съпротивлението на цифровия пот в общо 256 стъпки. Първо от 0 до 255 и след това отново обратно до 0 с 10 милисекунди закъснение между всяка стъпка:

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

Функцията digitalPotWrite (i) записва тази стойност за промяна на съпротивлението на определен адрес на ic.

Съпротивлението между чистачката и крайния терминал може да се изчисли, като се използват следните формули:

R1 = 10k * (256 нива) / 256 + Rw
И
R2 = 10k * ниво / 256 + Rw

Тук R1 = съпротивление между чистачката и един терминал
R2 = съпротивление между чистачките и други клеми
Ниво = стъпка в определен момент (променлива „I“, използвана за цикъл for)
Rw = съпротивление на терминала на чистачките (може да се намери в листа с данни на ic)
Използвайки функцията digitalPotWrite (), чипът за цифров потенциометър се избира чрез присвояване на НИСКО напрежение на CS пина. Сега, когато ic е избран, трябва да се извика адрес, на който ще се запишат данните. В последната част от кода:

SPI.transfer (B00010001)

Извиква се адрес, който е B00010001, за да се избере терминалът на чистачките на ic, на който ще се записват данни. И следователно за стойността на цикъла, т.е. i е написано за промяна на съпротивлението.

КРУГОВА РАБОТА:

Докато стойността на i продължава да променя входа към A0 пин на arduino, също продължава да се променя между 0 и 1023. Това се случва, защото терминалът на чистачките е директно свързан към щифт A0, а другият терминал на потенциометъра е свързан съответно към 5volt и земя. Сега, когато съпротивлението се променя, променя се и напрежението върху него, което директно се приема от arduino като вход и по този начин получаваме стойност на напрежението на серийния монитор за определена стойност на съпротивлението.

СИМУЛАЦИЯ 1:

Това са някои симулационни снимки за тази схема при различни стойности на i:

Сега просто свържете led последователно с 220ohm резистор към клемата на чистачките на IC, както е показано на фигурата.

КОД 2:

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

ОБЯСНИТЕЛЕН КОД 2:

Този код е подобен на код 1, с изключение на това, че в него няма серийни команди. Така че никакви стойности няма да бъдат отпечатвани на сериен монитор.

ОБЯСНЕНИЕ НА РАБОТАТА

Тъй като led е свързан между клемата на чистачките и земята, когато съпротивлението се променя, променя се и напрежението на led. И следователно, тъй като съпротивлението, през което е свързан светодиодът, се повишава от 0ohm до максимално, както и яркостта на светодиода. Които отново бавно избледняват поради намаляване на съпротивлението от максимум до 0v.

Симулация2

Симулация3




Предишна: Как да управляваме серво мотора с помощта на джойстик Напред: Направете този усъвършенстван цифров амперметър с помощта на Arduino