Qué tal compañeros del foro, buenas noches.
Antes que nada describo las herramientas que estoy usando:
* Microcontrolador: dsPIC33FJ12MC202
* Compilador: CCS Compiller 4.104
* Simulador: Proteus 7.7 SP2
El objetivo al que quiero llegar es a poder realizar un muestreo simultaneo en los canales AN0 y AN1, y poder convertir los valores en un valor de voltaje, para finalmente enviar los valores por el puerto serie.
Hasta dónde he leído en el datasheet, sé que tengo que configurar el bit SIMSAM del AD1CON1 para poder efectuar el muestreo.
De momento el programa que tengo es el siguiente:
La verdad estoy un poco perdido en como efectuar el muestreo simultaneo, y de dónde y como se leen los valores una vez obtenidos. Lo poco que tengo ha sido leer y leer
ya que en la red no hay muchos ejemplos y los pocos que hay nadie responde con una respuesta muy concreta.
Anexo simulación.
Sin más de momento espero alguien me pueda echar una mano GRACIAS!!.
Antes que nada describo las herramientas que estoy usando:
* Microcontrolador: dsPIC33FJ12MC202
* Compilador: CCS Compiller 4.104
* Simulador: Proteus 7.7 SP2
El objetivo al que quiero llegar es a poder realizar un muestreo simultaneo en los canales AN0 y AN1, y poder convertir los valores en un valor de voltaje, para finalmente enviar los valores por el puerto serie.
Hasta dónde he leído en el datasheet, sé que tengo que configurar el bit SIMSAM del AD1CON1 para poder efectuar el muestreo.
De momento el programa que tengo es el siguiente:
Código:
#INCLUDE <33FJ12MC202.H>
#DEVICE adc=10 // Se incluyó esta directiva
#USE DELAY(CLOCK=80M) // En base a esta Fosc el compilador maneja las instrucciones
// que usan recursos de tiempo, como la comunicación serial RS232
#USE RS232(BAUD=9600,XMIT=PIN_B6,RCV=PIN_B7) // Terminales RP6 y RP7
#FUSES HS, PR_PLL, NOWDT // El PLL se programa en base a un cristal principal
// externo
//********************************** REGISTROS *********************************
#WORD M = 0x0746 // Factor M para la configuración del PLL
#WORD IFS0 = 0x0084 // Registro que contiene AD1IF
#WORD AD1CON1 = 0x0320 // Registro que contiene la bandera de fin
// conversion del ADC
#WORD AD1CON2 = 0x0322 // Registro para configurar muestreo simultaneo
#WORD CLKDIV = 0x0744 // Registro para configurar divisor de reloj
//********************* CONFIGURACIÓN DE BITS DE REGISTROS *********************
// Bits de factor M
#BIT PLLFBD_0 = M.0
#BIT PLLFBD_1 = M.1
#BIT PLLFBD_2 = M.2
#BIT PLLFBD_3 = M.3
#BIT PLLFBD_4 = M.4
#BIT PLLFBD_5 = M.5
#BIT PLLFBD_6 = M.6
#BIT PLLFBD_7 = M.7
#BIT PLLFBD_8 = M.8
// Registro CLKDIV
#BIT DOZE_14 = CLKDIV.14
#BIT DOZE_13 = CLKDIV.13
#BIT DOZE_12 = CLKDIV.12
// Registro IFS0
#BIT AD1IF = IFS0.13
// Registro AD1CON1
#BIT DONE = AD1CON1.13 // Bit para fin de conversión
// Registro AD1CON2
#BIT CPHS_8 = AD1CON2.8 // Se configuran CH0 y CH1 para muestra simultanea
#BIT CPHS_9 = AD1CON2.9 // Se configuran CH0 y CH1 para muestra simultanea
//#BIT ASAM = AD1CON2.2 // Muestreo se hace inmediatamente despues de la
// última conversión
#BIT SIMSAM = AD1CON1.3
//************************** DECLARACIÓN DE VARIABLES **************************
char c=0;
int16 valor;
float V1=0.0, V2=0.0;
//***************************** PROGRAMA PRINCIPAL *****************************
MAIN(){
//*************************** CONFIGURACIÓN DEL dsPIC **************************
// Fcy=(1/2)*((Fin*M)/(N1*N2))=(1/2)*((20MHz*32)/(2*4))= 40 MIPS
// M = 32 --> Se configura
// N1 = 2 --> Valor por defecto
// N2 = 4 --> Valor por defecto
// Fin= 20 MHz --> Se selecciona este valor, por ser comercial
// Valor binario 000011110 --> Valor decimal 32 cargado
PLLFBD_8 = 0;//----||||||||| al registro PLLDIV<8:0>
PLLFBD_7 = 0;//-----||||||||
PLLFBD_6 = 0;//------|||||||
PLLFBD_5 = 0;//-------||||||
PLLFBD_4 = 1;//--------|||||
PLLFBD_3 = 1;//---------||||
PLLFBD_2 = 1;//----------|||
PLLFBD_1 = 1;//-----------||
PLLFBD_0 = 0;//------------|
// Se configuran los canales AN0 y AN1 con los bits CHPS<1:0> para un
// muestreo simultaneo
CPHS_9=0;
CPHS_8=1;
// Se activca el muestreo simultaneo
SIMSAM=1;
set_tris_a(0b11111); // RA0 a RA4 como entradas
setup_adc_ports(VSS_VDD|sAN0|sAN1); // Se configuran los puertos análogos
setup_adc(ADC_CLOCK_DIV_8); // TAD = 100 ns
//*****************************************************************************
while(1){
set_adc_channel(0);
delay_us(1); // TSAMP >= 2TAD, 2TAD = 200 ns
valor=read_adc();
V1=(3.6/1024.0)*valor;
set_adc_channel(1);
delay_us(1);
valor=read_adc();
V2=(3.6/1024.0)*valor;
printf("V1 = %f V", V1);
printf("V2 = %f V", V2);
delay_ms(500); // Para que se puedan visualiar detenidamente los valores
// el la terminal virtual mientras manipulas los potenciómetros.
}
}
La verdad estoy un poco perdido en como efectuar el muestreo simultaneo, y de dónde y como se leen los valores una vez obtenidos. Lo poco que tengo ha sido leer y leer
Anexo simulación.
Sin más de momento espero alguien me pueda echar una mano GRACIAS!!.