viernes, 22 de febrero de 2019

Iniciando con el PIC18F45K50 / 25K50 en XC8

El PIC18F4550 es uno de los microcontroladores más populares entre estudiantes y hobbistas. Sin embargo ya es algo viejo (no tiene soporte para MCC , los K50 si). Poco a poco, se está migrando a su sustituto más nuevo: el PIC18F45K50. En México, fecha de 2019, aún no es muy fácil de conseguir en tiendas pero puede comprarse con envío gratis en Newark Mexico. Si nunca han usado MPLAB con XC8 aquí hay un tutorial bastante bueno (con PIC16, pero estén pendientes a mi canal porque subiré un curso para los K50). Vamos a realizar una práctica sencilla para comenzar a familiarizarnos con este MCU: Prender y apagar un led conectado a RB0 mediante un switch conectado a RD0 con un reloj a 48 MHz. Tengan a la mano la datasheet y vayamos por partes:

1. Configuración del reloj

El esquema de reloj es distinto al de su antecesor [pag. 29]. Usando un cristal de 16 MHz, este es el camino que debe estar habitado para conseguir los 48 MHz:
Click para agrandar
Los configuraciones necesarios son las siguientes:

#pragma config PLLSEL = PLL3X
#pragma config CFGPLLEN = OFF // ver Tabla 3-3 
#pragma config CPUDIV = NOCLKDIV
#pragma config FOSC = HSM     

#pragma config PCLKEN = ON  

 2. Configuración de puertos

Los pines RB0 y RD0 son usados por el módulo ADC por lo que deben desactivarse para ellos. En el caso del puerto B, esto puede hacerse al generar la cabecera de fuses con la linea:

#pragma config PBADEN = OFF

Para el caso de RDO deberá hacerse en el código principal escribiendo en el registro ANSELD [la tabla con todos los registros de función especial está en la página 84 de la datasheet] :
 3 Código completo en C

Como regla general siempre se debe leer en puerto y escribir  en latch:

lunes, 4 de febrero de 2019

Toolbox de Control para Python

Para aquellos que busquen un sustituto de código abierto para Matlab hay una buena noticia: Existe el módulo Python Control Systems Library. Acabo de probarlo y me parece mucho mejor que otras alternativas como los toolbox de control para Scilab y Octave. Si usan Anaconda, pueden instalarlo desde la terminal usando conda:

$ conda install -c conda-forge control

Quiero mostrarles algunos ejemplos simples utilizando el modelo de un motor NXT de Lego que describo en una entrada anterior. El modelo es el siguiente:
Creamos el objeto del modelo de la siguiente forma:

#Modelo como función de transferencia
num = [193.3]
den = [1.0, 18.735, 0.0]
sys = ctrl.tf(num,den) #Lazo abierto
print(sys)


El print nos mostrara la función de transferencia como una fracción en texto (al igual que en Matlab). Vamos a graficar ahora la respuesta al escalón de la planta en lazo cerrado:

#Modelo en lazo cerrado
sys_cl = ctrl.feedback(sys,1)

#Respuesta al escalón
t,y = ctrl.step_response(sys_cl)


#Graficas
plt.plot(t,y)
plt.grid(True)
plt.title(u"Respuesta al escalón")
plt.xlabel("segundos")


Lo que nos dará el siguiente resultado:
Para obtener el diagrama de bode:

plt.figure(2)
ctrl.bode_plot(sys)


Para visualizar el diagrama de polos y zeros:

from control.pzmap import pzmap 

plt.figure(3)
polos,zeros = pzmap(sys_cl), plt.grid(True)
print(polos[0])
print(polos[1])


¡Trataré de crear notebook's con más ejemplos y subirlos en mi GitHub!

viernes, 1 de febrero de 2019

This Must Be The Place

Hoy descubrí una canción que no conocía de The Talking Heads que ahora quisiera escuchar por el resto de mi vida. Se me ha quedado muy grabado en la mente uno de los comentarios del video. Just buried a dear friend after his long battle with a cruel disease. Instead of a moment of silence, he requested this song be played. Momentos después, un tanto por accidente, me puse a escarbar en la antigua blogosfera. Suelo añorar la época en la que gente escribía con frecuencia sobre sus vidas e ideas. Entre blog y blog empecé a notar que la mayoría parecieron detenerse entre 2009 y 2011, habiendo algunos que aguantaron hasta 2013. De todos hubo uno que atrapó mi atención. El (no tan) maravilloso mundo del Jedi... Suelo saltarme las primeras entradas para tratar de recuperar la secuencia temporal. De haber leído la última entrada hubiera adelantado lo que averigüé después. El autor me cayó bien, de esas personas que hubiera disfrutado leer en 2008. Una costumbre de ex-blogger es mudarse a Twitter así que se me ocurrió buscarlo ahí. Su último tweet, fechado el 10 de agosto de 2013, era una corta despedida. Por un enlace a su Facebook publicado desde su Twitter me di cuenta, por los comentarios de sus amigos y familia, que había fallecido por leucemia en septiembre de 2013. Había visto perfiles de dueños ausentes antes, pero nunca uno tan lleno de escritos abundantes de buenos detalles. El tipo de cosas que muchos quisiéramos que nos escribieran al dejar el mundo. Sin haberlo conocido puedo decir que fue una persona que verdaderamente supo dejar huella en la gente. Incluso en un extraño como yo. This Must Be The Place me suena en la mente como el final de una pelicula.