Paso 5: Detalles de software: control de velocidad y otras funciones básicas
Ya que es una especie de cooperativa muy simple "sistema operativo de tiempo Real ," cada rutina debe ser ejecutado en el menor tiempo posible, liberando el sistema para atender las interrupciones muy frecuentes.
Hay no "esperar" y sin retrasos en el código. Siempre que posible interrupciones se utilizan, en particular para lentas operaciones de transmisión o recepción de cadenas de caracteres. Comunicación UART toma el advantege de las capacidades de la DMA de los dsPIC33F para ahorrar tiempo de CPU haciendo todo el trabajo "sucio" en hardware.
Periféricos utilizados en dsPIC33FJ128MC802:
-QEIs para calcular el camino recorrido.
-Entrada (IC) para calcular la velocidad de captura.
Convertidores para leer la corriente del motor.
-Mejora Sinuosidal para conducir los motores.
-UARTs para comunicarse con el mundo externo
QEI módulos se utilizan para saber cuánto han viajado las ruedas y en qué dirección. Este valor algebraico es acumulada en una variable cada 1ms y enviados a las funciones de supervisor en su petición. Después de enviar el valor, las variables se restablecen.
La velocidad se mide en el pulso de cada encoder como se describe a continuación. Cada 1ms calcula la velocidad media en un promedio de las muestras, se ejecuta el algoritmo de PID y corrige la velocidad del motor por consiguiente a su resultado, cambiando el ciclo de trabajo PWM. Para una descripción detallada de la aplicación de biblioteca de C30 PID, vea el ejemplo de código de Microchip: CE019 - uso proporcional de Integral derivado (PID) los controladores de sistemas de Control de bucle cerrado. http://WW1.microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
Variaciones de velocidad de los motores se ejecutan con suavidad, acelerar o decelerar con una rampa inclinada ascendente o descendente, para evitar tensiones mecánicas pesadas y resbalamiento de la rueda que podría causar errores de odometría. Desaceleración es más rápida, entonces aceleración para evitar golpes con obstáculos durante el frenado.
IC , captura entrada módulos se utilizan para medir el tiempo transcurrido entre dos pulsos generados por el codificador, s significado cuando las ruedas viajaban por un bien conocido fija la cantidad de espacio (constante SPACE_ENC ). Conectado en paralelo a QEA (internamente a la DSC gracias a las capacidades periféricas Pin seleccione de los dsPIC33F), capturan el tiempo transcurrido en el flanco ascendente de las señales de los codificadores. TIMER2 se utiliza en el modo libre. En cada interrupción de IC, se almacena el valor del TMR2 y su valor anterior se resta de él; Éste es el período del pulso. Entonces el valor actual se convierte en el valor anterior, en espera de la próxima interrupción. Bandera de TMR2 tiene que medirse para saber si un desbordamiento de registro the16-bit. Si es así, la diferencia entre 0xFFFF y el ejemplo anterior tiene que se agregará al valor actual. Muestras se suman algebraicamente en IcPeriod variable según _UPDN de bit, para determinar también la dirección de la velocidad. Este es uno de los métodos sugeridos en la Nota de aplicación de Microchip AN545 .
La variable IcIndx contiene el número de muestras en IcPeriod .
Cada 1ms la velocidad media se calcula como V = espacio/tiempo
donde espacio = SPACE_ENC•IcIndx
(= espacio cubierto en un codificador pulso • número de pulsos)
y tiempo = TCY•IcPeriod
(= período TMR solo • suma de los períodos se produjo).
Single_TMR_period = TCY = 1/FCY (frecuencia de reloj).
Por V=Kvel•(IcIndx/IcPeriod)
donde Kvel = SPACE_ENC•FCY tener velocidad en m/s.
Desplazamiento a la izquierda 15 bits Kvel const (KvelLong = Kvel << 15 ) la velocidad se calcula ya en formato fraccionario (también si sólo se utilizan las variables de número entero) listo para ser utilizado en la rutina del PID. Ver archivo de "descrEng.txt" en proyecto de MPLAB para una descripción más detallada.
Convertidores medir continuamente los motores actuales, almacenar valores en 16 posiciones topes ADCBUF. Cuando los amortiguadores están llenos, se produce una interrupción y se calcula un valor promedio aproximadamente cada 1ms.
UARTs se utilizan para recibir comandos desde fuera y devolver los resultados de las mediciones. La parte de comunicación del programa funciona como una máquina de estado. Variables de estado se utilizan para ejecutar acciones en secuencia. Muy simple y rápido interrumpir servicio rutinas (ISR) obtener o poner cada solo byte o a un buffer y las banderas de derecha para dejar la función adecuada para ser ejecutado.
Si cualquier tipo de error se produce durante la recepción (UART, suma de comprobación, análisis de errores), la variable de estado se establece en un número negativo y el led rojo se enciende para comunicar externamente esta condición de falla. Ver archivo de "descrEng.txt" en proyecto de MPLAB para una lista completa de posibles errores.
El protocolo utilizado para el apretón de manos es capa física independiente y puede utilizarse con el bus I2C o RS485 también para comunicarse.
La primera capa es controlado por interfaz periférico dsPIC. Errores de estructura o saturación (UART) o colisiones (I2C) son detectadas por hardware, configuración de la bandera correspondiente.
La segunda capa es manejado por las rutinas ISR. Llene el buffer de RX con los bytes recibidos de las interfaces. También detectan desbordamiento de búfer y el comando de retención.
UartRx o UartRx2 funciones administran la tercera capa . Como ya se ha descrito (véase también diagramas de flujo) estas rutinas actúan como una máquina de estado, conseguir bytes del búfer y descifrar la cadena de comandos.
Los bytes se intercambian entre las capas segunda y terceros (función ISR y UartRx) a través de un buffer circular. ISR recibe un byte, almacena en un array y un puntero a la matriz, incrementa si el puntero llega al final de la matriz se reinicia al principio. La función UartRx tiene su propio puntero para leer la misma matriz, se incrementa (de forma circular demasiado) tan pronto como el byte es decodificado en el estado actual de la RX. Bucle principal llama a la función UartRx cuando el puntero del "en" difiere de "a" puntero.
Cada paquete de comando está compuesto por:
0 - cabecera @
1 - ASCII ID 0-9
2 - Cmd A-z de ASCII
3 - CmdLen N = 1-MAX_RX_BUFF número de bytes siguientes (checksum incluido)
4 - datos...
...
N-1-datos
N - suma de comprobación obtenida sumando simplemente en una variable de 8 bits, bytes todos componer el mensaje (suma de comprobación se excluyen) de 0-255.
Esta capa controla el tiempo de espera y errores de suma de comprobación, así como coherencia del paquete (encabezado correcto, longitud correcta). Si todo está bien habilita analizador rutina (cuarta capa ) para descifrar el mensaje y ejecutar la acción necesaria. Esta rutina fija la bandera de error apropiado si no se conoce el código de mensaje recibido.
TMR1 genera un reloj de temporización de 1000 Hz - el latido del corazón del programa. De interrupción de cada TMR1, temporizadores internos se actualizan, el vigilante se borra y se coloca una bandera para la función que pide por el valor del espacio recorrido. Cada función de "All_Parameters_Ask" de 10 ms (velocidad, posición actual) está activada.