Turulo USB09

35
Turulo USB09_LabVIEW 8.6 Publicado por adrianjpc Etiquetas: microcontroladores En este proyecto se presenta la comunicación USB de tipo Bulk Transfer utilizando labVIEW 8.6 y la tarjeta de adquisición Turulo USB09. La comunicación se realiza a través de una librería picusb.vi . El puente que establece la comunicación entre el Microcontrolador y la PC se realiza mediante las librerías USB del software CCS C Compiler y el driver de la tarjeta de adquisicion para Microsoft Windows XP y Windows 7. La pequeña práctica se basara el control de encendido de leds y relevadores de la tarjeta Turulo, dichas salidas son del puerto D (PORTD), estas salidas se manipularan utilizando botones en labVIEW a traves de la libreria picusb.vi. También al mismo tiempo se adquiere una señal analógica del puerto AN4 de la tarjeta Turulo, los datos capturados se enviaran a labview y seran graficados. A continuación seguimos todos los pasos para echar andar nuestro proyecto utilizando labview. 1.-Tener la Turulo USB09.

Transcript of Turulo USB09

Turulo USB09_LabVIEW 8.6

Publicado por adrianjpc Etiquetas: microcontroladores

En este proyecto se presenta la comunicación USB de tipo Bulk Transfer utilizando labVIEW 8.6 y la tarjeta de adquisición Turulo USB09. La comunicación se realiza a través de una librería picusb.vi . El puente que establece la comunicación entre el Microcontrolador y la PC se realiza mediante las librerías USB del software CCS C Compiler y el driver de la tarjeta de adquisicion  para Microsoft Windows XP y Windows 7.  

La pequeña práctica se basara el control de encendido de leds y relevadores de la tarjeta Turulo, dichas salidas son del puerto D (PORTD), estas salidas se manipularan  utilizando botones en labVIEW a traves de la libreria picusb.vi. También al mismo tiempo se adquiere una señal analógica del puerto AN4 de la tarjeta Turulo, los datos capturados se enviaran a labview y seran graficados.

A continuación seguimos todos los pasos para echar andar nuestro proyecto utilizando labview.

1.-Tener la Turulo USB09.

En la siguiente figura se muestra el diagrama de como funciona los reguladores de voltaje, los hay

interno y externos. Nosotros utilizaremos el regulador interno, para ello conectamos el capacitor en la

entrada Vusb .

El regulador interno usb lo habilitamos con el siguiente codigo en CCS:

#fuse VREGEN

Configuración de Oscilador

Otro aspecto muy importante es la configuración de oscilador en los PIC's de la familia 18Fxx5x que

son los que soportan el USB 2.0( datasheet 18F2455-2550-4455-4550 ).

La configuracion del oscilador

nos indica que se debe obtener una entrada de 4Mhz independientemente de cualquier crystal que se

este utilizando.

El módulo USB Clock Source tiene a su entrada un PLL Prescaler, o sea un divisor de frecuencia. En

cada una de sus salidas vamos a tener FOSC dividida por 1, 2, 3, 4, 5, 6, 10 ó 12. Y mediante PLLDIV

que no es mas que un Multiplexor vamos a seleccionar la que deseamos usar.

Así si nuestro cristal es de 20 Mhz y en PLLDIV colocamos un 100 estaremos dividiendo por 5 el valor

de FOSC con lo que tendremos 4 Mhz a la salida del MUX. Si por el contrario el cristal es de 4 Mhz y en

PLLDIV colocamos un 000 entonces dividiremos por 1 FOSC con lo que tendremos también 4 Mhz a la

salida del MUX.

Esta salida del MUX es lo que utilizamos para inyectársela al PLL de 96 Mhz. Si le metemos 4 Mhz él

genera 96 Mhz. Es esta capacidad de pasar de 4 Mhz a 96 Mhz la que nos da la posibilidad de usar un

montón de cristales distintos.

Pero 96 Mhz es el doble de lo que nos hace falta para el USB que son 48 Mhz. Asi que inmediatamente

después tenemos que tener, y tenemos, un divisor por 2 que es el segundo camino por el que

llegamos a USBDIV y en este caso le pondremos un 1 para usar la señal proveniente del PLL

Observemos que además de inyectar la señal oscilante en USBDIV también se conecta la señal del PLL

a 96 Mhz en un Postscaler, otro divisor, en este caso por 2, 3, 4 ó 6 y cuyas señales van al CPUDIV.

O sea que podemos generar una señal de reloj para nuestro PIC, no para el USB sino para la velocidad

