สารบัญ:

FPGA Cyclone IV DueProLogic ควบคุมเซอร์โวมอเตอร์: 4 ขั้นตอน
FPGA Cyclone IV DueProLogic ควบคุมเซอร์โวมอเตอร์: 4 ขั้นตอน

วีดีโอ: FPGA Cyclone IV DueProLogic ควบคุมเซอร์โวมอเตอร์: 4 ขั้นตอน

วีดีโอ: FPGA Cyclone IV DueProLogic ควบคุมเซอร์โวมอเตอร์: 4 ขั้นตอน
วีดีโอ: How to code Verilog for a servo! Using the basys2 FPGA board. 2024, พฤศจิกายน
Anonim
FPGA Cyclone IV DueProLogic ควบคุมเซอร์โวมอเตอร์
FPGA Cyclone IV DueProLogic ควบคุมเซอร์โวมอเตอร์

ในบทช่วยสอนนี้ เราจะเขียนโค้ด Verilog เพื่อควบคุมเซอร์โวมอเตอร์ เซอร์โว SG-90 ผลิตโดย Waveshare เมื่อคุณซื้อเซอร์โวมอเตอร์ คุณอาจได้รับแผ่นข้อมูลที่แสดงรายการแรงดันไฟฟ้าในการทำงาน แรงบิดสูงสุด และการปรับความกว้างพัลส์ (PWM) ที่เสนอ…เป็นต้น อย่างไรก็ตาม FPGA DuePrologic ให้แรงดันไฟฟ้าขาเข้า 3.3V โดยที่แรงดันไฟฟ้าในการทำงานของเซอร์โว SG-90 คือ 5V - 7V หากไม่มีพลังงานไฟฟ้า ฉันจะแสดงรายการ PWM ที่ปรับเทียบแล้วเพื่อหมุนเซอร์โวมอเตอร์ได้สำเร็จ

งานของเรา: เซอร์โวมอเตอร์หมุนไปมาในระยะเวลา 5 วินาที

เมนูเต็ม:

ขั้นตอนที่ 1: สร้างวงจรอิเล็กทรอนิกส์

สร้างวงจรไฟฟ้า
สร้างวงจรไฟฟ้า

ขั้นตอนที่ 2: ตั้งค่าพิน Planner

ตั้งค่าพิน Planner
ตั้งค่าพิน Planner

คลิก "เริ่มการวิเคราะห์การกำหนด I/O" เพื่อตรวจสอบว่าตัววางแผนพินได้รับการตั้งค่าอย่างถูกต้องหรือไม่ มิฉะนั้น คุณต้องนำเข้าชื่อพอร์ตทั้งหมดด้วยตัวเอง

ขั้นตอนที่ 3: รหัส Verilog

เราสร้างตัวจับเวลา "servo_count" เมื่อ "servo_A" สูง PWM จะเป็น 1.5ms ดังนั้นเซอร์โวจะอยู่ที่ 120 องศา ในทางตรงกันข้าม เมื่อ "servo_A" มีค่าต่ำ PWM จะเป็น 0.15ms ดังนั้นเซอร์โวจะอยู่ที่ 0 องศา

กำหนด XIO_2[3] = servo_pulse; //สำหรับวี

reg [31:0] servo_count;

เริ่มแรก

servo_count <= 32'b0;

servo_A <= 1'b0;

จบ

เสมอ @(โพสท่า CLK_66)

เริ่ม

servo_count <= servo_count + 1'b1;

if(servo_count > 400000000) //รอบนาฬิกา 66MHz, 1/66M * 400000000 ~ 5 วินาที

เริ่ม

servo_A <= !servo_A;

servo_count <= 32'b0;

จบ

จบ

reg [31:0] ex_auto;

เริ่มแรก

ex_auto <= 32'b0;

servo_auto <= 1'b0;

จบ

เสมอ @(โพสท่า CLK_66)

เริ่ม

ถ้า(servo_A==1'b1)

เริ่ม

ex_auto <= ex_auto + 1'b1;

if(ex_auto > 100000) //รอบนาฬิกา 66MHz, PWM นี้คือ ~1.5ms, เซอร์โวหมุนไปที่ 120 องศา

เริ่ม

servo_auto <= !servo_auto;

ex_auto <= 32'b0;

จบ

จบ

ถ้า(servo_A==1'b0)

เริ่ม

ex_auto <= ex_auto + 1'b1;

if(ex_auto > 10000) //รอบนาฬิกา 66MHz, PWM นี้คือ ~0.15ms, เซอร์โวหมุนไปที่ 0 องศา

เริ่ม

servo_auto <= !servo_auto;

ex_auto <= 32'b0;

จบ

จบ

จบ

ขั้นตอนที่ 4: อัปโหลดรหัส Verilog

Image
Image

คลิก "เริ่มการรวบรวม" หากไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น ให้ไปที่ "โปรแกรมเมอร์" เพื่อตั้งค่าฮาร์ดแวร์ให้เสร็จสิ้น อย่าลืมอัปเดตไฟล์ pof ใน "เปลี่ยนไฟล์" หากจำเป็น คลิก "เริ่ม" เพื่ออัปโหลดรหัส

ท้ายที่สุด คุณควรเห็นว่าเซอร์โวมอเตอร์ถูกหมุนเป็นระยะๆ

แนะนำ: