Autor Tema: PIC18F252 - AD5220: Control de volumen  (Leído 4858 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado andros

  • PIC16
  • ***
  • Mensajes: 111
PIC18F252 - AD5220: Control de volumen
« en: 24 de Julio de 2006, 17:45:49 »
Hola a todos!

Definitivamente a veces la electrónica me saca canas!!!. Bueno el problema es el siguiente!

He tenido problemas diseñando un control de volumen digital con el chip de analog devices AD5220...., para los que lo conocen verán en el datasheet que es una interfaz demasiado sencilla "aparentemente" de implementar. Solo necesita una señal en un pin UP/DOWN y un pulso en la entrada CLOCK (supuestamente se puede hacer con pulsadores directamente pero añadiendo circuitos antirrebote). Es decir, cuando hay un flanco de bajada en CLOCK el sistema detecta en que estado se encuentra el pin UP/DOWN, de esta manera si es vcc incrementa la resistencia a la salida, y si es gnd decrementa la resistencia.

El caso es que estoy generando las señales desde un microcontrolador PIC18F252 y lamentablemente no detecto que la resistencia varíe de ninguna forma , he hecho de todo!, he medido la resistencia a la salida con un multimetro y nada, también he introducido voltaje en las terminales que corresponden a la resistencia y no varía la tensión (claro, se debería formar un divisor de voltaje), también he conectado las salidas a las entradas del amplificador de audio lm386 y el voltaje de entrada se cae (típico de un problema de corriente, pero muy raro esto!). He revisado el montaje y es demasiado sencillo!, no sé que mas hacer o que estoy haciendo mal, a veces la verdad está ante mis ojos pero no la veo. Si alguien ha utilizado exitosamente este chip por favor me responda....

Como podrá verse en la gráfica las conexiones son de lo que yo consideraría "sencillas" es decir, demasiado sencillas (por eso elegí este desgraciado!, jajaja!) Lo unico quehice fué remplazar las entradas de botones por conexiones a dos pines del PIC....

Muchas gracias! :(

P.D: El tiene un pin CS, antes que me digan que lo ponga a tierra...., si, lo hice.

Andros!

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #1 en: 24 de Julio de 2006, 22:39:29 »
Hola andros, solo una pregunta : con que frecuencia actualizas la señal de clock, y las señales las tienes con una resistencia de descarga como indica la fig.?? prueba en colocarle led´s a las entradas para ver si el pic esta ejecutando el programa y que los pulsos sean los correctos. Si no lo desculas postea el diagrama de conexion entre el pote y el pic, y el programa utilizado.
suerte.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #2 en: 25 de Julio de 2006, 01:44:59 »
Es realmente facilito ese potenciómetro, ¿porqué no nos enseñas cómo tienes conectado el PIC y cuál es el programa?, creo que es necesario para buscar dónde tienes el problema.

Desconectado andros

  • PIC16
  • ***
  • Mensajes: 111
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #3 en: 26 de Julio de 2006, 14:14:11 »
Que tal delirio:

Realmente si, lo primero que hice antes de siquiera hacer el montaje fué colocar los leds, y debo decir que el programa esta perfecto... (por lo menos hasta ahora), dependiendo de que boton presione genera las salidas para incrementar o decrementar. Lo que hace el programa es primero ajustar el estado del pin UP/DOWN y luego genera el pulso de reloj, el tiempo en que el reloj se mantiene en  high lo tengo en 250ms y para volver a recibir otra instrucción hago un delay de 10ms...(bastante tiempo).

En cuanto a las resistencias si las había puesto, cuando hice eso ahí me decidí a postear... :(.

Saludos.

P.D: Como no tengo cámara digital voy a poner el esquemático...., el programa lo pongo ahora...
Andros!

Desconectado andros

  • PIC16
  • ***
  • Mensajes: 111
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #4 en: 29 de Julio de 2006, 02:26:08 »
Hola, que tal, pues después de varios días he poido seguir dedicado a esto..., aquí está el esquematico del circuito y el codigo.... Vale la pena anotar que el codigo hace parte de uno mucho mas extenso..., aquí he incluido solo cuando detecto los botones y la secuencia que simula los botones presionados.....

En la gráfica que incluyo si se fijan en las anteriores, los pines 3 y 5 corresponden a los extremos de la resistencia, el 5 corresponde al...., como llamarlo "tap", en este caso lo que hice fué colocar 5 voltios (vcc) en la entrada A1 y tierra en B1, el voltaje lo mido entre b1 y w1. Este integrado por defecto comienza en la posición central o mitad (64, son 128), por tanto el voltaje es de 2.5v, sin embargo cuando lo excito con las señales no varía este voltaje...


Nota: Las conexiones obvias del PIC no las he colocado, como vdd y vss

Listo aquí está el código.


/*PINES Y POTENCIOMETRO DIGITAL AD5220

RC0 = UP/DOWN: Si es igual a 1 entonces es incremento, si es igual a 0 decrementa.
RC1 = CLCK: Reloj, con cada flanco de bajada, la resistencia decrementa o incrementa dependiendo del estado del
     pin UP/DOWN

a = 0: Bajar resistencia.    
a = 1: Incrementar resistencia.
*/

#include <p18f252.h>
#include <stdlib.h>
#include <portb.h>
#include <delays.h>
#include <adc.h>


//CONFIGURACÍÓN DEL MICROPROCESADOR
#pragma config OSC = XT            //Oscilador Externo 1:1
#pragma config WDT = OFF         //Nada de Watch Dog Timer
#pragma config LVP = OFF         //Nada de Low Voltage protect


//PROTOTIPOS

void definicion_puertos(void);
unsigned char get_boton(void);


void main()
{
   unsigned char a = 0;

   definicion_puertos();            //definicion de entradas y salidas.
   Delay10KTCYx(100);               //Espera 1 segundo para inicializar.
   PORTC = 0x01;                  //estado inicial del programa (UP/DOWN = 1).

   while (1)                     //Cliclo infinito.
   {
      a = get_boton();            //Adquisición de botones por polling
   
      if (a == 2)               
      {
         PORTCbits.RC0 = 1;         //Coloca en up.
         PORTCbits.RC1 = 1;         //Activa el reloj.
         Delay10KTCYx (25);         //Delay de 250 milisegundos.
         PORTCbits.RC1 = 0;         //Flanco de bajadA, detecta el estado UP del potenciometro.
         Delay10KTCYx (1);         //Delay de 10 milisegundos.
      }
      
      if (a == 4)
      {
         PORTCbits.RC0 = 0;         //Coloca en down
         PORTCbits.RC1 = 1;         //Activa el flanco de subida del reloj.
         Delay10KTCYx(25);         //Delay de 250 ms
         PORTCbits.RC1 = 0;         //FLanco de bajada, detecta el estado LOW del potenciometro.
         Delay10KTCYx (1);         //Delay de 10 ms.
      }      
   }
}

void definicion_puertos()
{
   OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_1ANA_0REF, ADC_CH0 & ADC_INT_OFF); //RA0 entrada análoga, el resto digital.

//Define si los pines son de entrada o salida.
//   TRISA=0b00000011;               //Pines RA0 (AD0)y RA1 (EOM) de entrada.
   TRISC=0X00;
   TRISB=0B11100000;               //RB7:RB5 entradas de botones, RB0 entrada de ultrasonido.

//Define el estado inicial de los pines
   PORTB=0x00;
   PORTC=0x00;
//   PORTA = 0b00001100;               //real: 0b00001100........Definición del estado inicial de la interfaz con el ISD [puerto A] (PD = 1, CE = 1)
}

unsigned char get_boton()
{
   unsigned char boton = 0, temp = 0, portemp = 0;
         
   _asm
      nop      
   _endasm

   while (PORTBbits.RB7 == 0 && PORTBbits.RB6 == 0 && PORTBbits.RB5 == 0)   //Si cualquiera de ellos es activado, sale del while
   {
   _asm
      nop
   _endasm
   }
   
   Delay10KTCYx(4);                   //Delay de 40 mili segundos, antirrebote de subida
   boton = PORTB;
   boton = boton & 0b11100000;            //Máscara pa saber cual botón fué presionado.
   boton = boton >> 5;
   portemp = PORTB;
   
   PORTCbits.RC2 = 1;                  //Señalización de que el botón está presionado
   
   while (portemp != 0)               //Espera a que suelte el boton para salir de la función
   {
      portemp = PORTB;
      portemp = portemp & 0b11100000;      //De este modo no importa en que estado se encuentren los otros bits del puerto B
   }
   
   PORTCbits.RC2 = 0;                  //Borro señalización
   Delay10KTCYx(4);                   //Delay de 40 mili segundos, antirrebote de bajada
   
   return boton;
}


Espero me puedan ayudar, gracias.
Andros!

Desconectado andros

  • PIC16
  • ***
  • Mensajes: 111
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #5 en: 29 de Julio de 2006, 02:29:04 »
Me equivoqué, los pines 3 y 6 son los extremos de la resistencia (100k), el 5 es el "tap"

andros.
Andros!

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #6 en: 30 de Julio de 2006, 17:27:16 »
Hola, solo hacer una observacion, he mirado el pdf del integrado, y los pines correspondientes a los terminales del potenciometro, solo admiten voltajes positivos, por lo que no se si valdria para un control de volumen, puesto que trabajaria con señales alternas que toman valores negativos.

O quizas este equivocado.

Saludos
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado andros

  • PIC16
  • ***
  • Mensajes: 111
Re: PIC18F252 - AD5220: Control de volumen
« Respuesta #7 en: 31 de Julio de 2006, 10:46:48 »
Hola, como estás:

En este caso sí, pues estoy tomando la señal a controlar de un ISD2560...., según entiendo su salida es positiva, por lo menos no veo lo contrario en la hoja de especificaciones.


Saludos.
Andros!