TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: Atenea en 25 de Febrero de 2015, 14:13:27
-
Qué tal!! Estoy viendo la manera de poder muestrear ocho entradas de voltaje variable al dspic33fj32mc204 y de acuerdo al valor de voltaje realizar un evento. Realicé mi configuración ADC pero aún no sé como manejarla mediante "barridos" con ayuda del timer. Debo leer una entrada por vez y en orden para ver cuál a variado y dependiendo de eso realizar otra acción. ¿Cómo hago esas lecturas del ADC con el timer?
Les agradecería su ayuda infinitamente :-/
Saludos :)
-
esto te puede servir y con poca modificacion llegar a los 8 canales:
Sin DMA:
http://embeddedcodesource.com/developer/microchip_technology_59/ce121__adc_channel_scanning
Con DMA:
http://embeddedcodesource.com/developer/microchip_technology_59/ce120__adc_channel_scanning
-
En verdad muy agradecida KILLERJC, trabajaré en base a esa progra haciendo las modificaciones respectivas e iré comentando el desarrollo del proyecto conjuntamente con las dudas que se aparezcan.
De nuevo, gracias :-/
-
Hola a todos, luego de implementar el muestreador con 4 canales, quería asegurarme de que obtuviera las lecturas que ingreso sean de los voltajes ingresados. Cómo hago la conversión con el valor directo de ADC1BUFx??
El ADC es de 10 bits.
Esta es la progra para la obtención de datos:
double canal1,canal2, canal3, canal4;
int scanCounter = 0;
int sampleCounter = 0;
double x,a;
void __attribute__((interrupt, no_auto_psv)) _ADC1Interrupt(void) {
switch (scanCounter) {
case 0:
canal1= ADC1BUF0;
printf("Primer canal \n");
__delay32(10000000); //500 ms
printf("%f \n", canal1);
__delay32(10000000); //500 ms
break;
case 1:
canal2 = ADC1BUF1;
printf("Segundo canal \n");
__delay32(10000000); //500 ms
printf("%f \n", canal2);
__delay32(10000000); //500 ms
break;
case 2:
canal3 = ADC1BUF2;
printf("Tercer canal \n");
__delay32(10000000); //500 ms
printf("%f \n", canal3);
__delay32(10000000); //500 ms
break;
case 3:
canal4 = ADC1BUF3;
printf("Cuarto canal \n");
__delay32(10000000); //500 ms
printf("%f \n", canal4);
__delay32(10000000); //500 ms
break;
default:
break;
}
scanCounter++;
if (scanCounter == NUM_CHS2SCAN) {
scanCounter = 0;
sampleCounter++;
}
IFS0bits.AD1IF = 0; // Clear the ADC1 Interrupt Flag
}
Los valores que imprimen son: 5184.0000, 62912.0000, 58944.0000, 13056.0000
Y los voltajes que marcan los voltímetros son 2.90, 2.30, 2.00 y 3.5
Qué significaría ese valor si no es el nivel de escalón??
Alguien me puede dar una mano?? Les agradecería mucho. :P
Saludos :D
-
Te lo respondi por MP, tenes que usar un float que te permite numeros con coma
float canal1
canal1=(float)(ADC1BUF0*5)/1023;
printf("%.2f", canal1);
Por otra parte siempre deberias de leer ADC1BUF0 ya que este seria tu ultimo valor.
-
Sí, bueno lo había cambiado para que no me salieran warning pero igual compila ahora que los dejé todos a float xD ahora me incomoda más los valores que lee para poder convertirlos :?