Autor Tema: ayuda con 51JM128 y conversor A/D  (Leído 2123 veces)

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

Desconectado daniel185

  • PIC10
  • *
  • Mensajes: 1
ayuda con 51JM128 y conversor A/D
« en: 04 de Julio de 2010, 23:42:16 »
buenas noches tengo el siguiente inconveniente
al manejar 8 canales del converso A/D del JM128 de freescale.
los datos de la conversión de los canales análogos son muy inestable, las señales análogas son dadas por la variacion de  potenciómetros

cualquier informacion o aporte para manejar este modulo del JM128 seria de mucha ayuda

 este el la forma como tengo el programa

/* Archivos de cabecera */
#include <hidef.h> // macro para habilitar interrupciones
#include <math.h>
#include "derivative.h" // declaracion de perifericos
/* Declaracion de variables y constantes */
word dedo1=0;
word dedo2=0;
word dedo3=0;
word dedo4=0;
word dedo5=0;
word ejex=0;
word ejey=0;
word ejez=0;
word grado1=0;
word grado2=0;
word grado3=0;
word grado4=0;
word grado5=0;
unsigned long retardo=0; //parametro para hacer retardo
char i=0; //variable de iteracion
char PTXD_Config=0; //byte de inicializacion del registro PTBD
char PTXDD_Config=0; //byte de inicializacion del registro PTBDD
char PTXPE_Config=0; //byte de inicializacion del registro PTBPE
char PTXSE_Config=0; //byte de inicializacion del registro PTBSE
char PTXDS_Config=0; //byte de inicializacion del registro PTBDS
char PTXIFE_Config=0; //byte de inicializacion del registro PTBIFE
char ADCSC1_Config=0; //byte de inicializacion del registro ADCCFG
char ADCCFG_Config=0; //byte de inicializacion del registro APCTL1
char APCTL1_Config=0; //byte de inicializacion del registro APCTL1
char ADCSC2_Config=0; //byte de inicializacion del registro ADCSC2
char SCI1C1_Config=0; //byte de inicializacion del registro SCI1C1
char SCI1C2_Config=0; //byte de inicializacion del registro SCI1C2
char SCI1BD_Config=0; //byte de inicializacion del registro SCI1BD
char ESTADO,CONTROL,INTEN; //variables para conversion de la temperatura a ASCII

/* Macros y definiciones */
#define Disable_COP() SOPT1 &= 0x3F //deshabilita el COP

/* Declaracion de funciones */
void Delay(unsigned long retardo); //funcion para hacer reatrdos varios
void PTX_Init(char PTXD_Config,char PTXDD_Config,char PTXPE_Config,char PTXSE_Config,char PTXDS_Config,char PTXIFE_Config);//declare funcion que inicializa PTA
void ADC_Init(char ADCCFG_Config,char ADCSC2_Config,char APCTL1_Config,char ADCSC1_Config);//declare funcion para inicializar ADC

/******************************************************************/
/* main(): Funcion principal*/
void main(void) {
  MCGTRM = NVMCGTRM+52;
  MCGC1=0x04; //Reloj en modo FEI y divisor por 1
  MCGC2=0x00;
  MCGC4=0x22; //rango alto
  Disable_COP(); //deshabilita el COP
  PTX_Init(0x00,0x00,0x00,0x00,0x00,0x00) ;
  ADC_Init(0xE7,0x00,0x01,0x80) ; //divisor x 1, muestreo largo, 12 bits resolucion, canal 0
  EnableInterrupts; //habilita interrupciones
  for(;;) { //iteracion infinita
   
       
       ADCSC1 = 0x00;
       Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
       dedo1=ADCR;
      ADCSC1 = 0x01; //habilita otra conversion por A/D
       Delay(1000); //llama funcion de retardo: Delay
       while ((ADCSC1_COCO==0)){}
        dedo2=ADCR;
      ADCSC1 = 0x02; //habilita otra conversion por A/D
       Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
      dedo3=ADCR;
      ADCSC1 = 0x03; //habilita otra conversion por A/D
       Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
       dedo4=ADCR;
      ADCSC1 = 0x04; //habilita otra conversion por A/D
       Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
      dedo5=ADCR;
      ADCSC1 = 0x05; //habilita otra conversion por A/D
      Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
        ejex=ADCR;
      ADCSC1 = 0x06; //habilita otra conversion por A/D
       Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
       ejey=ADCR;
      ADCSC1 = 0x07; //habilita otra conversion por A/D
       Delay(1000); //llama funcion de retardo: Delay 
       while ((ADCSC1_COCO==0)){}
      ejez=ADCR;
     
     // ******************************************

      grado1=(((dedo1)*117)/10000);
      grado2=(((dedo2)*117)/10000);
      grado3=(((dedo3)*117)/10000);
      grado4=(((dedo4)*117)/10000);
      grado5=(((dedo5)*117)/10000);
     Delay(90000); //llama funcion de retardo: Delay
                             
  }
 /*   }}es necesario asegurarse de nunca abandonar el main */
}

/* Funcion para inicializar el puertos a utilizar  */
void PTX_Init(char PTXD_Config,char PTXDD_Config,char PTXPE_Config,char PTXSE_Config,char PTXDS_Config,char PTXIFE_Config) {
  PTBD=PTXD_Config; //inicialice estado pines PTB
  PTBDD=PTXDD_Config; //inicialice dirección de pines PTB
  PTBPE=PTXPE_Config; //inicialice estado de pullups PTB
  PTBSE=PTXSE_Config; //inicialice estado del slew rate PTB
  PTBDS=PTXDS_Config; //inicialice estado de drive strength PTB
  PTBIFE=PTXIFE_Config; //inicialice estado del filtro PTB
}

/*Funcion para inicializacion del ADC */
void ADC_Init(char ADCCFG_Config,char ADCSC2_Config,char APCTL1_Config,char ADCSC1_Config){
  ADCCFG=ADCCFG_Config; //inicializa registro ADCCFG del ADC
  ADCSC2=ADCSC2_Config; //inicializa registro ADCSC2 del ADC
  APCTL1=APCTL1_Config; //inicializa registro APCTL1 del ADC
  ADCSC1=ADCSC1_Config; //inicializa registro ADCSC1 del ADC
}
     
/* * Funcion Delay(): Retarda basado en una variable tipo entero */
void Delay(unsigned long retardo){
   while(retardo>0){ //llego a cero?
         retardo--; //no --> decrementa
          }
}

   


 

anything