Hola a todos!! Pues eso, me he quedado atascado en un proyecto que controla un puente grúa. Estoy utilizando una tarjeta Mega con la cual leo con interrupciones externas el estado de dos encoders (posición de la barra y ángulo del péndulo que sujeta la carga), y además para el movimiento de ésta necesito generar un pulso cuadrado cuya frecuencia es proporcional a la velocidad de la barra, por lo tanto digamos que ese pulso es "lo que lo mueve". Mi problema surge al generar este pulso porque debe ser muy exacto para que la grúa no dé tirones.
Estas son las cosillas que he ido probando y a la vez descartando:
-
No puedo utilizar pwm porque esta función sirve para cambiar el ancho "activo" del pulso, pero no su frecuencia que es lo que nos interesa. Y ponernos a modificar las frecuencias del pwm en este caso sería como vender el coche para comprar gasolina.
-
No me sirve utilizar la función millis() o micros() para temporizar una subida y bajada de flancos en el loop principal. Como he dicho tengo programadas varias interrupciones y digamos que los flancos suben y bajan un poco cuando pueden, a pesar de tenerlo medio temporizado. Esta es una buena solución en programas sencillos que no se interrumpan o que no necesiten de una precisión exacta, pero no es el caso. Lo he probado y da tirones.
La solución a la que me he ido aproximando por tanto es programar una interrupción interna temporizada. Para ello utilicé la libreria FlexiTimer2, que vendría a ser como la MsTimer2 pero pudiendo ajustar la resolución a menos de un milisegundo que es lo máximo que permite la otra. El código quedaría:
#include <FlexiTimer2.h>
int pin=13;
int velocidad=10;
void setup()
{
pinMode(13, OUTPUT);
FlexiTimer2::set(velocidad, 1.0/100000, pulso);
FlexiTimer2::start();
}
void pulso()
{
static boolean output = HIGH;
digitalWrite(pin, output);
output = !output;
}
Pero en mi caso real este código está acompañado de otras 6 interrupciones que hacen que el pulso no acabe de ser del todo suave. Mi pregunta es si existe alguna manera de dar a esta interrupción interna FlexiTimer2 una prioridad total, que haga que siempre entre en ella aunque tenga que dejar a medias una interrupción externa en la que ya haya entrado.
O en su defecto si hay alguna otra manera de generar una interrupción interna temporizada con prioridad total sobre las demás
Muchas gracias de antemano