TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Guillo512 en 29 de Junio de 2016, 22:58:20

Título: Problemas con velocidad de muestreo de ADC de PIC y MATLAB
Publicado por: Guillo512 en 29 de Junio de 2016, 22:58:20
Buenas noches, disculpen la molestia como pueden ver es mi primer post, soy nuevo tanto en el foro como en esto de programar. EStoy tratando de hacer un EMG que posea una interfaz en matlab, las frecuencias con las que trabajare van entre 20 y 500 Hz, para lograr conectarme use las librerias mpusdapi.dll ( fue todo un proceso), cuando empece a realizar pruebas con una fuente externa las señales estan todas distorsionadas(senoidal, cuadrada y triangular) y no se ven para nada bien cuando las trabajo de 200 Hz para arriba. Quisiera saber si alguno puede ayudarme o guiarme para poder muestrear y ver una señal minimo de 1KHz en matlab.

Este es el codigo que estoy utilizando que lo consegui de un ejemplo de matlab:

#include <18F4550.h>
#device ADC=10                             //Descomente ésta opción en caso de usar el ADC a 10bits
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,NOPBADEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define USB_HID_DEVICE     FALSE              //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK    //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK    //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    64                 //size to allocate for the rx endpoint 1 buffer

#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin



#include <pic18_usb.h>              //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <usb_desc_scope.h>         //descriptors del Pic USB
#include <usb.c>                    //handles usb setup tokens and get descriptor reports

               
         0xD8,0x04,           //vendor id (0x04D8 is Microchip)
         0x0B,0x00,           //product id
         0x01,0x00,           //device release number


#define  LEDV    PIN_B6
#define  LEDR    PIN_B7
#define  LED_ON  output_high
#define  LED_OFF output_low

// Direcciones de memoria válidas para PIC18F2455/2550/4455/4550 (no olvide que son la misma familia)
// Esto es con el fin de poder escribir directamente en ellos sin usar instrucciones como intermediarios.
#BYTE TRISA  = 0x0F92                           // Registro de control de E/S del puerto A
#BYTE TRISB  = 0x0F93                           // Registro de control de E/S del puerto B
#BYTE PORTA  = 0x0F80                           // Registro del puerto A
#BYTE PORTB  = 0x0F81                           // Registro del puerto B
#BYTE ADCON0  = 0x0FC2                          // Registro de control del ADC
#BYTE ADCON1  = 0x0FC1                          // Registro de control del ADC
#BYTE CMCON   = 0x0FB4                          // Registro del modulo comparador

int8 dato[4];
unsigned int16 entrada;

void main(void) {

   LED_ON(LEDV);                                //encendemos led en RB6 para indicar presencia de energia
   LED_OFF(LEDR);

   usb_init();                                  // inicializamos el USB
   usb_task();                                  // habilita periferico usb e interrupciones
   usb_wait_for_enumeration();                  // esperamos hasta que el PicUSB sea configurado por el host

   LED_OFF(LEDV);
   LED_ON(LEDR);                                // encendemos led en RB7 al establecer contacto con la PC

   TRISA  = 0x0FF;                              // Se declara el puerto A como entradas (instrucción opcional)
   TRISB  = 0x00;                               // Se declara el puerto B como salidas (instrucción opcional)
   ADCON1 = 0x0F;                               // Se configura al ADC para entradas digitales (apagar el ADC)
   CMCON  = 0x07;                               // Se configuran los comparadores para entradas digitales (apagar los comparadores)

    //***************  CONFIGURACIÓN DEL ADC   **************   
   setup_comparator(NC_NC_NC_NC);
   setup_adc_ports(AN0);                     // Se selecciona AN0 como entrada analógica y las demás como digitales
   setup_adc( VSS_VDD );                     // Se indica el rango de voltaje que tendrá la entrada análoga
   set_adc_channel( 0 );                     // Indica de que pin se hará la conversion
   setup_adc( ADC_CLOCK_div_8 );             // Indica la frecuencia que se usará el reloj del ADC ADC_CLOCK_DIV_16

   while (TRUE)
   {
      if(usb_enumerated())                      // si el Pic está configurado via USB
      {
         if (usb_kbhit(1))                      // si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, dato, 4);        // cojemos el paquete de tamaño 8bytes del EP1 y almacenamos en dato
            portb = dato[0];                    // Se muestra al byte completo en el puerto B
            dato[1] = porta;                    // Se lee el puerto A y se almacena en el vector
            read_adc(ADC_START_ONLY);
            while (bit_test(ADCON0,1));
            entrada = read_adc(ADC_READ_ONLY);
            dato[2]= make8(entrada,0);
            dato[3] = make8(entrada,1);
            usb_put_packet(1, dato, 4, USB_DTS_TOGGLE); //y enviamos el mismo paquete de tamaño 4bytes del EP1 al PC
         }
       }
    }
}




Saludos y gracias.