MAX5483, potenciómetro digital de 10 bits controlado por SPI por arduino

1

Intento trabajar desesperadamente con un programa arduino para controlar el potenciómetro digital MAX5483 de 10 bits con SPI, pero algo no funciona. Obtengo algunos valores de resistencia, pero el protocolo está implementado incorrectamente, me temo ... ¿Por qué mi código arduino a continuación no funciona?

Aquí está el código arduino:

#include <SPI.h> 

const int csPin = 3;
const int selPin = 2;


void setup() {

 SPI.begin();
 SPI.setBitOrder(MSBFIRST); 

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

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


}


void loop()
{     

    digitalPotWrite(250); 


}

// When working 
// 512 = 5070 Ohm
// 0 = 70 Ohm
// 1 = 80
// 1023 = 10070


void digitalPotWrite(int value) {
digitalWrite(csPin, LOW);
byte command=0x0;
SPI.transfer(command);
byte byte0 = (value >> int(value/255));
byte byte1 = ((value & B11) << 6);
SPI.transfer(byte0);
SPI.transfer(byte1);
digitalWrite(csPin, HIGH);
}

Aquí está la hoja de datos. Aquí hay un código para un PIC, que debería funcionar:

#include <main.h>

int16 count = 0;
int16 tmp;

void write_pot(int16 data)
{
   output_high(PIN_C2);     //chip select
   output_high(PIN_C3);      //clock
   output_low(PIN_C4);      //Data
   delay_us(1);

   output_low(PIN_C2);     //chip select
   delay_us(1);

   for(tmp=0;tmp<24;tmp++)
   {
      if(tmp<8)  
         output_low(PIN_C4);   //Data
      else if (tmp<18)
      {
         if(data&(0x0001<<(9-(tmp-8))))
            output_high(PIN_C4);   //Data
         else
            output_low(PIN_C4);   //Data
      }

      output_low(PIN_C3);      //clock
      delay_us(1);
      output_high(PIN_C3);      //clock

   }
   delay_us(1);
   output_high(PIN_C2);

   output_toggle(PIN_C1);

}

void main()
{
  // spispi_write( )
   while(TRUE)
   {
      if(count<200)  
         count++;
      else
         count = 50;


   //   printf("\n\r=%ld",count);

      write_pot(count);
      if(count==50)
         delay_ms(100);
      else
         delay_us(10);

   }

}
    
pregunta algomachine

1 respuesta

1

Prueba esto. Todo lo que necesitaba era simplemente reescribir el byte0 y el byte1, agregando un retardo después de que CS baja y antes de CS alto. También cambié el orden de SPI.transfer () para que sea COMMAND, BYTE 1 y luego BYTE 0.

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

Si esto no funciona, agrégalo a tu configuración.

SPI.setDataMode(SPI_MODE2);

Mirando la página 15, parece que la base del reloj descansa en '1'. Y los datos se capturan en el borde ascendente de los relojes. No estoy seguro de cuál es la configuración predeterminada para SPI.begin () pero podría ser que esté configurado para SPI_MODE1 (solo una conjetura).

Echa un vistazo a SPI para conocer los diferentes modos y lo que significan.

    
respondido por el efox29

Lea otras preguntas en las etiquetas