de ejecución de nuestro programa tomándola del PLL y que puede ser de 16 Mhz, 24 Mhz, 32 Mhz ó 48

Mhz.

Pero además la señal original llegaba en paralelo al Oscilator Postcaler, otro divisor más, que de forma

directa, sin pasar por el módulo PLL nos divide la frecuencia original del cristal por 1, 2, 3 ó 4 y que

también va a parar al CPUDIV pero desde otro origen. Con este módulo podemos obtener otra gama

de frecuencias distinta para hacer correr el programa.

Cual de ambos CPUDIV vamos a utilizar lo seleccionamos con el switch FOSC3:FOSC0 que es de

donde sacaremos la definitiva frecuencia de ejecución de programas.

Por último también tenemos disponible una entrada proveniente del Primary Clock y que dividida por

4 llega también a FSEN y podemos utilizarla en lugar de la que le llega desde el canal directo/PLL.

Como puedes ver es toda una maravilla cómo esta montado este tema de los osciladores, sobre todo

por lo que respecta a las inmensas capacidades que tiene para hacer correr nuestro PIC a decenas de

velocidades distintas siendo capaz, al mismo tiempo de tener disponibles los 48 Mhz imprescindibles

para el USB 2.0.

Por lo tanto nuestro circuito o configuración quedaria de la siguiente manera:

Realizado en CCS C :  

#fuses

HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPU

DIV1,VREGEN

2-Firmware Turulo USB09 realizado en CCS C Compiler.

El firmware es un pequeño código de bajo nivel que se realiza para poder controlar entradas y salidas

dependiendo de las necesidades del usuario. Además este pequeño código tendrá el objetivo de poder

entenderse con la computadora o PC, realizando así la función de avisarte en el momento que ha sido

conectado y detectado por la PC. En ese momento el firmware estará en espera de cualquier dato que

se esté enviando por la PC atreves de cualquier software que se esté utilizando, en nuestro caso

utilizaremos LabVIEW 8.6. Acontinuación se muestra en un pequeño diagrama a bloques de lo que

hace el firmware.

Descarga el firmware (PicUSB)

Despues de haberlo descargado pasamos a compilarlo y observaremos que genera 4 warning, no se

espanten esto es normal.

Personalizando nuestro dispositivo o los descriptores

La personalizacion del dispositivo se lleva acabo dentro del descriptor PicUSB.h

//device descriptor

char const USB_DEVICE_DESC[] ={

USB_DESC_DEVICE_LEN, //the length of this report

0x01, //constant DEVICE (0x01)

0x10,0x01, //usb version in bcd

0x00, //class code (if 0, interface defines class. FF is vendor defined)

0x00, //subclass code

0x00, //protocol code

USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)

0xD8,0x04, //vendor id (0x04D8 is Microchip)

0x10,0x00, //product id (modificable)

0x01,0x00, //device release number

0x01, //index of string description of manufacturer. therefore we point to string_1 array (see

below)

0x02, //index of string descriptor of the product

0x00, //index of string descriptor of serial number

USB_NUM_CONFIGURATIONS //number of possible configurations

};

...

... Hacer notar que la numeración hexadecimal de la descripción del VID / PID va al revés, es decir,

el primero número hex. será el último y viceversa.

...

...

char const USB_STRING_DESC[]={

//string 0

4, //length of string index

USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)

0x09,0x04, //Microsoft Defined for US-English

//string 1 --> la compañia del producto ???

8, //length of string index

USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)

'J',0,

'A',0,

'P',0,

'C',0,

//string 2 --> nombre del dispositivo

24, //length of string index

USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)

'J',0,

'A',0,

'P',0,

'C',0,

' ',0,

'P',0,

'i',0,

'c',0,

'U',0,

'S',0,

'B',0

}; Al conectarse el ordenador estaria reconociendo nuestro dispositivo con el nombre con que se

configuro o se personalizo. Apareceria de la siguiente manera:

Para que nuestro dispositivo se comunique con el ordenador lo primero que tenemos que hacer es

configurar nuestro driver. Para ello abrimos el archivo mchpusb.inf y comenzamos a editarlo a nuestro

gusto.

Descarga el drivers(PicUSB-Driver)

[Version]

Signature="$WINDOWS NT$"

Class=%ClassName%

ClassGuid={4D36E911-E325-11CE-BFC1-08002BE10318}

Provider=%MFGNAME%

DriverVer=03/04/2009,1.1.0.0

CatalogFile=picusb.cat

[DestinationDirs]

DefaultDestDir = 12

PicUSB.ClassCopyFiles = 11

;---------------------------------------------------------------

