Ús del potenciòmetre digital MCP41xx amb Arduino

Proveu El Nostre Instrument Per Eliminar Problemes





En aquest projecte, farem una interfície d’un potenciòmetre digital amb arduino. En aquesta demostració s'utilitza el potenciòmetre MCP41010, però podeu utilitzar qualsevol potenciòmetre digital de la sèrie MC41 **.

A càrrec d’Ankit Negi



INTRODUCCIÓ A MC41010

Els potenciòmetres digitals són com qualsevol potenciòmetre analògic amb tres terminals amb una única diferència. Mentre que en un analògic heu de canviar manualment la posició del netejador, en cas de potenciòmetre digital, la posició del netejador es configura segons el senyal donat al potenciòmetre mitjançant qualsevol microcontrolador o microprocessador.

FIG. Pinout IC MC41010

FIG. Pinout IC MC41010



MC41010 és un IC de paquet dual de 8 pins. Igual que qualsevol potenciòmetre analògic, aquest CI ve en 5k, 10k, 50k i 100k. En aquest circuit s’utilitza un potenciòmetre de 10k
MC4131 té els següents 8 terminals:

Pin núm. Nom del pin Petit descripció

1 CS Aquest pin s'utilitza per seleccionar l'esclau o el perifèric connectat a arduino. Si és així
Baixa, se selecciona MC41010 i, si és alta, es desselecciona MC41010.

2 SCLK Shared / Serial Clock, arduino dóna rellotge per a la inicialització de la transferència de dades des de
Arduino a IC i viceversa.

3 Les dades de sèrie SDI / SDO es transfereixen entre arduino i IC mitjançant aquest pin
El terminal de terra VSS 4 de l'arduino està connectat a aquest pin d'IC.

5 PA0 Es tracta d'un terminal del potenciòmetre.

6 PW0 Aquest terminal és el terminal del netejador del potenciòmetre (per canviar la resistència)
7 PB0 Aquest és un altre terminal del potenciòmetre.

La potència de 8 VCC a IC es dóna a través d’aquest pin.

Aquest CI només conté un potenciòmetre. Alguns IC tenen com a màxim dos potenciòmetres incorporats. Això
El valor de la resistència entre l'eixugaparabrises i qualsevol altre terminal es canvia en 256 passos, de 0 a 255. Com que estem utilitzant una resistència de 10 k, el valor de la resistència es canvia en passos de:
10k / 256 = 39 ohms per pas entre 0 i 255

COMPONENTS

Necessitem els components següents per a aquest projecte.

1. ARDUINO
2. MC41010 IC
3. RESISTOR DE 220 OHM
4. LED
5. CONNEXIÓ DE CABLES

Feu connexions tal com es mostra a la fig.

1. Connecteu el pin CS al pin digital 10.
2. Connecteu el pin SCK al pin digital 13.
3. Connecteu el pin SDI / SDO al pin digital 11.
4. VSS al pin d'arduino
5. PA0 a 5v pin d'arduino
6. PB0 a terra d'arduino
7. PWO al pin analògic A0 d'arduino.
8. VCC a 5 v d'arduino.

CODI DEL PROGRAMA 1

Aquest codi imprimeix el canvi de voltatge a través del terminal de l'eixugaparabrises i de la terra al monitor sèrie d'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)

EXPLICACIÓ DEL CODI 1:

Per utilitzar el potenciòmetre digital amb arduino, primer heu d’incloure la biblioteca SPI que es proporciona al propi IDE d’arduino. Només cal que truqueu a la biblioteca amb aquesta ordre:
#incloure

En la configuració nul·la, els pins s’assignen com a sortida o entrada. I també es donen ordres per iniciar la comunicació SPI i sèrie entre arduino i ic, que són:

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

En bucle buit, el bucle for s'utilitza per canviar la resistència de l'olla digital en un total de 256 passos. Primer de 0 a 255 i després de nou a 0 amb un retard de 10 mil·lisegons entre cada pas:

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

La funció digitalPotWrite (i) escriu aquest valor per canviar la resistència en una adreça particular de ic.

La resistència entre l'eixugaparabrises i el terminal final es pot calcular mitjançant aquestes fórmules:

R1 = 10k * (256 nivells) / 256 + Rw
I
R2 = 10k * nivell / 256 + Rw

Aquí R1 = resistència entre l'eixugaparabrises i un terminal
R2 = resistència entre l'eixugaparabrises i un altre terminal
Nivell = pas en un instant concret (variable 'I' utilitzada per a bucle)
Rw = resistència del terminal del netejador (es pot trobar a la fitxa tècnica de la ic)
Mitjançant la funció digitalPotWrite () es selecciona el xip de potenciòmetre digital assignant BAIX voltatge al pin CS. Ara que es selecciona la ic, s'ha de trucar a una adreça en la qual s'escriuran les dades. A l'última porció de codi:

Transferència SPI (B00010001)

Es diu l'adreça que és B00010001 per seleccionar el terminal del netejador de l'ic en el qual s'escriuran les dades. I, per tant, per al valor del bucle, és a dir, i s’escriu per canviar la resistència.

FUNCIONAMENT DEL CIRCUIT:

Mentre el valor d’i continuï canviant l’entrada a pin A0 d’arduino, també canvia entre 0 i 1023. Això passa perquè el terminal del netejador està directament connectat al pin A0 i els altres terminals del potenciòmetre estan connectats a 5 volt i a terra respectivament. Ara, quan la resistència canvia, també ho fa la tensió que pren directament Arduino com a entrada i, per tant, obtenim un valor de tensió al monitor sèrie per obtenir un valor particular de resistència.

SIMULACIÓ 1:

Aquestes són algunes imatges de simulació d’aquest circuit amb diversos valors de i:

Ara només cal connectar un led en sèrie amb resistència de 220ohm al terminal del netejador d’IC com es mostra a la figura.

CODI 2:

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

EXPLICACIÓ DEL CODI 2:

Aquest codi és similar al codi 1, tret que no hi ha ordres en sèrie en aquest codi. Per tant, no s’imprimirà cap valor al monitor sèrie.

EXPLICACIÓ LABORAL

Com que el LED està connectat entre el terminal del netejador i la terra a mesura que canvia la resistència, també ho fa la tensió del LED. I, per tant, a mesura que la resistència a través de la qual es connecta el led puja de 0 ohm al màxim, també ho fa la brillantor del led. Que de nou s’esvaeixen lentament a causa de la disminució de la resistència del màxim a 0v.

Simulació2

Simulació3




Anterior: Com controlar el servomotor mitjançant el joystick Següent: Feu aquest amperímetre digital avançat amb Arduino