MCP42010 10K Dijital Potansiyometre

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
7,638
Araştırmalarım sonucunda 257 adım ile ayar yapabilen mcp42010 10k dual pot buldum.
İncelerken kafamı karıştıran bir durum oldu. Potun tek veri girişi var.
Acaba bu pota tek veri gönderdiğim de iki çıkıştan da aynı değerimi veriyor? Yoksa hangi çıkışı kullanacağını ben seçebiliyor muyum?

İki kanalın birini voltaj, diğerini akım için kullanmak istiyorum.
Tek girişten veri gönderip, voltaj değişkeninden gönderdiysem CH1'e, akim değişkeninden gönderdiysem CH2 ye aktar gibi bir seçeneğim var mı öğrenmek istiyorum. Ona göre entegreyi alacağım.

mcp42010_0.png


mcp42010_1.png


mcp42010_2.png
 

Ekler

  • 11195c.pdf
    866.3 KB · Görüntüleme: 15

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
7,638
Şöyle bir sample kod buldum. Bu koda göre iki kanalı istediğim gibi kullanabiliyorum. Üstelik giriş pini olan "SO" da kullanılmıyor sanırım.
Ama yine de emin olmak için sorum hala geçerli. Çünkü yurt dışından sipariş vereceğim. Vakit ve para kaybı yaşamak istemiyorum.

C:
/*************************************************************
 Dual Digital Pot(100K)
 <https://www.dfrobot.com/wiki/index.php/Dual_Digital_Pot_(100K)_SKU:_DFR
0520>
 *************************************************************
 This example generates two triangular waves to demonstrate
 the basic usage of dual digital pot.
 Created 2017-8-31
 By Henry Zhao <Henry.zhao@dfrobot.com>
 GNU Lesser Genral Public License.
 See <http://ww.gnu.org/licenses/> for details.
 All above must be included in any redistribution.
 ************************************************************/
/***********************Circuit Connections*******************
 Digital Pot | Arduino UNO R3 | Oscilloscope
 CS | D10 (SS) |
 SI | D11 (MOSI) |
 CLK | D13 (SCK) |
 VCC,PA0,PA1 | VCC |
 GND,PB0,PB1 | GND | CH1- CH2-
 W0 | | CH1+
 W1 | | CH2+
 ************************************************************/
/***********************Notice********************************
 1.Resistor terminals A, B and W have no restrictions on
 polarity with respect to each other.
 2.Current through terminals A, B and W should not excceed ±1mA.
 3.Voltages on terminals A, B and W should be within 0 - VCC.
************************************************************/
#include <SPI.h>
/***********************PIN Definitions*************************/
// set pin 10 as the slave select for the digital pot:
const int CS_PIN = 10;
/***********************MCP42XXX Commands************************/
//potentiometer select byte
const int POT0_SEL = 0x11;
const int POT1_SEL = 0x12;
const int BOTH_POT_SEL = 0x13;
//shutdown the device to put it into power-saving mode.
//In this mode, terminal A is open-circuited and the B and W terminals are sh
orted together.
//send new command and value to exit shutdowm mode.
const int POT0_SHUTDOWN = 0x21;
const int POT1_SHUTDOWN = 0x22;
const int BOTH_POT_SHUTDOWN = 0x23;
/***********************Customized Varialbes**********************/
//resistance value byte (0 - 255)
//The wiper is reset to the mid-scale position upon power-up, i.e. POT0_Dn =
POT1_Dn = 128
int POT0_Dn = 128;
int POT1_Dn = 128;
int BOTH_POT_Dn = 128;
//Function Declaration
void DigitalPotTransfer(int cmd, int value); //send the command and the w
iper value through SPI
void setup()
{
 Serial.begin(115200);
 pinMode(CS_PIN, OUTPUT); // set the CS_PIN as an output:
 SPI.begin(); // initialize SPI:
}
void loop()
{
 // change the resistance on the POT0 from min to max:
 for (int POT_Dn = 0; POT_Dn < 256; POT_Dn++) {
 DigitalPotWrite(POT0_SEL, POT_Dn);
 delay(1);
 }
 // change the resistance on the POT0 from max to min:
 for (int POT_Dn = 0; POT_Dn < 256; POT_Dn++) {
 DigitalPotWrite(POT0_SEL , 255 - POT_Dn);
 delay(1);
 }
}
void DigitalPotWrite(int cmd, int val)
{
 // constrain input value within 0 - 255
 val = constrain(val, 0, 255);
 // set the CS pin to low to select the chip:
 digitalWrite(CS_PIN, LOW);
 // send the command and value via SPI:
 SPI.transfer(cmd);
 SPI.transfer(val);
 // Set the CS pin high to execute the command:
 digitalWrite(CS_PIN, HIGH);
}
Experiment Results
Two triangular waves out of phase can b

