Potenciómetros Digitales, Códigos de control

Ratmayor

ModeraTroll
Inicio este post luego de varios años de abandono :V para crear una colección de fragmentos de código útiles para CCS PIC C para controlar ICs potenciómetros digitales.

A estos códigos que estaré compartiendo, pueden hacerle correcciones y/o sugerencias para mejorarlos, ya que tomando en cuenta que la comunicación serial me da ansiedad, puede que necesiten mejoras, e incluso yo mismo estaré agregando actualizaciones al código para hacerlo más corto y eficiente. Sin más que agregar, acá los códigos:

Constantes en común en los fragmentos de código
C:
//Acá declaramos los pines que usaremos para controlar el potenciómetro
#define CS PIN_A0 //Lo usamos como Circuit (Chip) Select o Strobe, según sea el caso
#define CLK PIN_A1 //Lo usamos como señal de reloj (Clock)
#define SDO PIN_A2 //Lo usamos como señal de datos seriales

Serie AD5206
C:
void ad520x(int address, int data){
   int j;
   //Iniciamos la conexión con el AD520X
   output_low(CS);
   for(j=0; j<11; j++){
      output_low(CLK);
      if(j<3){
            output_bit(SDO,bit_test(address,11-j)); //Enviamos los primeros 3 bits para seleccionar los potenciómetros del 1 al 4 ó 6
      }
      else{
            output_bit(SDO,bit_test(address,11-j)); //Enviamos la pocisión del potenciómetro seleccionado
      }
      delay_us(2);
      output_high(CLK);
      delay_us(2);
   }
   j=0;
   //Finalizamos la conexión con el AD520X
   output_high(CS);
}

Serie PGA231X
C:
void pga231x(int left, int right){
   int k;
   //Iniciamos la conexión con el PGA231X
   output_high(CS);
   output_high(CLK);
   delay_us(2);
   output_low(CS);
   for(k=0; k<16; k++){
      //Para controlar el PGA231X se envían 2 números consecutivos de 8 bits,
      //donde primero se envían los datos del canal derecho y luego el izquierdo...
      output_low(CLK);
      //Hacemos un conteo de los primeros 8 bits, al cumplirse la condición, se enviarán los datos al otro canal
      if(k<8){
            output_bit(SDO,bit_test(left,16-k));
      }
      else{
            output_bit(SDO,bit_test(right,16-k));
      }
      delay_us(2);
      output_high(CLK);
      delay_us(2);
   }
   k=0;
   output_high(CS);
   output_high(CLK);
}

Serie LMC835
C:
void lmc835(int address, int data){
   //Establecemos una tabla de datos con las direcciones de las bandas y las posiciones
   int band[14]={0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71};
   int level[26]={0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x48, 0x54, 0x68, 0x80, 0x94, 0xB4, 0xF4, 0x02, 0x06, 0x0A, 0x12, 0x22, 0x42, 0x4A, 0x56, 0x6A, x82, 0x96, 0xB6, 0xF6};}
   n=0;
   //Establecemos conexión con el LMC835
   output_high(CS);
   delay_us(2);
   //Enviamos parámetros sobre la banda seleccionada, acá seleccionamos la banda y la escala que en este caso será 12dB
   for(n=0; n<8; k++){
      output_high(CLK);
      output_bit(SDO,bit_test(band[addres],n));
      delay_us(2);
      output_low(CLK);
      delay_us(2);
   }
   n=0;
   //Indicamos al IC que ahora recibirá los datos del nivel
   output_high(CLK);
   delay_us(2);
   output_low(CS);
   delay_us(2);
   output_high(CS);
   //Enviamos el nivel de la banda seleccionada de -12dB a +12dB, 25 posiciones en total
   for(n=8; n<16; k++){
      output_high(CLK);
      output_bit(SDO,bit_test(level[data],n));
      delay_us(2);
      output_low(CLK);
      delay_us(2);
   }
   //Finalizamos conexión
   output_high(CLK);
   output_high(CS);
}
 
Última edición:

Ratmayor

ModeraTroll
Bonus Extra: Código para usar rotary encoders

C:
//Declaración de variables
int nivel, aux, enc;
//Si se desea agregar mas encoders, es solo cuestión de colocar las mismas variables,
//pero con un número (nivel1, aux1, enc1, nivel2, aux2, enc2, etc...

//Convierte los puertos entrantes en un numero binario, con el fin de detectar el sentido de giro
//Acá estamos usando el puerto A, pero como no dependemos del hardware del MCU, podemos cambiarlo a gusto
if(!input(PIN_A0) && !input(PIN_A1)){enc = 0;}
if(!input(PIN_A0) && input(PIN_A1)){enc = 1;}
if(input(PIN_A0) && !input(PIN_A1)){enc = 2;}
if(input(PIN_A0) && input(PIN_A1)){enc = 3;}
//Convierte los puertos entrantes en un numero binario para obtener un número entero que nos ayude a identificar el sentido de giro

//Detectado el sentido de giro, incrementa o decrementa el valor
if ((aux==2)&&(enc==3)){
   if(nivel < 255){nivel++;} //Establece el tope máximo
}
if ((aux==3)&&(enc==2)){
   if(nivel > 0){nivel--;} //Establece el tope mínimo
}
aux = enc; //Igualamos las variables para poder detectar de nuevo el sentido de giro cuando vuelva a moverse el rotary encoder
 
Última edición:
Arriba