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
}
}