如何用模拟值控制 Mcp41010 抽头位置

How to control an Mcp41010 wiper position with an analog value

我正在使用 Mcp41010 数字电位器芯片,我想知道如何使用我可以调节的模拟输入电压来改变芯片的游标位置,我需要一种方法来递减 (--) 游标位置,如果电压越过某个点并递增 (++) 芯片的游标位置回到正常位置这是我发现的一些代码,它只是使游标位置上下渐变我需要一种控制它的方法。我对 arduino 还是很陌生,如果我的解释足够清楚的话,我很抱歉。

int CS_signal = 12;                      // Chip Select signal onsul pin 2 of Arduino
int CLK_signal = 52;                     // Clock signal on pin 4 of Arduino
int MOSI_signal = 51;                    // MOSI signal on pin 5 of Arduino
byte cmd_byte2 = B00010001 ;            // Command byte
int initial_value = 100;                // Setting up the initial value

void initialize() {                     // send the command byte of value 100 (initial value)
spi_out(CS_signal, cmd_byte2, initial_value);
}

void spi_out(int CS, byte cmd_byte, byte data_byte){                         // we need this function to send command byte and data byte to the chip

digitalWrite (CS, LOW);                                                 //  to start the transmission, the chip select must be low
spi_transfer(cmd_byte); // invio il COMMAND BYTE
delay(2);
spi_transfer(data_byte); // invio il DATA BYTE
delay(2);
digitalWrite(CS, HIGH);                                                 //     to stop the transmission, the chip select must be high
}

void spi_transfer(byte working) {
for(int i = 1; i <= 8; i++) {                                           //      Set up a loop of 8 iterations (8 bits in a byte)
if (working > 127) { 
digitalWrite (MOSI_signal,HIGH) ;                                    // If the MSB is a 1 then set MOSI high
} else { 
digitalWrite (MOSI_signal, LOW) ; }                                  // If the MSB is a 0 then set MOSI low                                           

digitalWrite (CLK_signal,HIGH) ;                                        //  Pulse the CLK_signal high
working = working << 1 ;                                                // Bit-shift the working byte
digitalWrite(CLK_signal,LOW) ;                                          // Pulse the CLK_signal low
}
}

void setup() {
pinMode (CS_signal, OUTPUT);
pinMode (CLK_signal, OUTPUT);
pinMode (MOSI_signal, OUTPUT);

initialize();

Serial.begin(9600);                                                     // setting the serial speed
Serial.println("ready!");
}

void loop() {
for (int i = 0; i < 255; i++) {
spi_out(CS_signal, cmd_byte2, i); 
Serial.println(i); delay(10); 
}
for (int i = 255; i > 0; --i) {
spi_out(CS_signal, cmd_byte2, i);
Serial.println(i);
delay(10);
}
}
int CS_signal = 12;                      // Chip Select signal onsul pin 2     of Arduino
int CLK_signal = 52;                     // Clock signal on pin 4 of Arduino
int MOSI_signal = 51;                    // MOSI signal on pin 5 of Arduino
byte cmd_byte2 = B00010001 ;            // Command byte
int initial_value = 100;                // Setting up the initial value

void initialize() {                     // send the command byte of value 100 (initial value)
spi_out(CS_signal, cmd_byte2, initial_value);

}

void spi_out(int CS, byte cmd_byte, byte data_byte){                        // we need this function to send command byte and data byte to the chip

digitalWrite (CS, LOW);                                                 // to start the transmission, the chip select must be low
spi_transfer(cmd_byte); // invio il COMMAND BYTE
delay(2);
spi_transfer(data_byte); // invio il DATA BYTE
delay(2);
digitalWrite(CS, HIGH);                                                 // to stop the transmission, the chip select must be high
}

void spi_transfer(byte working) {
for(int i = 1; i <= 8; i++) {                                           // Set up a loop of 8 iterations (8 bits in a byte)
 if (working > 127) { 
   digitalWrite (MOSI_signal,HIGH) ;                                    //  If the MSB is a 1 then set MOSI high
 } else { 
   digitalWrite (MOSI_signal, LOW) ; }                                  // If the MSB is a 0 then set MOSI low                                           

digitalWrite (CLK_signal,HIGH) ;                                        // Pulse the CLK_signal high
working = working << 1 ;                                                // Bit-shift the working byte
digitalWrite(CLK_signal,LOW) ;                                          // Pulse the CLK_signal low
}
}

void setup() {
pinMode (CS_signal, OUTPUT);
pinMode (CLK_signal, OUTPUT);
pinMode (MOSI_signal, OUTPUT);

initialize();

Serial.begin(9600);                                                     // setting the serial speed
Serial.println("ready!");
}

  void loop() {
  //  read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  if(sensorValue <= 200){
  //  Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
   float voltage = sensorValue * (5.0 / 1023.0);
   //   print out the value you read:
   Serial.println(voltage);

    int i = sensorValue;{
    spi_out(CS_signal, cmd_byte2, i); 
    Serial.println(i); 

   }
   }

   }