; Class installation sections

;---------------------------------------------------------------

[ClassInstall32]

AddReg=PicUSB.ClassReg

CopyFiles=PicUSB.ClassCopyFiles

[PicUSB.ClassReg]

HKR,,,0,%ClassName%

HKR,,Class,,%ClassDesc%

HKR,,Icon,,11

HKR,,Installer32,,"mchpusb.dll,PicUSBClassInstaller"

[PicUSB.ClassCopyFiles]

mchpusb.dll

;---------------------------------------------------------------

; Device Install Section

;---------------------------------------------------------------

[Manufacturer]

%MFGNAME%=Standard

[Standard]

%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_0010 (modificable)

[SourceDisksNames]

1 = %INSTDISK%,,,""

[SourceDisksFiles]

mchpusb.sys = 1,,

wdmstub.sys = 1,,

mchpusb.dll = 1,,

;---------------------------------------------------------------

; Windows 2000/XP Sections

;---------------------------------------------------------------

[DriverInstall.NT]

CopyFiles=DriverCopyFiles

[DriverCopyFiles]

mchpusb.sys

[DriverInstall.NT.Services]

AddService = PicUSB, 2, DriverService

[DriverService]

DisplayName = %SVCDESC%

ServiceType = 1 ; SERVICE_KERNEL_DRIVER

StartType = 3 ; SERVICE_DEMAND_START

ErrorControl = 1 ; SERVICE_ERROR_NORMAL

ServiceBinary = %12%\mchpusb.sys

LoadOrderGroup = Extended Base

;---------------------------------------------------------------

; Windows 98/Me Sections

;---------------------------------------------------------------

[DriverInstall]

AddReg=DriverAddReg

CopyFiles=DriverCopyFiles,StubCopyFiles

DriverVer=09/26/2009,1.0.0.0

[DriverAddReg]

HKR,,DevLoader,,*ntkern

HKR,,NTMPDriver,,"wdmstub.sys,mchpusb.sys"

[StubCopyFiles]

wdmstub.sys

;---------------------------------------------------------------

;String Definitions (modificable)

;---------------------------------------------------------------

[Strings]

MFGNAME="JAPC PicUSB"

INSTDISK="PicUSB Device Driver Disc"

DESCRIPTION="PicUSB-LabVIEW"

SVCDESC="PicUSB Device Driver"

ClassName="TARJETA DE ADQUISICION"

ClassDesc="PicUSB Sample Device"

Tanto como VID y PID deven tener el mismo numero hexadecimal que el firmware (Descriptores) del

dispositivo para que entre la PC y el Dispositivo se establesca la comunicacion.

Cuando conectemos por primera vez nuestro dipositivo nos preguntara sobre el driver espesifico del

dispositivo, le damos la ruta en donde se encuentra nuestro drivers previamente personalisado.

Le damos finalizar y nos vamos administrador de dispositivo para si nuestro dispositivo quedo bien

configurado por el ordenador. Aparecera con el nombre Tarjeta de adquisción (PicUSB-LabVIEW).

Le damos doble clic para ver la informacion del dispositivo, y saber si fue configurado con exito.

Observamos en el cuadro de texto que nos indica que Este dispositivo esta funcionando

correctamente. Ahora es momento de enviar y recibir informacion del dipositivo PicUSB desde la

plataforma LabVIEW.

3. Envió y Recepción de datos desde LabVIEW

La programación en labVIEW (PicUSB-LabVIEW) se realizo a través de un subvi (picusb) que realize

para poder manipular facilmente el dispositivo usb. El subvi creado se muestra en la siguiente figura,

donde muestra la configuracion que se tiene que realizar.

Descarga el subvi ( picusb)

Para tener agregado este modulo(SubVI) a labVIEW, debe copiarse a la siguente direccion

C:\Archivos de programa\National Instruments\LabVIEW 8.6\user.lib\picusb

Cuando hayamos realizado esto, nuestro modulo aparecerá agregado en labview.

El subi creado tienes las siguientes entradas:

Vid_Pid: Es el nombre del vendedor y producto con el que fue configurado nuestro dispositivo, en

nuestro caso: "vid_0X04d8&pid_0010"

N.bytes a escribir: Nos indica el numero de bytes o el tamño del dato que vamos a transferir.

Dato a Enviar: Indica el dato que se va a enviar.

Retardo de entrada y salida: Nos indica a cada cuanto tiempo haremos la capturar de datos. El

tiempo tiene que indicarse en milisegundos.

N.bytes a Recibir: Aqui indicaremos el tamaño de datos que estamos enviando del dispositivo usb

