poniedziałek, 2 listopada 2015

[17] Arduino - SPI, cyfrowy potencjometr MCP4231

Tym razem przedstawię sposób komunikacji poprzez szeregowy interfejs SPI. W przykładzie wykorzystam cyfrowy potencjometr MCP4231.

Wstęp


SPI (ang. Serial Peripheral Interfejs) jest szeregowym interfejsem urządzeń peryferyjnych.

Komunikacja odbywa się z wykorzystaniem trzech linii:

SCLK (ang. Serial Clock) - sygnał zegarowy. Odpowiedzialny za taktowanie układu.
MISO (ang. Master Input Slave Output) - Przesyła dane z układu peryferyjnego.
MOSI (ang. Master Output Slave Input) - Wysyła dane do układu peryferyjnego.


Dodatkowo stosowana jest linia SS (ang. Slave Select). Pozwala ona na aktywację wybranego układu peryferyjnego lub do adresacji układów. Kolejne urządzenia slave zostają podłączone na te same piny SCLK, MISO, MOSI natomiast pin SS musi zostać wybrany dodatkowo dla każdego układu.

Opis układu


MCP4231 jest to potencjometr cyfrowy wyprodukowany przez firmę Microchip. Komunikuje się on z mikrokonrolerem poprzez interfejs SPI. 


Rys. 1.1. Cyfrowy potencjometr

Opis wyprowadzeń:
  • P0B, P0W, P0A - są to piny wyprowadzeń pierwszego potencjometru. Analogiczenie P1B, P1W oraz P1A, są to wyprowadzenia drugiego potencjometru.
  • VDD jest to zasilanie układu.
  • VSS masa GND
  • CS jest to pin SS SPI. Aktywacja tego pinu polega na podaniu stanu niskiego na jego wejście czyli 0V.
  • SDO - czyli MISO
  • SDI - MOSI
  • SCK - sygnał zegarowy SCLK
  • SHDN - wyłączenie układu. Pin podłączony do GND.
  • WP - (ang. write protect) ochrona zapisu danych. Ten pin w przypadku jego niewykorzystania może zostać odłączony.
Wyjście sygnału z potencjometru podłączyłem do diody LED. Katoda diody została podłączona do masy całego układu. 

Program


W pierwszej kolejności należy się zorientować jak wyglądają komendy wysyłane do potencjometru. Głównie wykorzystuje się dwa rejestry. Pierwszy informujący o tym, którym potencjometrem w układzie będziemy sterować, drugi natomiast informuje jaka wartość zostanie ustawiona.

Rys. 1.2. Rejestry cyfrowego potencjometru

Adres potencjometru 0 jest umieszczony w pamięci pod adresem 0, natomiast układ 1 pod adresem 1. W celu wybrania odpowiedniego potencjometru należy wysłać do układu komendę 00000000 dla układu 0, lub 00010000 dla pierwszego. Po tej komendzie należy podać wartość rezystancji jaka będzie ustawiona (będzie ona z zakresu od 0 do 128).

#include <SPI.h>
 
const int Slave1 = 10;
 
//Wpisanie komendy
const byte Register0 = B00000000;
const byte Register1 = B00010000;
 
void WlaczDiode(int, int, int);
 
void setup() {
 
  pinMode(Slave1, OUTPUT);
 
  //Inicjalizacja SPI
  SPI.begin();
}
 
void loop() {
  for( int i=0; i<=128; i++)
  {
    WlaczDiode(Slave1, Register0, i);
    WlaczDiode(Slave1, Register1, i); 
  }
  delay(300);
 
  for( int i=128; i<= 128; i++)
  {
    WlaczDiode(Slave1, Register0, i);
    WlaczDiode(Slave1, Register1, i);
  }
}
 
void WlaczDiode(int Slave, int regis, int level){
  //Ustawienie pinu SS urządzenia w stan niski, czyli jego wybranie
  digitalWrite(Slave, LOW);
  //Wybranie rejestru do wpisania komendy
  SPI.transfer(regis);
  //Ustawienie wartosci na potencjometrze od 0 - 128
  SPI.transfer(level);
  //Ustawienie pinu SS w stan wysoki
  digitalWrite(Slave, HIGH);
}

Dużym minusem tego układu jest jego dokładność. Wartość rezystancji może się ona wahać, według dokumentacji producenta, nawet do +/- 20%.

Bibliografia


[1]                 Datasheet - MCP413X/415X/423X/425X