Envíe más de un valor a través de SPI / arduino, MAX5483, digi-poti de 10 bits

0

Con la ayuda de efox29 trabajé para controlar el MAX5483, potenciómetro digital de 10 bits (hoja de datos < a href="http://datasheets.maximintegrated.com/en/ds/MAX5481-MAX5484.pdf"> here ) con un arduino utilizando SPI. Ahora, ¿cómo puedo activar más de un valor?

Traté de hacer eso con un simple bucle for, pero no funciona. Para ser precisos produce un valor de resistencia extraño (68 Ohm). E incluso solo poner un retraso parece causar los mismos problemas ...

Por ejemplo

digitalPotWrite(197); //  
delay(10000); 
digitalPotWrite(60); //  
delay(10000); 

Debería cambiar la resistencia entre 2.1k Ohm y 688 Ohm. Asumo que, ya que al poner solo

digitalPotWrite(197);

o

digitalPotWrite(60); 

solo sin demora (10000); Puedo medir estos valores con mi multímetro entre el pin 10 y el 11 de MAX5483. Pero al juntarlo todo como lo intenté arriba, extrañamente mido solo 65-68 Ohm. Esto no cambia al poner solo las siguientes líneas:

digitalPotWrite(197); //  
delay(10000);

Aquí el valor medido (entre el pin 10 y el 11) todavía es de 68 Ohm. Aquí está el código completo:

#include <SPI.h> 
const int csPin = 3;
const int selPin = 2;  

void setup() {

 SPI.begin();
 SPI.setBitOrder(MSBFIRST); //We know this from the Data Sheet
 SPI.setDataMode(SPI_MODE2);

 pinMode(csPin,OUTPUT); 
 digitalWrite(csPin, LOW);

 pinMode(selPin,OUTPUT);
 digitalWrite(selPin, HIGH); 

}

void loop()
{     
    //"sweep" small range (from 1.7 to 2.1 KOhm)
    // 158 to 197
//    
//    for (int i=158; i < 211; i++){
//    delay(1000);
//    digitalPotWrite(i); //  
//   } 

digitalPotWrite(197); //  
delay(100); // seems to cause issues.. without this line it works

}

void digitalPotWrite(int value) {
digitalWrite(csPin, LOW);
delay(1);
byte command=0x0;
byte byte0 = (value & 0x03) << 6;
byte byte1 = (value & 0x3FC) >> 2;
SPI.transfer(command);
SPI.transfer(byte1);
SPI.transfer(byte0);
delay(1);
digitalWrite(csPin, HIGH);
}
    
pregunta algomachine

2 respuestas

1

En void setup () necesitas cambiar la línea

SPI.setDataMode(SPI_MODE2); 

en

SPI.setDataMode(SPI_MODE0); 
    
respondido por el algomachine
1

Esto es disparar en la oscuridad porque no sé lo que significa "no funciona".

Pero si tuviera que adivinar, diría que está funcionando. Si puede cargar un boceto en el que es un valor fijo y ve la resistencia como se espera, entonces parece ser un problema con su retraso, lo que significa que es demasiado rápido. Con el retraso (100), es esencialmente cambiando la resistencia cada 100 ms. ¿Puede su medidor recoger eso bien? ¿Pueden tus ojos recoger eso bien?

Cambie su retraso (100) a retraso (10000) , lo que le dará una ventana de 10 segundos para comprobar la resistencia. Si desea más, pruebe un valor de ms más alto para su función de retardo.

Si proporciona más información, tal vez podamos ofrecerle un poco más de información acerca de por qué algo "no funciona".

edite a partir de información adicional

Quizás el modo SPI es incorrecto.

De la hoja de datos

  

Drive CS low   para cargar los datos en DIN (U / D) sincrónicamente en el turno   registrarse en cada flanco ascendente SCLK (INC).

Parece que SPI.setDataMode (SPI_MODE2) es incorrecto. Debido a que el MODO 2 es la base, el reloj es alto y los datos se capturan en el flanco descendente.

Cambie su SPI.setDataMode (SPI_MODE2) a SPI.setDataMode (SPI_MODE3) y vea si tiene mejores resultados.

    
respondido por el efox29

Lea otras preguntas en las etiquetas