Acabo de notar que los comentarios en el programa son en alemán y además quiero indicar que el autor intelectual de todo el programa es Torsten!
Aquí las traducciones:
R/C-Kanal lesen!
Leer canal del radio control
'Den Timer starten mit steigender Flanke
'Iniciar el contador (Timer) cuando el impulso cambie de valor de 0 a 1 digital, respectivamente de 0 V a 5 V.
Esto ocurre cuando el receptor pone el impulso para controlar un servo o el variador, una vez cada 20 ms!
'Den Timer stoppen mit fallender Flanke
Esto es lo inverso, el impulso acaba y el valor digital se devuelve de "1" a "0", respectivamente de forma análoga, de 5 V a 0 V.
El contador va contando unidades de tiempo, empezando desde el valor "0" y aumentando hasta que la instrucción lo para. El programa entonces le el valor del contador y el digito resultante de esta operación es equivalente al la longitud del impulso del receptor.
Para mejor entendimiento de los novatos:
El radio control genera un impulso que dura entre 1 ms y 2 ms. Un impulso significa que el valor de la tensión entre tierra, el hilo negro de cable que conecta el receptor con el variador, y el hilo amarillo, el pin del enchufe del receptor, que provee el impulso, la información cambia del valor de Tierra a 5 V, el valor que tiene el hilo rojo. Esto se repite cada 20 ms!
Si pones el control en la posición más baja, el impulso tendría 1 ms de longitud, lo que podría equivaler un valor del contador de "500".
Si pones el control en la posición más alta, el impulso tendría 2 ms de longitud, lo que podría equivaler un valor del contador de "1000".
El valor del contador teniendo un valor entre 500 y 1000 indica que la longitud del impulso ha sido medida de forma correcta. El variador, que regula el número de revoluciones del motor por PWM también genera un impulso que usa para abrir o cerrar un interruptor dejando pasar la corriente o no dejándolo pasar, un par de miles o millones de veces por segundo. Según cual porcentaje del tiempo que el interruptor deja pasar la corriente el motor va a girar más o menos rápido. El programa del variador por lo tanto asume que cuando el valor digital del receptor es “1000” el controlador del variador mantendrá el interruptor dejando pasar la corriente un 100% del tiempo.
Cuando el valor es de 750, impulso de media longitud, el joystick del transmisor está en la posición central, el interruptor en el variador esta un 100% del tiempo no dejando pasar la corriente.
Cuando el valor está entre los 500 y los 750, el motor estaría andando en reversa, el controlador accionaría un control que tiene como resultado que los polos de la batería conectados al motor son cambiados. Donde iba el polo (+) ahora estará la tierra (-), y viceversa. Esto se logra con el puente de doble “H”. Lo que hay que cuidar atraves del programa es, que nunca el puente doble H vaya a crear un cortocircuito.
El programa listado es un programa de servicio a un “interrupt”. Un interrupt es una señal que el controlador recibe debido a que ocurre un evento exterior o interior. En nuestro caso estamos observando el valor de la tensión en el pin del receptor que genera la información. Utilizamos un pin del controlador y lo iniciamos de tal forma, que cuando el valor cambia de “0” a “1” el controlador genera un interrupt al empezar el impulso del receptor y un segundo interrupt cuando el impulso acaba y el valor del receptor vuelve de “1” a “0”.
Todo lo que hace el programita es iniciar el contador cuando el impulso empieza, cambiar la inicialización del Pin para que este genere otro interrupt cuando el impulso acabe, leer el valor del contador (Timer) y grabar el valor del contador asignándole un nombre e iniciar el contador asignándole el valor de “0” para que esté listo par a contar cuando se repita el impulso 20 ms más tarde.
El programa del controlador puede estar cumpliendo cualquier función que quisiéramos que haga. Cuando el interrupt ocurre, el controlador interrumpe su programa, lo pone a un lado y ejecuta el programe de servicio que os he dado aquí como ejemplo. Una vez que el programa de servicio ha iniciado el contador, el programa que originalmente el controlador estaba ejecutando continua donde lo interrumpió el “interrupt”
Ya ven porque el “interrupt” se llama “interrupt”! Es porque interrumpe la operación normal del controlador.
Cuando ocurre el segundo “interrupt”, esto es cuando el impulso del receptor acaba, se repite lo descrito, solo que el programita ahora nota que acabe de medir la longitud del impulso y ejecuta la segunda mitad del programa.
Lo que a mí me toca realizar cuando aprendí esto, era poner en relación el tiempo que las diferentes acciones requieren.
Imagínense que el controlador ejecuta un comando 8 , 16 o 20 millones de veces por segundo. El programita de servicio, solo requiere 20 a 40 periodos de los cuales el controlador tiene 8, 16 o 20 millones por segundo. 1 ms, que es el tiempo más largo que el impulso del receptor puede tener, equivale a 1000 x 8, 16 o 20, o sea 8000, 16000 o 20000 comandos pueden ser ejecutados por controlador durante ese tiempo que nos parece tan corto. Traduzcamos esto en segundos para tener una noción más familiar de cuánto tiempo le queda disponible al controlador a parte de ejecutar la función de leer la longitud del impulso.
Digamos que un período del controlador sea equivalente a 1 segundo nuestro. Entonces el controlador ejecutará nuestro programita en 30 segundos. Después tiene que esperar hasta un máximo tiempo para que el impulso del receptor finalice, equivale 8000, o 16000 periodos, o 20000 periodos, lo que equivaldría 8000 segundos lo que sería algo más de 2 minutos, casi 5 minutos o 6 minutos según qué tan rápido estamos dejando funcionar el controlador. Y después el controlador tiene que esperar hasta que se repita el impulso lo que tomará 19 veces 2 minutos, o 19 veces 5 minutos, o 19 veces 6 minutos, esto son 38 minutos, o 95 minutos o 114 minutos. Prácticamente el controlador nunca tiene trabajo que hacer, está en paro!
Ojala esto les ayude algo para entender porque no programamos el controlador para que espere observando cuando el pin cambia de valor, sino que lo hacemos por interrupt.
De este modo un controlador puede medir la longitud de los 8 canales de un receptor normal y aún estar prácticamente sin oficio la mayor parte del tiempo. Durante este tiempo, por ejemplo, puede hacer labores de administración, puede mandar por el bus I2C los datos a otro controlador en el variador, etcétera, etcétera.