Burada da başka bir örnek var;

C:
/*************************************************************
 Dual Digital Pot (100K)
 <https://www.dfrobot.com/wiki/index.php/Dual_Digital_Pot_(100K)_SKU:_DFR
0520>
 *************************************************************
 This example serves as a template to control the MCP42100 dual
 digital pot through 3-wire SPI.
 Created 2017-8-31
 By Henry Zhao <Henry.zhao@dfrobot.com>
 GNU Lesser Genral Public License.
 See <http://ww.gnu.org/licenses/> for details.
 All above must be included in any redistribution.
 ************************************************************/
/********************Device Inctrduction**********************
 The MCP42100 has dual potentiometer x (x=0,1).
 Ax - Potenriometer terminal Ax
 Wx - Potenriometer Wiper
 Bx - Potenriometer terminal Bx
 SI - Serial Data Input
 SCK - Serial Clock
 CS - Chip Select
 The MCP42100 is SPI-compatible,and two bytes should be sent to control i
t.
 The first byte specifies the potentiometer (POT0: 0x11, POT1: 0x12, both
: 0x13).
 The second byte specifies resistance value for the pot (0 - 255).
 ************************************************************/
/***********************Circuit Connections*******************
 Digital Pot | Arduino UNO R3
 CS | D10 (SS)
 SI | D11 (MOSI)
 CLK | D13 (SCK)
 VCC | VCC
 GND | GND
 ************************************************************/
/***********************Resistances Calculation**************
 Rwa(Dn) =Rab*(256 - Dn) / 256 + Rw
 Rwb(Dn) =Rab*Dn / 256 + Rw
 Rwa - resistance between Terminal A and wiper W
 Rwb - resistance between Terminal B and wiper W
 Rab - overall resistance for the pot (=100KΩ, typical)
 Rw - wiper resistance (=125Ω,typical; =175Ω max)
 Dn - 8-bit value in data register for pot number n (= 0 - 255)
 ************************************************************/
/***********************Notice********************************
 1.Resistor terminals A, B and W have no restrictions on
 polarity with respect to each other.
 2.Current through terminals A, B and W should not excceed ±1mA.
 3.Voltages on terminals A, B and W should be within 0 - VCC.
************************************************************/
#include <SPI.h>
/***********************PIN Definitions*************************/
// set pin 10 as the slave select for the digital pot:
const int CS_PIN = 10;
/***********************MCP42XXX Commands************************/
//potentiometer select byte
const int POT0_SEL = 0x11;
const int POT1_SEL = 0x12;
const int BOTH_POT_SEL = 0x13;
//shutdown the device to put it into power-saving mode.
//In this mode, terminal A is open-circuited and the B and W terminals are sh
orted together.
//send new command and value to exit shutdowm mode.
const int POT0_SHUTDOWN = 0x21;
const int POT1_SHUTDOWN = 0x22;
const int BOTH_POT_SHUTDOWN = 0x23;
/***********************Customized Varialbes**********************/
//resistance value byte (0 - 255)
//The wiper is reset to the mid-scale position upon power-up, i.e. POT0_Dn =
POT1_Dn = 128
int POT0_Dn = 128;
int POT1_Dn = 128;
int BOTH_POT_Dn = 128;
//Function Declaration
void DigitalPotTransfer(int cmd, int value); //send the command and the r
esistance value through SPI
void setup()
{
 pinMode(CS_PIN, OUTPUT); // set the CS_PIN as an output:
 SPI.begin(); // initialize SPI:
 DigitalPotWrite(BOTH_POT_SHUTDOWN, BOTH_POT_Dn);
}
void loop()
{
 DigitalPotWrite(POT0_SEL, POT0_Dn); //set the resistance of
POT0
 DigitalPotWrite(POT1_SEL, POT1_Dn); //set the resistance of
POT1
 //DigitalPotWrite(BOTH_POT_SEL, BOTH_POT_Dn); //set the resistance
of both potentiometers
 //DigitalPotWrite(POT0_SHUTDOWN, POT0_Dn); //put POT0 into shu
ntdowm mode, ignore the second parameter
 //DigitalPotWrite(POT1_SHUTDOWN, POT1_Dn); //put POT1 into shu
ntdowm mode, ignore the second parameter
 //DigitalPotWrite(BOTH_POT_SHUTDOWN, BOTH_POT_Dn); //put both potentio
meters into shuntdowm mode, ignore the second parameter
}
void DigitalPotWrite(int cmd, int val)
{
 // constrain input value within 0 - 255
 val = constrain(val, 0, 255);
 // set the CS pin to low to select the chip:
 digitalWrite(CS_PIN, LOW);
 // send the command and value via SPI:
 SPI.transfer(cmd);
 SPI.transfer(val);
 // Set the CS pin high to execute the command:
 digitalWrite(CS_PIN, HIGH);
}
 