(microcontrolador o PicUSB).

Dato Recibido: En esta parte es donde capturaremos los datos que se estan enviando del dispocitivo

y lo visualisamos en un grafica si estamos enviando datos de temperatura o el termometro que tiene

labview, esto depende de lo que se este controlando.

En la siguiente figura se muestra un ejemplo como utilize esta pequeña libreria o subvi que diseñe, en

una programacion estructura de labview o diagrama a bloque .

La programacion virtual (Panel Frontal) del proyecto se observa en la siguiente figura:

En la figura, los botones que se muestran son para encender y apagar los leds que se mostro en el

diagrama de circuito del dispositivo o tambien nos puede servir para accionar valvulas, motores o

cualquier carga. y la grafica para ver como va cambiando una señal analogica con respecto al tiempo.

Esta señal puede derivar de cualquier sensor analogico.

Descargar el proyecto completo (Picusb-LabVIEW)

El proyecto completo lo podemos observar detalladamente en el video que publique en youtube.

Con esto se presento una metodología que permite la comunicación entre un microcontrolador

PIC18F4550 y LabVIEW para tareas de adquisición de datos. Los resultados obtenidos demuestran que

la metodología implementada funciona perfectamente, se logra trasferir datos de alta velocidad. Con

esta técnica se pretende que estudiante e investigadores puedan construir una tarjeta de adquisición

de datos y que pueda implementarse para tareas de simulación, supervisión y control.

DAQ Turulo USB09 con Windows 7 de 32 y 64bits

Publicado por adrianjpc

        

"Al conectar por primera la Turulo USB09 con windows seven, te aparecera un mensaje de

instalacion  empieza a buscarlo dentro de la base de datos de drivers, y como es una aplicación echa

por nosotros jamás la encontrara y nunca funcionara, por lo que sugiero seguir estos pasos".

Al momento de conectar dispositivo usb en windows7 32&64bits nos aparecera un mensaje "

instalando drivers".

En este caso el LED de mi tarjeta de adquisición se pone en color ROJO debido a que no ha sido

sincronizado con la computadora con win7.

Despues de un tiempo nos aparce la siguiente imagen.

 

En donde nos informa, que no pudo ser instalado el driver o controlador del dispositivo.. despues que

nos aparesca esto, no se espanten!!!, ya que windows 7 no lo encontro dentro de su base de datos.

Por lo que se deve agregar personalmente, esto es; ir Administrador de Dispositivo, presionamos

click derecho y le damos actualizar software de controlador.

Cuando le hayamos dado eso, nos aparecerá la siguiente ventana..

Damos click en Buscar el software de controlador en el equipo... Buscamos la direccion en donde

se encuentra los drivers para windows7 32&64. Descargalo aqui.

Empezamos a instalarlo.....

Despues de esto nos aparece una advertencia!! en donde nos informa que windows no pudo verificar

la edición del drivers..  y luego nos aparece dos opciones: 1- no instalar el controlador 2- instalar este

drivers de todas formas...  elejimos la opción 2.

Terminado la instalación de nuestra tarjeta de adquisición que yo la he bautizado con el nombre uADQ.

El color del LED pasa a color Azul indicando que se logro conectar con la computadora. 

Nos vamos en Administrador de Dispositivo y verificamos si nuestra tarjeta de adquisición se

sincronizo  con exito!.

Eso es todoo!! tenemos corriendo nuestra uADQ en Windows 7 32&64

Turulo USB09

Publicado por adrianjpc

La primera tarjeta Turulo USB09 con conexión USB Full Speed, orientada a sistema de control

avanzado.

Introducción

La tarjeta de adquisición de datos Turulo USB09, está diseñada utilizando el microprocesador

PIC18F4550 de microchip, para adquirir datos por el puerto USB del computador, esto permite hacerla

esencial y practica para las nuevas generaciones de computadoras, con son las laptop. La tarjeta de

adquisición puede ser utilizada por diferentes software en la rama de la electrónica y computación,

como Visual C++, labVIEW y Matlab.

Información General

La Turulo USB09 dispone de 8 puertos E/S, 4 salidas utilizando relevadores para control de sistema de

carga (Electrobalbulas, Motores AC,etc) , 6 Entrada Analógicas de 10 bits, 2 salidas de modulación de

ancho de pulso (PWM), Conexión USB y una entrada de alimentación externa de 9V. La Turulo USB09

cuenta con una librería en LabVIEW llamado USB09 para poder manipular la tarjeta de adquisición de

datos, al antojo del usuario.

Especificaciones

1. Microcontrolador PIC18f4550

