Consultar ensayos de calidad
Explicación del programa desarrollado en MikroCExplicación del programa desarrollado en MikroC
A continuación explicaré, de acuerdo al orden indicado aquí arriba, las funciones secundarias esenciales para poder manipular correctamente al LM629. LM629_Rd_Byte Esta función lo que hace es, primero, configurar los 8 bits LM629_Wr_Byte Esta función, contraria a la lectura de un byte, configura los 8 bits LM629_StatusByte Esta función se dedica a la lectura LM629_BusyCheck Esta función verifica el estado LM629_Cmd Esta función se dedica a la escritura de un comando en el LM629. Requiere de un dato “cmd” que es aquel que contiene el comando respectivo LM629_Wr_Word Esta función escribe una “word” (16 bits = 2 bytes, un byte alto y un byte bajo, en este orden). Requiere de parámetros el byte alto y el byte bajo. Primero se configura el DATABUS LM629_Init En la nota de aplicación AN-693, se muestra una guía para la programación de la inicialización LM629_SetPID Con esta función se configuran los parámetros para el filtro PID, la hoja de datos llama “parámetros”, a los coeficientes kp, ki, kd e iL (límite de integración). Registro Selección del intervalo de muestreo Aquí está la función para configurar los parámetros Sólo que en nuestra función, definimos los parámetros ki, kd, e iL. Y el intervalo de muestreo LM629_Trajectory Con esta función se define la trayectoria: posición, velocidad y aceleración. Acontinuación, muestro el registro de la TRAYECTORIA, que se necesitará configurar. Se ocupó la tabla que viene en la nota de aplicación, para programar trayectoria en el LM629. De igual manera, se programaran aceleración, velocidad y posición. He aquí el código en MikroC. LM629_StartMotion y LM629_TrajectoryComplete La primera función inicia la trayectoria, previamente, programada en el LM629. Con el comando STT proporcionado en el set de instrucciones de las hojas de datos. La segunda función verifica si la trayectoria fue completada. PIC_Init Esta función inicializa al microcontrolador PIC18F4520. Función MAIN MATERIAL OCUPADO EN ESTA PRÁCTICA (Referencias Motor con reducción de 100:1 y encoder incremental en cuadratura de efecto hall de 16 cuentas por revolución (16*4). Revisen la descripción y las especificaciones https://www.pololu.com/catalog/product/1446 Elementos electrónicos. PIC18F4520 Cristal de 10.00 MHz LM629N-6 Oscilador de 6.00 MHz. Para driver de puente en H. * Compuerta NAND (4 compuertas, 2 entradas) – SN74LS00N (Hoja de datos: https://www.ti.com/lit/ds/symlink/sn74ls00.pdf) * Transistores BJT PNP 2N4403 (Hoja de datos:https://www.datasheetcatalog.org/datasheet/fairchild/2N4403.pdf) El mismo puente en H: * con optoacoplador dual salida a transistor (MCT62: https://www.fairchildsemi.com/ds/MC/MCT6.pdf) y * E-MOSFET de enriquecimiento (IRF9630 e IRF511): https://www.bristolwatch.com/pdf/irf9630.pdf https://www.qsl.net/n4xy/PDFs/Semiconductor_Data_Sheets/irf-510.pdf Intefaz USB-Serial 5V (https://www.robodacta.mx/index.php?dispatch=products.view&product_id=29934) Explicación y cálculos Resolución total, de acuerdo a las especificaciones del fabricante R = 16*102.083*4 = 6533 cuentas/revolución. En la práctica, y experimentando con valores mayores a este, se decide que R = 6560. El tiempo de muestreo Ts=20486.00 MHz=341μs Intervalo de muestreo Tiempo-Derivativo: Se propone seleccionar un ds = 1, entonces: Td=dsaˆ™Ts=1aˆ™341μs=341μs Con respecto al programa, ds = 1, equivale a poner en el byte más significativo, -Respecto a la trayectoria- Si checan la hoja de datos del LM628/LM629, en la pág. 15, se describe el registro de control de trayectoria. Si observaron en el programa, después de ingresar el comando LTRJ, escribí la word 0x002A, esto quiere decir que operará el LM629 en modo posición, se cargarán la aceleración, velocidad y posición (y ninguno de estos son relativos, de acuerdo al registro de control de trayectoria). Los bits 8 a 10 se ocupan para detener el motor“manualmente”. Dado que no los ocupo, al estar convergiendo a la trayectoria, el motor se detendrá automáticamente, esto, debido al perfil trapezoidal estándar de velocidad (la aceleración será igual a la desaceleración). EJERCICIOS Revisen los ejemplos que vienen en la nota de aplicación AN-693 y la hoja de especificaciones del LM628/LM629. Y por favor, traten de resolver estos 2 ejercicios, ocupen las ecuaciones que vienen en las hojas de especificaciones. De esta manera, comprenderán cómo se determinaron los parámetros de la trayectoria: posición, velocidad y aceleración. 1. Se desea controlar electrónicamente la posición Solución: A = 0x00000004, V = 0x0000DF7A, P = 0x0000152E 2. Se tiene un motor con caja reductora 100:1, el cual se desea que dé 5 revoluciones, a una velocidad de 40 r.p.m. y con una aceleración de 2 rev/s2. En el eje rotor se tiene incluido un encoder en cuadratura incremental con sensor de efecto hall, cuya resolución es de 16 cuentas/rev. Determine los valores en hexadecimal, que se han de cargar a un controlador de posición de precisión LM629 cuya frecuencia de operación es FCLK = 6.00 MHz. Considere, en este problema, un factor C = 1/60s, para convertir la velocidad de r.p.m. en rev/s. Solución: P = 0x00007D00, V = 0x000174D4, A = 0x00000062 PROGRAMA EN MATLAB PARA LA INTERFAZ (comunicación serial) clear all; close all; clc; Ts=341e-6; %Periodo de muestreo = 2048/Fclk = 2048/(6.0MHz) = 341us R=6560; %Resolucion de encoder = 16*4*100 = 6400, y por compensar +160. puerto=serial('COM10'); set(puerto,'Baudrate',9615); %velocidad de comunicación a 9615 Baudios. set(puerto,'StopBits',1); %bit de parada a uno. set(puerto,'DataBits',8); %dato de 8 bits, debe estar entre 5 y 8 bits. set(puerto,'Parity','none'); %sin paridad set(puerto,'Terminator','CR/LF'); %“c” caracter con que finaliza el envíoset(puerto,'OutputBufferSize',12); %12 bytes a enviar set(puerto,'InputBufferSize' ,1); %1 byte a recibir set(puerto,'Timeout',10); %10 segundos de tiempo de espera fopen(puerto); while(1) opcion=menu('ELIJA UNA OPCION:', 'Definir parámetros de trayectoria', 'Salir'); if(opcion==2) break; else clc posicion = input(' Posición en Grados [°]: '); velocidad = input(' Velocidad [r.p.m.]: '); aceleracion = input(' Aceleración [rev/s^2]: '); p = round(R*posicion/360); v = round(65536*R*Ts*velocidad/60); a = round(65536*R*Ts*Ts*aceleracion); A = zeros(1,4); V = zeros(1,4); P = zeros(1,4); for i=1:4 P(i) = bitshift(bitand(p,bitshift(hex2dec('FF000000'),-8*(i-1))),-(24-8*(i-1))); V(i) = bitshift(bitand(v,bitshift(hex2dec('FF000000'),-8*(i-1))),-(24-8*(i-1))); A(i) = bitshift(bitand(a,bitshift(hex2dec('FF000000'),-8*(i-1))),-(24-8*(i-1))); end packdatos = zeros(1,12); packdatos(1:4) = A; packdatos(5:8) = V; packdatos(9:12) = P; envio = uint8(packdatos); fwrite(puerto,envio,'uint8'); end pause(1) recibido=fread(puerto,1,'uint8'); disp(recibido); end fclose(puerto); delete(puerto); clear puerto Política de privacidad |
|