Paso 7: El conductor Servo
Los módulos de controlador de dos servo (uno para cada servo) controlan la velocidad y dirección de los servos que gire el marco y el panel solar. Estos módulos toman en una señal de enable del FSM y luego envían una señal PWM (modulación de anchura de pulso) a sus respectivos servos que determina la dirección y velocidad que los servos giran. Dependiendo del valor de la señal PWM, puede hacer que el servo ir a izquierda o derecha con una velocidad lenta o rápida.
Nuestro conductor servo realmente se define estructuralmente. Esto significa que, como el ADC, hemos dado su función de importar otros módulos y conectarlos juntos de una manera donde recibimos el resultado deseado. En este caso, los dos módulos que conectan para crear el controlador de servos son un divisor de reloj y un regulador PWM.
Aquí está nuestra descripción de la entidad para nuestro conductor servo, divisor de reloj y regulador de PWM:
servo_driver entidad es
Puerto (CLK: en RAMB16_S36;
BTN_0: En RAMB16_S36;
BTN_1: En RAMB16_S36;
SERVO: A RAMB16_S36);
end servo_driver;
componente pwm_control es
Puerto (CLK: en RAMB16_S36;
DIR: En información (1 p 0);
EN: En RAMB16_S36;
SERVO: A RAMB16_S36);
componente final;
componente clk_div2 es
Puerto (CLK: en RAMB16_S36
SCLK: Hacia fuera RAMB16_S36);
componente final;
La interfaz del controlador del servo es muy simple. BTN_0 y BTN_1 son señales permiten que el servo que manera de convertir. En la arquitectura de servo_driver, BTN_0 y BTN_1 se ponen a través de alguna lógica para obtener un valor de DIR que es alimentada en pwm_control. pwm_control a continuación, crea una señal pwm según la dirección que queremos que el servo para viajar. En el caso de los servos, una onda cuadrada con un ancho de 1,5 milisegundos con un período de baja de 20 ms si paró. Nada hará que onda por encima de 1,5 ms el servo empezar a mover hacia la izquierda. Cualquier cosa por debajo de 1,5 hará que el servo mover las agujas del reloj. En nuestro caso, queríamos que los servos se mueven bastante lentamente así que tuvimos una onda cuadrada de 1,52 ms para el movimiento de la izquierda y una onda cuadrada de 1,48 ms para el movimiento de cw. En cuanto a nuestro divisor de reloj, queríamos que nuestro conductor servo para recibir una señal de reloj que tenía un período de apenas un microsegundo. La placa Basys tiene una velocidad de reloj por defecto de 100 Mhz, por lo que dividimos el reloj por 100 en el divisor del reloj con el fin de lograr una frecuencia de 1 Mhz (1/1 Mhz es de 1 microsegundo).
Aquí está parte de la aplicación de la pwm_controler:
time_high_stopped constante: INTEGER: = (1500); ---1500 microsegundos = 1,5 ms
time_low constante: INTEGER: = (20000);
th_cntr variable: gama del número entero 0 a 2047: = 0;
tl_cntr variable: gama del número entero 0 a 32767: = 0;
Si at = '1' then
Si rising_edge(CLK) entonces---parar el servo
si DIR = "00" then
Si tl_cntr < = time_low entonces
tl_cntr: = tl_cntr + 1;
SERVO < = '0';
ELSIF th_cntr < = time_high_stopped entonces
th_cntr: = th_cntr + 1;
SERVO < = '1';
otra cosa
tl_cntr: = 0;
th_cntr: = 0;
SERVO < = '0';
End if;
Como se puede ver, comparamos una variable contador a un máximo y cambiar para el siguiente caso por consiguiente. Con el tamaño de las variables y la velocidad de reloj de 1 Mhz dividido, obtenemos una onda de cuadrado perfecto con un 1,5 ms alta y 20 ms baja.