06-06-2022, 12:51 PM
(04-05-2022, 03:47 PM)Tehani escribió: Sigo con el tema:
Empecé a parir este piloto como recambio para los computadores de rumbo de Raymarine que se averiaban. En los smartpilots frecuentemente se sulfatan las pistas de las placas, ya que no tienen una caja hermética.
Pero no lo limité al bus seatalk. Este piloto se entiende con todo el mundo. Tiene 2 canales nmea0183, nmea2000 y WiFi.
Si hago otra versión de placa, añadiré USB, ya que también lo estoy incorporando a otros dispositivos. De hecho, el gyro tiene ya USB.
Bueno, como lo prometido es deuda, aquí va el fichero fuente del núcleo principal del piloto.
Hay líneas con // y trozos entre /* y */ que son pruebas que he ido haciendo y aún no están descartadas del todo.
Por orden de aparición en el fichero:
- Las funciones previas "void ServoReset(void), void AP_ParAdjust(void) y void PilotChangeMode(uint8_t Newmode)" sirven para inicializar variables en los cambios de estado del piloto.
- La tarea "void SeaState(void *pvParameters)" no está pulida aún. Sirve para controlar los parámetros de funcionamiento del piloto en función del estado de la mar, velocidad del barco, ángulo y velocidad del viento, etc. Aquí puede hacerse mucho aún.
- La tarea "void NavControl(void *pvParameters)" sirve para controlar el rumbo en todos los modos de funcionamiento del piloto. Usa ángulos de referencia iniciales cuando se activan dichos modos (El establecimiento de esas referencias está en otro fichero), y compara esas diferencias con los diferenciales de heading. También controla los cambios de rumbo introducidos por el usuario, de manera que se limita la velocidad de rotación y establece en varios pasos las maniobras con grandes variaciones de ángulo. Los intervalos de tiempo de activación de esta tarea son variables según varias condiciones (velocidad del barco, rotación, etc).
- La tarea "void HdgControl(void *pvParameters)" es básicamente un PID modificado para evitar sobreamortiguamientos de la parte integral. Es decir, es una "pseudointegral". Esta función se activa cuando llega información de Heading, que en el caso de NMEA2000 es 10 veces por segundo.
- La función "void ServoPosition(void)" se ejecuta cada 20 milisegundos a golpe de interrupción de timer. Sirve para controlar tanto el Clutch (embrague) como el motor principal. Aquí se controla todo: Corrientes de motor y clutch, zona muerta y aceleraciones de arranque y frenado del PWM principal. Básicamente es una máquina de estados.
- La función "int32_t JoystickRD()" sirve, omo su nombre indica, para leer y promediar los valores del potenciómetro o Joystick de control de timón cuando el piloto funciona en modo NON FOLLOW UP.
- La función "int32_t RudderLimits(int32_t preq)" sirve para limitar el recorrido máximo de la pala del timón, y puede ser por cantidad de energía enviada al motor cuando no hay sensor de rudder, o bien por valores máximo y mínimo del sensor.
- Al final encontraréis las funciones de inicialización del hardware de los controles PWM tanto del motor principal como del clutch.
NOTA: He tenido que cambiar la extensión del archivo a "servo_pwm.pdf" porque esta web no me permitía con la extensión original (servo_pwm.c). Si lo descargáis, cambiad .pdf por .c.