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.