Korzystanie z potencjometru cyfrowego MCP41xx z Arduino

Wypróbuj Nasz Instrument Do Eliminowania Problemów





W tym projekcie zamierzamy połączyć potencjometr cyfrowy z arduino. W tej demonstracji używany jest potencjometr MCP41010, ale można użyć dowolnego potencjometru cyfrowego serii MC41 **.

Ankit Negi



WPROWADZENIE DO MC41010

Potencjometry cyfrowe są jak każdy potencjometr analogowy z trzema zaciskami z tylko jedną różnicą. O ile w analogowej trzeba ręcznie zmieniać położenie wycieraczki, o tyle w przypadku cyfrowego potencjometru położenie wycieraczki ustawia się zgodnie z sygnałem podawanym do potencjometru za pomocą dowolnego mikrokontrolera lub mikroprocesora.

FIGA. Układ pinów MC41010 IC

FIGA. Układ pinów MC41010 IC



MC41010 to 8-pinowy układ scalony z podwójną linią. Podobnie jak każdy potencjometr analogowy, ten układ scalony jest dostępny w wersjach 5k, 10k, 50k i 100k. W obwodzie tym zastosowano potencjometr 10k
MC4131 ma następujące 8 zacisków:

Nr pinu Nazwa pinu Mały opis

1 CS Ten pin służy do wyboru urządzenia podrzędnego lub urządzenia peryferyjnego podłączonego do arduino. Jeśli to jest
Niski, to wybierane jest MC41010, a jeśli jest wysoki, wyłącza się MC41010.

2 SCLK Shared / Serial Clock, arduino daje zegar do inicjalizacji transferu danych z
Arduino do IC i odwrotnie.

3 SDI / SDO Szeregowe dane są przesyłane między arduino i IC przez ten pin
4 VSS Ground terminal arduino jest podłączony do tego pinu układu scalonego.

5 PA0 To jest jeden zacisk potencjometru.

6 PW0 Ten zacisk jest zaciskiem wycieraczki potencjometru (do zmiany rezystancji)
7 PB0 To jest kolejny zacisk potencjometru.

8 VCC Zasilanie IC jest podawane przez ten pin.

Ten układ scalony zawiera tylko jeden potencjometr. Niektóre układy scalone mają co najwyżej dwa wbudowane potencjometry. To
Wartość rezystancji między wycieraczką a dowolnym innym zaciskiem jest zmieniana w 256 krokach, od 0 do 255. Ponieważ używamy rezystora 10k, wartość rezystora zmienia się w krokach:
10k / 256 = 39 omów na krok od 0 do 255

SKŁADNIKI

Potrzebujemy następujących komponentów do tego projektu.

1. ARDUINO
2. MC41010 IC
3. REZYSTOR 220 OMÓW
4. LED
5. PRZEWODY ŁĄCZĄCE

Wykonaj połączenia jak pokazano na rys.

1. Podłącz pin cs do cyfrowego pinu 10.
2. Podłącz pin SCK do cyfrowego pinu 13.
3. Podłącz pin SDI / SDO do cyfrowego pinu 11.
4. VSS do uziemienia pin arduino
5. PA0 do 5v pin arduino
6. PB0 do masy arduino
7. PWO do analogowego pinu A0 arduino.
8. VCC do 5 v arduino.

KOD PROGRAMU 1

Ten kod drukuje zmianę napięcia na zacisku wycieraczki i masie na monitorze szeregowym 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)

KOD WYJAŚNIAJĄCY 1:

Aby używać potencjometru cyfrowego z arduino, musisz najpierw dołączyć bibliotekę SPI, która jest dostarczana w samym arduino IDE. Po prostu zadzwoń do biblioteki za pomocą tego polecenia:
#zawierać

W konfiguracji pustej piny są przypisane jako wyjście lub wejście. Podawane są również polecenia rozpoczęcia SPI i komunikacji szeregowej między arduino i ic, które są:

#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)
}

W pętli pustej pętla for służy do zmiany rezystancji potencjometru cyfrowego w sumie 256 kroków. Najpierw od 0 do 255, a następnie ponownie z powrotem do 0 z 10 milisekundowym opóźnieniem między każdym krokiem:

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

Funkcja digitalPotWrite (i) zapisuje tę wartość w celu zmiany rezystancji pod określonym adresem układu scalonego.

Opór między wycieraczką a końcówką końcową można obliczyć za pomocą następujących wzorów:

R1 = 10k * (256 poziomów) / 256 + Rw
I
R2 = 10k * poziom / 256 + Rw

Tutaj R1 = opór między wycieraczką a jednym zaciskiem
R2 = rezystancja między wycieraczką a innym zaciskiem
Poziom = krok w określonej chwili (zmienna „I” używana w pętli for)
Rw = rezystancja zacisku wycieraczki (można znaleźć w arkuszu danych układu scalonego)
Używając funkcji digitalPotWrite (), układ potencjometru cyfrowego jest wybierany poprzez przypisanie NISKIE napięcie do pinu CS. Teraz, gdy jest wybrany ic, należy wywołać adres, na którym zostaną zapisane dane. W ostatniej części kodu:

SPI.transfer (B00010001)

Wywoływany jest adres, który to B00010001, aby wybrać zacisk wycieraczki układu scalonego, na którym zostaną zapisane dane. A zatem dla wartości pętli, tj., I jest napisane, aby zmienić opór.

OBWÓD PRACY:

Dopóki wartość i zmienia się na wejściu do pinu A0 arduino również zmienia się między 0 a 1023. Dzieje się tak, ponieważ zacisk wycieraczki jest bezpośrednio podłączony do pinu A0, a drugi zacisk potencjometru jest podłączony odpowiednio do 5 woltów i masy. Teraz, gdy zmienia się rezystancja, zmienia się napięcie na nim, które jest bezpośrednio pobierane przez arduino jako wejście, a tym samym otrzymujemy wartość napięcia na monitorze szeregowym dla określonej wartości rezystancji.

SYMULACJA 1:

Oto kilka zdjęć symulacyjnych dla tego obwodu przy różnych wartościach i:

Teraz wystarczy podłączyć szeregowo diodę LED z rezystorem 220 omów do zacisku wycieraczki układu scalonego, jak pokazano na rysunku.

KOD 2:

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

KOD WYJAŚNIAJĄCY 2:

Ten kod jest podobny do kodu 1 z tą różnicą, że nie ma w nim poleceń szeregowych. Zatem żadne wartości nie będą drukowane na monitorze szeregowym.

WYJAŚNIENIE ROBOCZE

Ponieważ dioda jest połączona między zaciskiem wycieraczki a masą, gdy zmienia się rezystancja, zmienia się napięcie na diodzie. A zatem wraz ze wzrostem rezystancji, po której podłączona jest dioda LED, od 0 omów do maksimum, rośnie też jasność diody. Który ponownie powoli zanika z powodu spadku oporu z maksimum do 0v.

Symulacja 2

Symulacja 3




Poprzedni: Jak sterować serwomotorem za pomocą joysticka Dalej: Zrób ten zaawansowany cyfrowy amperomierz za pomocą Arduino