umk

Aktif Üye
Katılım
22 Haziran 2018
Mesajlar
174
@Gokrtl, öncelikle bu entegreyi daha önce hiç kullanmadığımı belirteyim, ancak datasheet ine baktığımızda (sayfa 18, şekil 5-2) command word ile işlem yapacağın potu seçebiliyorsun. Yani, command Word e (CW) = 0x11 değerini yazarsan Pot0 'ı kontrol eder hale geliyorsun,
CW = 0x12 eğerini yazarsan Pot1 'i kontrol eder hale geliyorsun. Aynı şekilde CW = 0x13 olursa gönderdiğin değer her iki pot'a da aynı şekilde etki ediyor(stereo gibi). Bunu örnek verdiğin iki kodda da görmek mümkün. İkinci kod için 57-59, 85-87 arası kodlara bak. Örnek algoritma olarak,(POT0 için)
CS Low yap
CommandWord = 0x11 (SPI.transfer)
DataWord = Pot'a gönderilmesi geren değer (SPI.transfer)
CS High yap.
Datasheet te dikkatimi çeken iki nokta oldu. Birincisi, Pot a sıfır değeri göndersen bile (PB ve PW kısa devre durumu) "wiper resistance" yüzünden 10 Kohm luk pot için çıkışta minimum 52 ohm göreceğin yazıyor. Yani pot tamamen sıfırlanmıyor. İkincisi, (kısa devre durumu PA-PW veya PB-PW) potun bozulmaması için wiper (PW, potun orta ucu ) üzerinden geçen akımın 1 mA i aşmaması gerekiyor.
Sonradan gördüm, kodların ilk açıklama satırlarında da bunlar belirtilmiş.
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
13,251
Senin projede aslında dijital potansiyometrelik bir durum yok Gökhan. 10 veya 12 bitlik bir SPI DAC kullan. Özdisan'da vardır.

