FPGA Cyclone IV DueProLogic Controls Servomotor: 4 pași
FPGA Cyclone IV DueProLogic Controls Servomotor: 4 pași
Anonim
FPGA Cyclone IV DueProLogic Controles Servomotor
FPGA Cyclone IV DueProLogic Controles Servomotor

În acest tutorial, vom scrie codul Verilog pentru a controla servomotorul. Servo-ul SG-90 este fabricat de Waveshare. Când cumpărați servomotorul, este posibil să primiți o fișă tehnică care să enumere tensiunea de funcționare, cuplul maxim și modulul de lățime a impulsului propus (PWM) … etc. Cu toate acestea, FPGA DuePrologic furnizează o tensiune de intrare de 3,3V, unde tensiunea de funcționare a servo SG-90 este de 5V - 7V. În lipsa de energie electrică, voi lista PWM-ul meu calibrat pentru a roti cu succes servomotorul.

Sarcina noastră: Servomotorul este rotit înainte și înapoi cu perioada de 5 secunde

Meniu complet:

Pasul 1: Construiți un circuit electronic

Construiți un circuit electronic
Construiți un circuit electronic

Pasul 2: configurați Pin Planner

Configurați Pin Planner
Configurați Pin Planner

Faceți clic pe „Începeți analiza temei I / O” pentru a verifica dacă planificatorul de pin este setat corect. În caz contrar, trebuie să importați singur toate porturile.

Pasul 3: Codul Verilog

Creăm un cronometru „servo_count”. Când "servo_A" este HIGH, PWM este de 1,5 ms și, prin urmare, servo-ul este situat la 120 de grade. În schimb, când „servo_A” este scăzut, PWM este de 0,15 ms și, prin urmare, servo-ul rămâne la 0 grade.

assign XIO_2 [3] = servo_pulse; // pentru V '

reg [31: 0] servo_count;

început inițial

servo_count <= 32'b0;

servo_A <= 1'b0;

Sfârșit

mereu @ (posedge CLK_66)

începe

servo_count <= servo_count + 1'b1;

if (servo_count> 400000000) // Ciclul ceasului 66MHz, 1 / 66M * 400000000 ~ 5 secunde

începe

servo_A <=! servo_A;

servo_count <= 32'b0;

Sfârșit

Sfârșit

reg [31: 0] ex_auto;

început inițial

ex_auto <= 32'b0;

servo_auto <= 1'b0;

Sfârșit

mereu @ (posedge CLK_66)

începe

if (servo_A == 1'b1)

începe

ex_auto <= ex_auto + 1'b1;

dacă (ex_auto> 100000) // Ciclu de ceas 66MHz, acest PWM are ~ 1,5 ms, servo se rotește la 120 de grade

începe

servo_auto <=! servo_auto;

ex_auto <= 32'b0;

Sfârșit

Sfârșit

if (servo_A == 1'b0)

începe

ex_auto <= ex_auto + 1'b1;

dacă (ex_auto> 10000) // Ciclu de ceas 66MHz, acest PWM are ~ 0,15 ms, servo se rotește la 0 grade

începe

servo_auto <=! servo_auto;

ex_auto <= 32'b0;

Sfârșit

Sfârșit

Sfârșit

Pasul 4: Încărcați codul Verilog

Image
Image

Faceți clic pe „Porniți compilarea”. Dacă nu este afișat niciun mesaj de eroare, accesați „Programator” pentru a finaliza configurarea hardware. Nu uitați să actualizați fișierul pof în „Schimbați fișierul”, dacă este necesar. Faceți clic pe „Start” pentru a încărca codul.

La urma urmei, ar trebui să vedeți că servomotorul este rotit periodic.