Explicación del programa desarrollado en MikroC
Microcontrolador: PIC18F4520.
Frecuencia de trabajo (Fosc) = 10.00 MHz. Un ciclo de trabajo del
microcontrolador = 4/Fosc = 400ns.
Circuito Procesador LM629N-6. Máx.
FCLK = 6.00 MHz. Es la frecuencia a la que estamos ocupándolo. Todos los
tiempos en los diagramas de tiempo son proporcionados por las hojas de datos
con un oscilador a 6.00 MHz.
Este es el inicio del
programa, en donde se definen variables, puerto para el bus de datos y para el
bus de control, señales de control y el set de instrucciones del circuito procesador LM629 y funciones
esenciales para su manejo.
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 del bus de datos (PORTD) como entradas digitales. Mediante el registro
correspondiente para configurarlo de esta manera (en este
caso, TRISD). Después espera 2 ciclos de reloj. Y por último regresa el dato que está en el DATABUS, es decir, hace
la lectura.
LM629_Wr_Byte
Esta función, contraria a la lectura de un byte,
configura los 8 bits del bus de datos (PORTD) como salidas digitales. Mediante el registro TRIS correspondiente (TRISD). Esta
función requiere el dato “output”, que es el valor que se sacará por el bus de
datos, una vezconfigurado como salida.
LM629_StatusByte
Esta función se dedica a la lectura del
byte de estado del
LM629. Se desarrolló de acuerdo al diagrama de tiempo
proporcionado por la hoja de datos. Si se dan cuenta se tiene que
flanquear las terminales /CS, /PS y /RD, y también, hace uso
de la función para leer un byte. Después de leer el byte, lo guarda en la
variable status y lo regresa en ella. Con este diagrama, creo yo, es más fácil entender el código
mostrado. T7 = 0ns, T8 = 30ns, T9 = 30ns, T10 = 180ns, T11 = 0 ns, T12 = 180ns
(revisen la hoja de datos porque varios de estos tiempos son mínimos y otros
máximos).
LM629_BusyCheck
Esta función verifica el estado del
“Busy bit” del
LM629. Este bit es usado para determinar si el procesador LM629 está ocupado=1
/ libre=0 al escribir o leer algún dato. Corresponde al bit 0 del Status Byte,
por tanto, para acceder a él, se tiene que leer el propio Status Byte, y
después verificar el estado de dicho bit.
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 del set de
instrucciones del LM629, definido al inicio del programa. Como puede observarse en el diagrama de tiempo,
antes de llamar a esta función, se tiene que verificar el estado del “Busy bit”. Si está
libre, entonces se hace su llamado, que primero escribe el comando en el bus de
datos yflanquea las terminales /CS, /PS y /WR, para que tenga efecto la
escritura del comando en el LM629. T7 = 0ns, T8 = 30ns, T9 = 30ns, T14 = 100ns,
T15 = 50ns, T16 = 120 (revisen la hoja de datos porque varios de estos tiempos
son mínimos y otros máximos).
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 como
salida. Y de acuerdo al diagrama de tiempos, primero, se verifica el estado del “Busybit” antes de ser
llamada esta función, si se encuentra libre, entonces, se hará la escritura del byte alto, y
posteriormente, el byte bajo. Para esto, es necesario flanquear las terminales
/CS, /PS, /WR, en el orden cronológico y con los tiempos (mínimos o máximos)
mostrados en el diagrama de tiempo (revisen la hoja de datos porque varios de
estos tiempos son mínimos y otros máximos), para que la escritura de la “word”
tenga efecto en el LM629.
LM629_Init
En la nota de aplicación AN-693, se muestra una guía para la programación de la
inicialización del
hardware LM628/LM629. Aquí les muestro la tabla que indica el algoritmo para la
inicialización del
módulo, de RESET con hardware. Recuerden que estamos ocupando el LM629, así que
la inicialización también aplica para este procesador.
La principal diferencia, si es que ya leyeron las hojas deespecificaciones, es
que el LM628 tiene salidas para un DAC (no tiene PWM) y
el LM629 tiene PWM (pero no tiene salidas para DAC). Por tanto, el comando
PORT12 no aplica para el LM629, y la inicialización de este integrado termina
cuando se pregunta por el Status Byte, si es 0x80 ó 0xC4 y con un “Busy Bit
Check”, recomendado. Abajo se indica los registros de Status
Byte y además, el registro para las Interrupciones Enmascarables, que se tienen
que resetear en 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 del
Filtro del Control PID.
Selección del intervalo de muestreo del término derivativo.
Aquí está la función para configurar los parámetros del filtro PID. Se basó también en la tabla que viene en la nota de aplicación.
Sólo que en nuestra función, definimos los parámetros ki, kd,
e iL. Y el intervalo de muestreo del término derivativo se puso a
0. La razón es por la fórmula que se encuentra arriba en esta página. El muestreo
será Td = ds*Ts = 1*Ts. Donde Ts = 341µs, y por lo tanto, Td = Ts = 341µs. Los
coeficientes y el límite de integración (son datos de 16 bits, por eso se
definen como
arreglos de 2 bytes) se propusieron.
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. Como
pueden observar la aceleración, la velocidad y la posición, deben ser datos de
hasta 32 bits, por eso, son manejados como arreglos.
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 del motor en el siguiente link
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, del registro del Filtro de Control, 0x00.
-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 del eje rotor de un
motor de CD, mediante la utilización de un controlador de precisión LM629
operando a 6 MHz de frecuencia (FCLK). En el eje motriz se ha adaptado un encoder incremental en cuadratura de 16 pulsos por
vuelta. Se desea programar un perfil trapezoidal de movimiento, con una
aceleración de 0.1 rev/s2, una velocidad de 0.4 rev/s y que recorra 305°.
Determine los valores en hexadecimal que se tienen que programar en el registro
de control de trayectoria (los registros de aceleración, velocidad y posición)
del LM629 para la correcta activación de los amplificadores no lineales de
potencia (puente en H, mediante la modulación por ancho de pulso que emitirá el
LM629) diseñados para este motor que, dadas las especificaciones del
fabricante, tiene una reducción de100:1. Precaución en la ecuación de posición,
ya que están pidiendo desplazamiento en grados (1 rev = 360°).
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