Usando o Potenciômetro Digital MCP41xx com Arduino

Experimente Nosso Instrumento Para Eliminar Problemas





Neste projeto vamos fazer a interface de um potenciômetro digital com o arduino. Neste potenciômetro de demonstração MCP41010 é usado, mas você pode usar qualquer potenciômetro digital da série MC41 **.

Por Ankit Negi



INTRODUÇÃO AO MC41010

Os potenciômetros digitais são como qualquer potenciômetro analógico com três terminais com apenas uma diferença. Enquanto no analógico você deve alterar manualmente a posição do limpador, no caso do potenciômetro digital a posição do limpador é ajustada de acordo com o sinal dado ao potenciômetro usando qualquer microcontrolador ou microprocessador.

FIGO. Pinagem IC MC41010

FIGO. Pinagem IC MC41010



MC41010 é um pacote de IC duplo em linha de 8 pinos. Assim como qualquer potenciômetro analógico, este IC vem em 5k, 10k, 50k e 100k. Neste circuito, o potenciômetro de 10k é usado
MC4131 tem os seguintes 8 terminais:

Pin no. Pequena descrição do nome do pino

1 CS Este pino é usado para selecionar o escravo ou periférico conectado ao Arduino. Se isso é
Baixo então MC41010 é selecionado e se for alto então MC41010 é desmarcado.

2 SCLK Shared / Serial Clock, arduino dá o relógio para inicialização da transferência de dados de
Arduino para IC e vice-versa.

3 SDI / SDO Serial data são transferidos entre arduino e IC através deste pino
4 O terminal VSS Ground do Arduino está conectado a este pino do IC.

5 PA0 Este é um terminal do potenciômetro.

6 PW0 Este terminal é o terminal limpador do potenciômetro (para alterar a resistência)
7 PB0 Este é outro terminal do potenciômetro.

8 VCC Power to IC é fornecido por meio deste pino.

Este IC contém apenas um potenciômetro. Alguns IC têm no máximo dois potenciômetros embutidos. Esta
O valor da resistência entre o limpador e qualquer outro terminal é alterado em 256 etapas, de 0 a 255. Como estamos usando um resistor de 10k, o valor do resistor é alterado em etapas de:
10k / 256 = 39 ohms por etapa entre 0 e 255

COMPONENTES

Precisamos dos seguintes componentes para este projeto.

1. ARDUINO
2. MC41010 IC
3. RESISTOR DE 220 OHM
4. LED
5. CONEXÃO DE FIOS

Faça as conexões conforme mostrado na fig.

1. Conecte o pino cs ao pino digital 10.
2. Conecte o pino SCK ao pino digital 13.
3. Conecte o pino SDI / SDO ao pino digital 11.
4. VSS para pino de aterramento do Arduino
5. PA0 para pino de 5v do Arduino
6. PB0 para o solo do Arduino
7. PWO para pino analógico A0 do Arduino.
8. VCC para 5 v de arduino.

CÓDIGO DO PROGRAMA 1

Este código imprime a mudança de tensão no terminal do limpador e aterramento no Serial Monitor do 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)

EXPLICANDO O CÓDIGO 1:

Para usar o potenciômetro digital com o arduino, você precisa primeiro incluir a biblioteca SPI, que é fornecida no próprio IDE do arduino. Basta chamar a biblioteca com este comando:
#incluir

Na configuração vazia, os pinos são atribuídos como saída ou entrada. E os comandos para iniciar o SPI e a comunicação serial entre o arduino e o ic também são fornecidos:

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

No loop vazio, o loop for é usado para alterar a resistência do potenciômetro digital em um total de 256 etapas. Primeiro de 0 a 255 e, em seguida, novamente de volta a 0 com 10 milissegundos de atraso entre cada etapa:

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

A função digitalPotWrite (i) escreve este valor para alterar a resistência em um endereço particular de ic.

A resistência entre o limpador e o terminal final pode ser calculada usando estas fórmulas:

R1 = 10k * (nível 256) / 256 + Rw
E
R2 = nível 10k * / 256 + Rw

Aqui R1 = resistência entre limpador e um terminal
R2 = resistência entre limpador e outro terminal
Nível = passo em um determinado instante (variável “I” usada no loop for)
Rw = resistência do terminal do limpador (pode ser encontrada na folha de dados do ic)
Usando a função digitalPotWrite (), o chip do potenciômetro digital é selecionado atribuindo tensão BAIXA ao pino CS. Agora que o ic é selecionado, um endereço deve ser chamado no qual os dados serão gravados. Na última parte do código:

SPI.transfer (B00010001)

O endereço é chamado, que é B00010001, para selecionar o terminal do limpador do ic no qual os dados serão gravados. E, portanto, para o valor do loop, ou seja, é escrito para alterar a resistência.

FUNCIONAMENTO DO CIRCUITO:

Enquanto o valor de i continua mudando a entrada para o pino A0 do Arduino, também muda entre 0 e 1023. Isso acontece porque o terminal do limpador está conectado diretamente ao pino A0 e outro terminal do potenciômetro está conectado a 5 volts e terra respectivamente. Agora, quando a resistência muda, também muda a tensão através dela, que é diretamente tomada pelo Arduino como entrada e, assim, obtemos um valor de tensão no monitor serial para um determinado valor de resistência.

SIMULAÇÃO 1:

Estas são algumas imagens de simulação para este circuito em vários valores de i:

Agora basta conectar um led em série com resistor de 220ohm ao terminal do limpador do IC, conforme mostrado na figura.

CÓDIGO 2:

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

EXPLICANDO O CÓDIGO 2:

Este código é semelhante ao código 1, exceto que não há comandos seriais neste código. Portanto, nenhum valor será impresso no monitor serial.

EXPLICAÇÃO DE TRABALHO

Como o led é conectado entre o terminal do limpador e o aterramento conforme a resistência muda, o mesmo ocorre com a tensão no led. E, portanto, conforme a resistência através da qual o led é conectado aumenta de 0 ohm ao máximo, o brilho do led também aumenta. Que novamente desaparece lentamente devido à diminuição da resistência do máximo para 0v.

Simulação 2

Simulação 3




Anterior: Como controlar servo motor usando joystick Próximo: Faça este Amperímetro Digital Avançado usando Arduino