2. Voltaje de funcionamiento (nivel lógico) 5 V /100mA

3. Entrada de voltaje (recomendado) 7-12 V

4. De voltaje de entrada (los límites) 06/20 V

5. Digital I / O Pins 3( 2 de las cuales proporcionar una salida PWM)

6. Pines de entrada analógica 4 (AN4,AN5,AN6,AN7)

7. Pines de entrada digitales 8(B3,B2,B1,B0,A0,A1,A2,A3)

8. Pines de salidas digitales 4(D0,D1,D2,D3)

9. Pines de control de carga 4(D4,D5,D6,D7)

10. Selector de voltaje (1.USB , 2 J. Power )

11. Botones Botloader (Reset, B4)

12. DC Corriente de pines I / O 40 mA

13. Frecuencia máxima de reloj 40Mhz. Hasta 10 MIPS.

14. Hasta 3968 bytes de RAM y 1KBytes de EEPROM

15. Velocidad del Reloj 20 MHz

16. Dimensiones 5cm x 14cm

Energía 

la Turulo USB09 puede ser alimentado a través de la conexión USB con 5V/100mA o por una

alimentación externa regulada a 5V/500mA, la fuente de alimentación se selecciona a través del

switch selector de voltaje. En el conector Jack Power no debes utilizar más de 12V, el regulador de

voltaje se puede sobrecalentar y dañar la placa. El rango recomendado es de 7 a 12 voltios. En cuanto

a las entradas y salidas digitales, necesitan de una alimentación externa de 5 o 9V dependiendo de la

alimentación del circuito que se tenga que controlar,esto se realiza con el objetivo de no dañar la

tarjeta en caso de cortos. si el circuito a controlar es muy sencillo se puede utilizar la salida de

alimentación que tiene la tarjeta.

Correccion del error de lectura no constante by HERRERA

Publicado por adrianjpc

Gracias al amigo SUPER_HERRERA se logro corregir el error de lectura que tenia todos

los compañeros de este blog.. Espero y les sea de mucha ayuda.

Comparte el codigo con nosotros:

#include 18F4550.h

#DEVICE ADC=8

#fuses

HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN

#use delay(clock=48000000)

#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 1 //size to allocate for the tx endpoint 1 buffer

#define USB_EP1_RX_SIZE 3 //size to allocate for the rx endpoint 1 buffer

#include //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver

#include //Configuración del USB y los descriptores para este dispositivo

#include //handles usb setup tokens and get descriptor reports

#define LOADER_END 0x7FF

#define LOADER_SIZE 0x6FF

#build(reset=LOADER_END+1, interrupt=LOADER_END+9)

#org 0, LOADER_END {} // nothing will replace the bootloader memory space

// END OF bootloader definition

//Asignacion de variables

#define LEDV PIN_D0

#define LEDR PIN_D1

#define LED_ON output_high

#define LED_OFF output_low

#define modo recibe[0]

#define param recibe[1]

#define Temperatura envia[0]

void main(void)

{

int8 recibe[2];

int8 adc[1];

set_tris_d(0x00); //Configuracion para el puerto D como salida

output_d(0x00); //Limpiamos el puerto D

setup_adc_ports(AN0|VSS_VDD);

setup_adc(ADC_CLOCK_DIV_2);

set_adc_channel(0);

delay_us(10);

LED_ON(LEDV); //Apagamos el led Rojo

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

delay_ms(50);

LED_OFF(LEDV); //encendemos led verde

while (TRUE)

{

if(usb_enumerated()) //Si el PicUSB está configurado

{

salto:

if (usb_kbhit(1)) //Si el endpoint de salida contiene datos del host

{

usb_get_packet(1, recibe, 2); //Cachamos el paquete de tamaño 2bytes del EP1 y

almacenamos en recibe

if (modo==1)//modo salida digital d1,d2,d3,d4,d5,d6,d7,d8

{

output_d(param); //El dato param recibido lo mandamos al puerto o registro d

}

else if(modo==2)//modo analogico temperatura

{

adc[0] = read_adc();

delay_us(10);

if(usb_put_packet(1,adc,1,USB_DTS_TOGGLE)); //enviamos el paquete de tamaño

1byte del EP1 al PC

{ output_toggle(PIN_D0); }

delay_ms(32);

goto salto;

}

else if(modo==4)//Todo al mismo tiempo

{

adc[0] = read_adc();

delay_us(10);

usb_put_packet(1,adc,1,USB_DTS_TOGGLE);

output_d(param);

delay_ms(32);

}

else

goto salto;

}

}

}

}