Hola a todos!! en esta entrada os voy a mostrar como hacer funcionar un pequeño sistema operativo en tiempo real (RTOS). En primer lugar os voy a intentar contar la necesidad que me ha llevado a utilizar un sistema de estos a pesar de que no sean eficientes. Para el proyecto que estoy realizando en colaboración con la página Itead Studio, necesitaba que en el procesador Iteaduino DUE manejara 2 procesos básicamente. Uno de ellos es el propio algoritmo para obtener el punto de máxima potencia el cual tiene que ejecutarse cada 200 o 300 ms. Además de ese proceso, el otro que debe ejecutarse es el de la actualización de la página web, que en este caso se actualizará cada 1s, por tanto tenemos dos procesos que funcionan con periodos diferentes.
La opción más rápida hubiera sido ejecutar la página web en el bucle principal, dentro de la función loop, y luego programar una interrupción del timer para que se ejecute cada 100 o 200ms, y dentro de esta interrupción ejecutar el algoritmo del MPPT. Para poder hacer el programa de esta forma estuve buscando como activar y configurar las interrupciones en las placas Arduino DUE y compatibles y aunque no es muy complicado, me resultaba un poco lioso ya que hay que combinar instrucciones del ARM con instrucciones de Arduino, así empecé a investigar otra forma de hacerlo, y entonces recordé FreeRTOS, mediante el cual ya estuve haciendo algunas pruebas con los PIC18, así que lo primero que hice fue ver si FreeRTOS estaba disponible para el IDE de Arduino, y no encontré nada en claro, así que busqué otros RTOS que sí qu estuvieran diseñados para Arduino, y además que fueran compatibles con las placas DUE, ya que el IDE de estas no es exactamente el mismo que para las demás, y después de un rato googleando encontré ChibiOS, que aunque en principio no es compatible con Arduino, desde el blog JeeLabs han modificado esta versión inicial de forma que cumple con todo lo que yo necesitaba, compatible con Arduino, tanto las placas normales como las DUE, fácil de implementar, documentado y con ejemplos! que más puedo pedir! En el mismo archivo de descarga podéis ver algunos ejemplos, y también veréis que sigue la misma filosofía que FreeRTOS. A continuación os pongo el código que he desarrollado para el proyecto.
En primer lugar, en la función setup() iniciamos la comunicación ethernet e iniciamos el sistema operativo mediante la función chBegin(mainThread), de esta forma le decimos que la función Idle es la que se llama mainThread, y es la siguiente función que ejecutará. En esta función, lo primero que se hace es declarar los procesos o hilos que vamos a ejecutar, en este caso 2, asignándoles una prioridad, la cual se define por la prioridad de la función mainThread + n, siendo más prioritario cuanto mayor sea n, así vemos que el hilo del MPPT es más prioritario que el servicio web, y esto lo he hecho así porque el servicio web es mucho más lento, que el cálculo del MPPT, de esta forma aseguramos que el MPPT se calcule a tiempo. Luego en cada una de las funciones introducimos un retardo del tipo chThdSleepMilliseconds(ms); de forma que mientras este retardo esté parando la ejecución de ese hilo, otro hilo puede ejecutarse, os i no hay hilos pendientes de ejecutarse, se ejecutará la función idle, en nuestro caso, mainThread.
Como veis el proyecto va cogiendo forma ya que tenemos diseñado y montado el regulador, que recordad que se tratará de una fuente SEPIC, el algoritmo que controlará el regulador también lo tenemos planteado, además del programa base para empezar. Solo queda empezar a ensamblarlo todo y ver funcionar el regulador MPPT!
En primer lugar, en la función setup() iniciamos la comunicación ethernet e iniciamos el sistema operativo mediante la función chBegin(mainThread), de esta forma le decimos que la función Idle es la que se llama mainThread, y es la siguiente función que ejecutará. En esta función, lo primero que se hace es declarar los procesos o hilos que vamos a ejecutar, en este caso 2, asignándoles una prioridad, la cual se define por la prioridad de la función mainThread + n, siendo más prioritario cuanto mayor sea n, así vemos que el hilo del MPPT es más prioritario que el servicio web, y esto lo he hecho así porque el servicio web es mucho más lento, que el cálculo del MPPT, de esta forma aseguramos que el MPPT se calcule a tiempo. Luego en cada una de las funciones introducimos un retardo del tipo chThdSleepMilliseconds(ms); de forma que mientras este retardo esté parando la ejecución de ese hilo, otro hilo puede ejecutarse, os i no hay hilos pendientes de ejecutarse, se ejecutará la función idle, en nuestro caso, mainThread.
Como veis el proyecto va cogiendo forma ya que tenemos diseñado y montado el regulador, que recordad que se tratará de una fuente SEPIC, el algoritmo que controlará el regulador también lo tenemos planteado, además del programa base para empezar. Solo queda empezar a ensamblarlo todo y ver funcionar el regulador MPPT!
No hay comentarios:
Publicar un comentario