ได้แก้ไขโค้ดใหม่ทั้งหมดได้ดังนี้
Count_output
ทำงานโดยแบ่งเป็น 2 state
- countTrig คือสร้างสัญญาณ trigger ความกว้าง 20 us หรือ 1000 clk เพื่อให้ ultrasonic ทำงาน (ส่งใหม่ทุกๆ 1วินาที)
- countEcho เมื่อ logic ใน echo_in เป็น 1 จะเริ่มนับจำนวน clk ไปเรื่อยๆ และเมื่อครบ 1 วินาทีก็จะทำการ latch ค่าที่ได้ออกเป็น output เลข binary 21 bit
Distance2ASCII
รับค่าเวลาที่เป็น binary 21 bit และเข้าสูตรหาระยะทาง โดยนำเวลาไปหาร 2941 (ค่าคงที่สำหรับหาเวลา ที่ system speed 50MHz) หลักจากนั้นก็นำไป mod เพื่อแยกเอาเลขแต่ละหลักมาหาค่า ASCII และ นำผลลัพธ์ที่ได้ออกเป็น output 3 หลัก ร้อย สิบ หน่วย
LCD
โค้ดส่วนนี้จะควบคุมการแสดงผลของจอ LCD โดยอ้างอิงจาก
LCD_Demo
เป็นส่วนควบคุมการทำงานของ lcd 16x2 แบ่งเป็น 2 ส่วนคือส่วนหลักและส่วนที่นำมาเขียนใช้งาน (ที่มา ip core: http://opencores.org/project,16x2_lcd_controller) ในส่วนของ code ส่วนหลัก จะมีบรรทัดที่มีลักษณะแบบนี้ เป็นค่าที่จะไปแสดงผลมีทั้งหมด 2 line เราจึงทำการแก้ไขเอาค่า ASCII ที่ได้มาใส่เพื่อให้แสดงผล Ultrasonic ได้ทั้ง 4 channal
line1(127 downto 120) <= X"20";
line1(119 downto 112) <= X"20";
line1(111 downto 104) <= X"48"; -- H
line1(103 downto 96) <= X"65"; -- e
line1(95 downto 88) <= X"6c"; -- l
line1(87 downto 80) <= X"6c"; -- l
line1(79 downto 72) <= X"6f"; -- o
line1(71 downto 64) <= X"20";
- โค้ด count_output
-โค้ด Distance2ASCII
-โค้ด LCD
-LCD_demo
-โค้ด Ultrasonic
ผลการทดลอง
รูปวงจร Ultrasonic 4 channal ที่ได้ต่อ ขณะทำการทดลอง
รูปแสดงค่าระยะทางที่วัดได้จาก Ultrasonic 4 channal บน LCD 16x2
รูปภาพวัดสัญญาณ Ultrasonic 1 channal โดยเครื่องวัดสัญญาณ Oscilloscope
Link Video: