FPGA Cyclone IV DueProLogic controla el servomotor: 4 pasos
FPGA Cyclone IV DueProLogic controla el servomotor: 4 pasos
Anonim
FPGA Cyclone IV DueProLogic controla el servomotor
FPGA Cyclone IV DueProLogic controla el servomotor

En este tutorial, vamos a escribir código Verilog para controlar el servomotor. El servo SG-90 es fabricado por Waveshare. Cuando compra el servomotor, puede recibir una hoja de datos que enumera el voltaje de funcionamiento, el par máximo y la modulación de ancho de pulso (PWM) propuesta … etc. Sin embargo, el FPGA DuePrologic proporciona un voltaje de entrada de 3.3V donde el voltaje de operación del servo SG-90 es de 5V a 7V. En la falta de energía eléctrica, enumeraré mi PWM calibrado para hacer girar el servomotor con éxito.

Nuestra tarea: el servomotor gira hacia adelante y hacia atrás en un período de 5 segundos.

Menú completo:

Paso 1: Construya el circuito electrónico

Construir circuito electrónico
Construir circuito electrónico

Paso 2: Configura el planificador de pines

Configurar el planificador de pines
Configurar el planificador de pines

Haga clic en "Iniciar análisis de asignación de E / S" para comprobar si el planificador de pines está configurado correctamente. De lo contrario, tendrá que importar todos los nombres de los puertos usted mismo.

Paso 3: Código Verilog

Creamos un temporizador "servo_count". Cuando "servo_A" es ALTO, el PWM es de 1.5ms y, por lo tanto, el servo se ubica a 120 grados. Por el contrario, cuando "servo_A" es BAJO, el PWM es de 0,15 ms y, por lo tanto, el servo se mantiene en 0 grados.

asignar XIO_2 [3] = servo_pulse; //para V'

reg [31: 0] servo_count;

comienzo inicial

servo_count <= 32'b0;

servo_A <= 1'b0;

fin

siempre @ (posedge CLK_66)

empezar

servo_count <= servo_count + 1'b1;

if (servo_count> 400000000) // Ciclo de reloj 66MHz, 1 / 66M * 400000000 ~ 5 segundos

empezar

servo_A <=! servo_A;

servo_count <= 32'b0;

fin

fin

reg [31: 0] ex_auto;

comienzo inicial

ex_auto <= 32'b0;

servo_auto <= 1'b0;

fin

siempre @ (posedge CLK_66)

empezar

si (servo_A == 1'b1)

empezar

ex_auto <= ex_auto + 1'b1;

if (ex_auto> 100000) // Ciclo de reloj 66MHz, este PWM es ~ 1.5ms, el servo gira a 120 grados

empezar

servo_auto <=! servo_auto;

ex_auto <= 32'b0;

fin

fin

si (servo_A == 1'b0)

empezar

ex_auto <= ex_auto + 1'b1;

if (ex_auto> 10000) // Ciclo de reloj 66MHz, este PWM es ~ 0.15ms, el servo gira a 0 grados

empezar

servo_auto <=! servo_auto;

ex_auto <= 32'b0;

fin

fin

fin

Paso 4: Cargue el código Verilog

Image
Image

Haga clic en "Iniciar compilación". Si no se muestra ningún mensaje de error, vaya a "Programador" para completar la configuración del hardware. Recuerde actualizar el archivo pof en "Cambiar archivo" si es necesario. Haga clic en "Inicio" para cargar el código.

Después de todo, debería ver que el servomotor gira periódicamente.