DAC'in çıkışı voltaj ayar potansiyometresinin orta ucunun yerini alacak. Potansiyometre değişen bir voltaj vereceğine DAC verecek onu.
 

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
7,638
@Gokrtl, öncelikle bu entegreyi daha önce hiç kullanmadığımı belirteyim, ancak datasheet ine baktığımızda (sayfa 18, şekil 5-2) command word ile işlem yapacağın potu seçebiliyorsun. Yani, command Word e (CW) = 0x11 değerini yazarsan Pot0 'ı kontrol eder hale geliyorsun,
CW = 0x12 eğerini yazarsan Pot1 'i kontrol eder hale geliyorsun. Aynı şekilde CW = 0x13 olursa gönderdiğin değer her iki pot'a da aynı şekilde etki ediyor(stereo gibi). Bunu örnek verdiğin iki kodda da görmek mümkün. İkinci kod için 57-59, 85-87 arası kodlara bak. Örnek algoritma olarak,(POT0 için)
CS Low yap
CommandWord = 0x11 (SPI.transfer)
DataWord = Pot'a gönderilmesi geren değer (SPI.transfer)
CS High yap.
Datasheet te dikkatimi çeken iki nokta oldu. Birincisi, Pot a sıfır değeri göndersen bile (PB ve PW kısa devre durumu) "wiper resistance" yüzünden 10 Kohm luk pot için çıkışta minimum 52 ohm göreceğin yazıyor. Yani pot tamamen sıfırlanmıyor. İkincisi, (kısa devre durumu PA-PW veya PB-PW) potun bozulmaması için wiper (PW, potun orta ucu ) üzerinden geçen akımın 1 mA i aşmaması gerekiyor.
Sonradan gördüm, kodların ilk açıklama satırlarında da bunlar belirtilmiş.
Açıklama için teşekkürler abi.
Normal potlarda da ben hiç sıfırı görmedim zaten.
Şimdi bir ölçüm yaptım. Çok turlu pott da 6 Ohm, Normal potta 2.5 Ohm değer gördüm. Bu durumda 52 Ohm biraz yüksek kalıyor. Sonucu ne kadar etkileyeceğini deneyip görmek lazım.
1mA olayını tam anlamadım. Bu değer çok küçük bir değer. Bu kadarcık akım farkını ayarlamak zor olabilir. Bu durumda devrenin pota verdiği akımı ölçmek gerekir ve ben bunun nasıl yapılacağını şimdilik bilmiyorum. Yani yapılacak en mantıklı şey portun orta bacağına giden hatta multimetre sokmak olur ama 1mA'i saglıklı bir şekilde nasıl ölçeceğiz bilmiyorum.

Senin projede aslında dijital potansiyometrelik bir durum yok Gökhan. 10 veya 12 bitlik bir SPI DAC kullan. Özdisan'da vardır.

DAC'in çıkışı voltaj ayar potansiyometresinin orta ucunun yerini alacak. Potansiyometre değişen bir voltaj vereceğine DAC verecek onu.
Artık çok geç. Dün konuyu açıp bir süre bekledikten sonra aliexpress den potları aldım. Yedeği de olsun diye iki tane aldım.
Ayrıca dün özdisandan da direnç sipariş ettim. Yola çıkmıştır bile. Bilsem ekletirdim. Gerçi şimdi baktım DAC larda pek ucuz sayılmaz. Artık önümüzdeki ay alırız onuda.

MCP4922 uygun mudur?

mcp4922 datasheet.png
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
13,251
Tamam o zaman dijital potansiyometre ile yaparsın başka bir projede de DAC kullanırsın. MCP4922 uygun.
 

fide

Aktif Üye
Staff member
Katılım
8 Eylül 2021
Mesajlar
296
Bu dijital potun 64 adımlı basit bir versiyonu ile sabit akım kontrolü yapmıştım. Tek kanaldı. Clk ve u/d pini var. 1mA akım olayı şu şekilde: potun içinde dirençleri devreye alıp çıkartan mosfet benzeri küçük yapılar var. Pot verilen değere göre bu dirençlere paralel bağlı mosfetleri iletime yada yalıtıma götürüyor gibi düşünülebilir.

1mA yanında dijital potun maruz kalabileceği maksimum voltaj da önem arz ediyor. Pot en yüksek kademede bile olsa 6-7 volttan yüksek voltaja maruz kalırsa arızalanabilir. Bu konu da önemli.
Ben potu şönt direncinin üzerinde düşen voltajı yükselten opampın kazancını ayarlamak için kullanmıştım. Uzun süreli kullanımda sıkıntı çıkmamıştı.
Dijital potlar bence DAC'lara göre daha avantajlı. Çünkü direnç gibi davranabiliyor. Diğer taraftan 150khz switching frekansı olan sw regülatör ile sıkıntı çıkarmazken (TPS54560), 500khz ile çalışan sw regülatör (TPS5410) ile problem çıkarmıştı. Çözümü regülatörü değiştirmekte buldum.

@Gokrtl malzeme boşta kalırsa bir şekilde değerlendirebiliriz.
 

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
7,638
İki tane tek kanal, iki tane çift kanal boşta şuan. Yeri gelince konusunu açarım.
 
Top