Цифровой потенциометр MCP41010, подключение к Arduino

MCP41ххх, в нашем случаи MCP41010 — Микросхема-потенциометр с цифровым управлением, изменение сопротивления происходит благодаря массиву из 256 резисторов. В серии есть потенциометры сопротивлением 10kΩ, 50kΩ и 100kΩ, MCP41010, MCP41050 и MCP41100 соответственно. Также существует сдвоенная микросхема MCP42010 с аналогичными параметрами.

Удобных модулей с такой микросхемой не существует, но MCP41010 можно найти в DIP корпусе или SO8 версию данной микросхемы впаять в переходник на DIP8, как в моем случаи.

Особенности работы:

Управление микросхемой происходит с помощью SPI интерфейса, распиновка микросхемы ниже.

  • 1 нога, CS, чипселект интерфейса SPI, подключается на любой свободный выход arduino, в примере подключен к 10.
  • 2 нога, SCK, тактовый вход интерфейса SPI, подключается к 13 выходу arduino UNO.
  • 3 нога, SI, MOSI вход интерфейса SPI, подключается к 11 входу arduino UNO.
  • 4 нога, Vss, масса.
  • 5, 6, 7 нога, PA0, PW0, PB0, выходы потенциометра.
  • 8 нога, Vdd, питание 2,7 — 5,5V.

У SPI интерфейса микросхемы отсутствует нога MISO, а значит невозможно прочитать состояние ползунка потенциометра, можно только установить значение записав байт в регистр микросхемы.


Подключение потенциометра к Arduino:

В данном случаи, для общения с микросхемой используется аппаратный SPI, а значит схема верна только для arduino UNO. На других версиях arduino плат (leonardo, mega) SPI находится на разъеме ICSP и искать выходы SCK и MOSI нужно там.

Выход ползунка потенциометра, PW0, подключен к аналоговому входу A0 arduino, а сам ползунок подключен по схеме делителя напряжения. В примере ниже, последовательно, в цикле, сдвигаем ползунок потенциометра от крайнего положения и отправляем в монитор порта значение напряжения на входе A0.

Код:

#include <SPI.h>                            // инклюдим библиотеку для аппаратного SPI

#define CS 10                               // нога чипслекет        

byte val = 0;
 
void setup() { 
  Serial.begin(115200);
  SPI.begin();    

  pinMode (CS, OUTPUT);   
}
 
void loop() {
 
    float voltage = (analogRead(A0) * 5.0)/ 1024.0;  // читаем напряжение на входе А0
    Serial.print("voltage = " );                // отправляем данные о напряжении в монитор порта      
    Serial.print(voltage);      
    Serial.print("  val = ");                   // значение которое пишем в потенциометр
    Serial.print(val, BIN);                     // бинарное
    Serial.print(" / ");
    Serial.println(val, DEC);                   // десятичное

    val++;                                      // прибавляем к переменной 1
    MCP4xxxxWrite(val);                         // пишем значение переменной в потенциометр

    delay(50);                                 // ждем до следующего раза
 
}
 
void MCP4xxxxWrite(byte val) {              // отправляет в потенциометр значение ползунка
    digitalWrite(CS, LOW);                    // включаем прием данных микросхемой
    SPI.transfer(0b00010001);                 // отправляем первый байт в регистр конфигурации
    SPI.transfer(val);                        // отправляем второй байт в "регистр ползунка"
    digitalWrite(CS,HIGH);                    // выключаем прием данных микросхемой
}

После загрузки примера в arduino.

В мониторе порта видим значение напряжения на входе A0 и значение которое было записано в потенциометр в двух форматах.


Купить:

Микросхему можно тут.


Видео: