# Preamplifiicador PGA2311



## downcount (Mar 19, 2008)

Hola a todos! estoy realizando un proyecto de un preamplificador basado en el control de volumen PGA2311PA y este esta controlado mediante un microcontrolador PIC18F452. El proyecto es casi el mismo que salió en la revista elektor, lo que yo estoy realizando todo el software y hardware de nuevo, aqui podeis encontrar el proyecto de elektor http://www.dh3ben.de/html/electronics/pga2311_preamp.shtml. 
El PGA2311 es un control de volumen de alta fidelidad, en el qual el volumen se controla digitalmente mediante SPI. Por el momento lo he montado en una placa de pruebas y he conseguido variar el volumen con pulsadores. El codigo lo he escrito en CCS, las funciones SPI del CCS no no me funcionan, pero lo he conseguido hacer funcionar con unas funciones SPI por software. Tambien quiero que se pueda variar el volumen con mando a distancia (codigo RC5 de phillips), he utilizado el codigo que hay publicado en el foro, lo malo es que no funciona por interrupciones y no me acaba de funcionar del todo bien, a veces detecta bien el codigo y a veces no. 
Estoy diseñando las placas de cirtcuito impreso, de momento he hecho la fuente de alimentacion y ahora voy a hacer la placa principal del microcontrolador con el control de volumen, pero todavia no tengo claro que puertos del PIC utilizar.
Necesito a alguien que me ayude con la programacion del codigo en CCS, gracias.


----------



## downcount (Mar 19, 2008)

Este és el codigo para decodificar el mando a distancia, he puesto unos mensajes por el RS232 para saber si funciona la decodificacion, por el momento no me funciona. Estoy hablando con el que ha escrito el programa para ver si se puede solucionar.

```
//main

//*******************************************************************************
// 
//        Simple program to decode commands of RC5 infrared remote controls                                                         
//                                     
//                                                            
//          01/01/2006 by Daniel Porzig                 [url]www.base32.de.vu[/url]
//                                                            
//                                                            
//                                                            
//                                                            
//   ATTENTION! All timervalues just fit, if the controller runs with 20 MHz!
//   When you use another frequency, the values have to be adapted!
//
//
//
//
//*******************************************************************************


#include <18F452.h>

#fuses NOWDT,HS, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


#include <IR.c>
   

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   EXT_INT_EDGE(H_TO_L); 
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   
   rc5.state=0;  
   //input(PIN_B0);// this sets up PIN B0 as an input pin. You could use "set_tris_b(...)" too.
   set_tris_b(0b00000001);
   while(1)
   { 
      if(rc5.state==1)
      {  
         puts("works");
         rc5.state=0;
         enable_interrupts(INT_EXT);
      }
   }   
}


//Libreria IR.c

#define IR_INPUT PIN_B0

#define IR_STATUS (!input(IR_INPUT))

   

typedef struct
{
   int8 data[2];
   int8 state;
} rc5_struct;

rc5_struct rc5;

int1 get_RC5(void)
{
   int16 tmp,t;
   int i;
   int1 inp;
   
   set_timer1(0);  
   while(IR_STATUS == 1);
   t=get_timer1(); 
   puts("debugg2");
   
   if ((t<400) || (t<800)){
   puts("not works");
   return 0;
   }
   
   for (i=0;i<13;i++)
   {
      inp=IR_STATUS;
      set_timer1(0);
      puts("debugg3");
      
      while (IR_STATUS==inp)
      {
         t=get_timer1();
         if (t>800) return 0;
      }
      
      tmp<<=1;
      
      if (inp==0) tmp++;
      
      set_timer1(0);
      while (get_timer1()<776);
   }
   
   tmp=tmp | 0x3000;
   tmp=tmp & 0x37FF;
   
   rc5.data[0]=tmp & 0xFF;
   tmp>>=8;
   rc5.data[1]=tmp & 0xFF; 
      
   rc5.state=1;
   
   disable_interrupts(INT_EXT);
   
   return 1;
}   


#int_EXT
void EXT_isr()
{
   puts("debugg1");
   get_RC5();
   
}
```


----------



## downcount (Mar 19, 2008)

Este es el programa que envia por el SPI el volumen al PGA y lo muestra en el LCD.-El voumen se controla mediante 35 pasos, lo ideal seria utilizar los 255 que permite el PGA. El programa no esta muy bien escrito pero funciona! que ya es mucho, jejejje 

```
//main

#include <18F452.h>
#include "funciones_preamp.c"

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#include <lcd.c>

void main()
{
   int tab_vol [26]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
   int i=5;
   int tab_volum;
   unsigned char volll=50;
   lcd_init();
   output_bit(PIN_D3,1);
   tab_volum=tab_vol[i];
   printf(lcd_putc,"OCS Preamplificadorfier");
   lcd_putc('\n');
   printf(lcd_putc,"Volum %u",tab_volum);
   delay_ms(1000);
   volume_set(volll,volll);
   
   while(TRUE)
   {
      if((!input(PIN_A0))&&(i<25)) //PIN_A0 aumenta volumen
      {
         delay_ms(200);
         i++;
         tab_volum=tab_vol[i];
         volll=volll+10;
         lcd_putc('\f');
         printf(lcd_putc,"OCS Preamplificadorfier");
         lcd_putc('\n');
         printf(lcd_putc,"Volum %u",tab_volum);         
         volume_set(volll,volll);
      }
            
      if((!input(PIN_A1))&&(i>0)) //PIN_A1 disminuye volumen
      { 
         delay_ms(200);
         i--;
         tab_volum=tab_vol[i];
         volll=volll-10;
         lcd_putc('\f');
         printf(lcd_putc,"OCS Preamplificadorfier");
         lcd_putc('\n');
         printf(lcd_putc,"Volum %u",tab_volum);         
         volume_set(volll,volll);
      } 
   }         
}
```


```
//libreria funciones_pream.c


void volume_set(unsigned char right, unsigned char left)
{
   unsigned char i,b;
   output_bit(PIN_B7,0); //Activa el PGA /CS
   output_bit(PIN_B4,1); //Zero Crossing ZCEN
   
   b=right;
   for(i=8;i>0;i--)  //clock
   {
      unsigned char x;
      x=1<<(i-1);
      if (b>=x)
      {
         output_bit(PIN_B6,1); //SDI
         b-=x;
      }
      else
      {
         output_bit(PIN_B6,0); //SDI
      }
      output_bit(PIN_B5,0); //SCLK
      output_bit(PIN_B5,1); //SCLK
   }
   b=left;
   for(i=8;i>0;i--)  //clock
   {
      unsigned char x;
      x=1 << (i-1);
      if (b>=x)
      {
         output_bit(PIN_B6,1); //SDI
         b-=x;
      }
      else
      {
         output_bit(PIN_B6,0); //SDI
      }
      output_bit(PIN_B5,0); //SCLK
      output_bit(PIN_B5,1); //SCLK
   }
   output_bit(PIN_B7,1); //Desactiva el PGA /CS
}
```


----------



## motruito (Jun 21, 2009)

Hola Downtown, 

No se si el prototipo llego a buen puerto y aun te acuerdas de el. 
Tienes algun esquematico del preamplificador?
Necesito un control de volumen para unos Bose  preamplificados que a salida de linea te dejan sordo.
Estaba jugando con un posible esquematico cuando me he encontrado tu proyecto.

Lo que es la parte PIC y programacion, no me supone mucho problema pero este sera mi primer proyectillo en el mundo del audio y jugar con los bose puede suponer gran disgusto  

Por lo que veo en el datasheet, se necesita una fuente +-5v y no queria llegar a la doble fuente.
He visto en tu foto que tiene una fuente simple.  Correcto? 

tienes algun esquematico?  alguna recomendacion al usar este IC?

muchas gracias


----------



## downcount (Jun 24, 2009)

Hola motruito,
mira en estas webs...hay proyectos con en el PGA, aqui encontraras inormación y esquemas.
http://www.dh3ben.de/html/electronics/pga2311_preamp.shtml, este es el mejor link, de aqui saque la idea, mi esquema es muy parecido.
en algunas webs tendras que registrarte para ver los archivos adjuntos y fotos.
http://www.head-fi.org/forums/f6/minivol-simple-diy-pga2320-volume-control-280515/
http://www.diyaudio.com/forums/showthread/t-106377.html
http://bygselvhifi.dk/alephp.htm
http://www.elektor.es/revistas/2008/abril/en-perfecto-equilibrio.406956.lynkx
he vuelto a la carga..estoy diseñando las PCB,  me va a salir por un ojo de la cara...pero lo quiero hacer bien hecho.
Recomendación....ummm no se..puedes pedir samples a ti.com...las hay en encapsulado DIP.


----------



## downcount (Jun 24, 2009)

puedes usar solo una fuente de +/-5V para alimentar la parte analogica y la digital, auq es preferible usar dos fuentes separadas para unir las masas (analogicas y digitales) en un solo punto por el tema de las interferencias.


----------



## downcount (Ago 15, 2009)

Hola a todos! despues de unos de meses diseñando las placas os voy a mostrar los resultados, bueno aun no estan terminadas...pero ya falta poco. En alguna solo me me falta hacer pequeños retoques y poner las vias, la placa principal del microcontrolador la tengo a medias, esta es mas complicada y me la tomo con calma, quizas la voy a hacer de 4 capas.
Aun me queda muchisimo trabajo por hacer bufffff, pero cada vez veo mas cerca el final jejeje, veo los resultados y eso me anima. Me queda por terminar las placas...acabarlas de pulir y asegurarme que no haya errores, volver a montar el prototipo para asegurarme que todo funciona y pulir el software. Y finalmente que quedará por hacer el diseño mecánico.
He pensado en diseñarlo con un software de CAD/CAM, en el trabajo tenemos el FIKUS para diseñar los paneles frontales de los equipos o en CIMATRON y lo mandare a fresar a aqui http://www.modushop.biz/ecommerce/index_l2.php.
No he colgado todas las placas, a parte de estas he diseñado otras con indicadores leds de alimentación, una de entrada de DC con filtraje, una adaptadora para el LCD, y la del sensor de infrarojos.


----------

