ในบทช่วยสอนนี้เราจะพูดถึงและออกแบบวงจรสำหรับการวัดระยะทาง วงจรนี้จะถูกพัฒนาโดยการเชื่อมต่อเซ็นเซอร์อัลตราโซนิก“HC-SR04” กับ AVR ไมโครคอนโทรลเลอร์ เซ็นเซอร์นี้ใช้เทคนิคที่เรียกว่า“ ECHO” ซึ่งเป็นสิ่งที่คุณจะได้รับเมื่อเสียงสะท้อนกลับหลังจากกระทบกับพื้นผิว
เราทราบดีว่าการสั่นของเสียงไม่สามารถทะลุผ่านของแข็งได้ สิ่งที่เกิดขึ้นก็คือเมื่อแหล่งกำเนิดเสียงสร้างการสั่นสะเทือนพวกมันเดินทางผ่านอากาศด้วยความเร็ว 220 เมตรต่อวินาที การสั่นสะเทือนเหล่านี้เมื่อมาบรรจบกับหูเราจะอธิบายว่าเป็นเสียง ดังที่ได้กล่าวไว้ก่อนหน้านี้การสั่นสะเทือนเหล่านี้ไม่สามารถผ่านของแข็งได้ดังนั้นเมื่อกระทบกับพื้นผิวเหมือนกำแพงพวกมันจะสะท้อนกลับด้วยความเร็วเท่ากันไปยังแหล่งกำเนิดซึ่งเรียกว่าเสียงสะท้อน
เซ็นเซอร์อัลตราโซนิก“ HC-SR04”ให้สัญญาณเอาต์พุตตามสัดส่วนกับระยะทางตามเสียงสะท้อน เซ็นเซอร์ที่นี่จะสร้างการสั่นสะเทือนของเสียงในช่วงอัลตราโซนิกเมื่อทำการกระตุ้นหลังจากนั้นจะรอให้การสั่นสะเทือนของเสียงกลับมา ตอนนี้ขึ้นอยู่กับพารามิเตอร์ความเร็วเสียง (220m / s) และเวลาที่ใช้เพื่อให้เสียงสะท้อนไปถึงแหล่งกำเนิดจะให้พัลส์เอาต์พุตตามสัดส่วนกับระยะทาง
ดังแสดงในรูปในตอนแรกเราต้องเริ่มต้นเซ็นเซอร์สำหรับการวัดระยะทางนั่นคือสัญญาณลอจิกสูงที่ขาทริกเกอร์ของเซ็นเซอร์มากกว่า 10uS หลังจากนั้นการสั่นสะเทือนของเสียงจะถูกส่งโดยเซ็นเซอร์หลังจากเสียงสะท้อนเซ็นเซอร์จะให้ สัญญาณที่ขาเอาต์พุตซึ่งมีความกว้างเป็นสัดส่วนกับระยะห่างระหว่างแหล่งกำเนิดและสิ่งกีดขวาง
ระยะทางนี้คำนวณเป็นระยะทาง (ซม.) = ความกว้างของเอาต์พุตพัลส์ (เป็น uS) / 58
ที่นี่ความกว้างของสัญญาณจะต้องใช้หลาย uS (ไมโครวินาทีหรือ 10 ^ -6)
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์: ATMEGA32, แหล่งจ่ายไฟ (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), ตัวเก็บประจุ 1000uF, ตัวต้านทาน10KΩ (2 ชิ้น), เซ็นเซอร์ HC-SR04
ซอฟต์แวร์: Atmel studio 6.1, progisp หรือ flash magic
แผนภาพวงจรและคำอธิบายการทำงาน
ที่นี่เรากำลังใช้ PORTB เพื่อเชื่อมต่อกับพอร์ตข้อมูล LCD (D0-D7) ใครก็ตามที่ไม่ต้องการทำงานกับ FUSE BITS ของ ATMEGA32A ไม่สามารถใช้ PORTC ได้เนื่องจาก PORTC มีการสื่อสารชนิดพิเศษซึ่งสามารถปิดใช้งานได้โดยการเปลี่ยน FUSEBITS เท่านั้น
ในวงจรคุณสังเกตว่าฉันใช้พินควบคุมเพียงสองอันทำให้เกิดความยืดหยุ่นในการทำความเข้าใจ ไม่ได้ใช้บิตคอนทราสต์และ READ / WRITE บ่อยนักดังนั้นจึงสามารถย่อลงมาที่พื้นได้ ทำให้ LCD มีคอนทราสต์สูงสุดและโหมดอ่าน เราต้องควบคุมพิน ENABLE และ RS เพื่อส่งอักขระและข้อมูลตามนั้น
การเชื่อมต่อที่ทำกับ LCD มีดังต่อไปนี้:
PIN1 หรือ VSS ลงกราวด์
PIN2 หรือ VDD หรือ VCC ถึง + 5v
PIN3 หรือ VEE กับพื้น (ให้ความเปรียบต่างสูงสุดที่ดีที่สุดสำหรับผู้เริ่มต้น)
PIN4 หรือ RS (Register Selection) ถึง PD6 ของ uC
PIN5 หรือ RW (อ่าน / เขียน) ลงกราวด์ (ทำให้ LCD อยู่ในโหมดอ่านช่วยให้การสื่อสารสำหรับผู้ใช้ง่ายขึ้น)
PIN6 หรือ E (เปิดใช้งาน) ถึง PD5 ของ uC
PIN7 หรือ D0 ถึง PB0 ของ uC
PIN8 หรือ D1 ถึง PB1 ของ uC
PIN9 หรือ D2 ถึง PB2 ของ uC
PIN10 หรือ D3 ถึง PB3 ของ uC
PIN11 หรือ D4 ถึง PB4 ของ uC
PIN12 หรือ D5 ถึง PB5 ของ uC
PIN13 หรือ D6 ถึง PB6 ของ uC
PIN14 หรือ D7 ถึง PB7 ของ uC
ในวงจรคุณจะเห็นว่าเราใช้การสื่อสาร 8 บิต (D0-D7) แต่นี่ไม่ใช่ภาคบังคับและเราสามารถใช้การสื่อสาร 4 บิต (D4-D7) แต่ด้วยโปรแกรมการสื่อสาร 4 บิตจะซับซ้อนเล็กน้อย ดังที่แสดงในตารางด้านบนเรากำลังเชื่อมต่อ 10 พินของ LCD เข้ากับคอนโทรลเลอร์ซึ่ง 8 พินเป็นพินข้อมูลและ 2 พินสำหรับควบคุม
เซ็นเซอร์อัลตราโซนิกเป็นอุปกรณ์สี่พิน PIN1- VCC หรือ + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- พื้นดิน Trigger pin คือจุดที่เราให้ trigger เพื่อบอกให้เซนเซอร์วัดระยะ Echo คือพินเอาต์พุตที่เราได้ระยะทางในรูปแบบของความกว้างของพัลส์ ขาก้องที่นี่เชื่อมต่อกับคอนโทรลเลอร์เป็นแหล่งสัญญาณขัดจังหวะภายนอก ดังนั้นเพื่อให้ได้ความกว้างของเอาต์พุตสัญญาณขาสะท้อนของเซ็นเซอร์จะเชื่อมต่อกับ INT0 (ขัดจังหวะ 0) หรือ PD2
1. เรียกใช้เซ็นเซอร์โดยดึงขาไกขึ้นสำหรับอย่างน้อย 12uS
2. เมื่อเสียงสะท้อนสูงขึ้นเราจะได้รับอินเทอร์รัปต์ภายนอกและเราจะเริ่มตัวนับ (การเปิดใช้งานตัวนับ) ใน ISR (Interrupt Service Routine) ซึ่งจะดำเนินการทันทีหลังจากทริกเกอร์อินเทอร์รัปต์
3. เมื่อเสียงสะท้อนต่ำอีกครั้งจะเกิดการขัดจังหวะครั้งนี้เราจะหยุดตัวนับ (ปิดการใช้งานตัวนับ)
4. ดังนั้นสำหรับพัลส์สูงไปต่ำที่ขาก้องเราได้เริ่มตัวนับและหยุดมัน จำนวนนี้ได้รับการอัปเดตเป็นหน่วยความจำสำหรับการหาระยะทางเนื่องจากเรามีความกว้างของเสียงสะท้อนอยู่ในขณะนี้
5. เราจะทำการคำนวณเพิ่มเติมในหน่วยความจำเพื่อให้ได้ระยะทางเป็นซม
6. ระยะทางจะแสดงบนจอ LCD 16x2
สำหรับการตั้งค่าคุณสมบัติข้างต้นเราจะตั้งค่าการลงทะเบียนต่อไปนี้:
ต้องตั้งค่าการลงทะเบียนสามรายการข้างต้นเพื่อให้การตั้งค่าใช้งานได้และเราจะพูดถึงสั้น ๆ
BLUE (INT0): ต้องตั้งค่าบิตนี้ให้สูงเพื่อเปิดใช้งานอินเทอร์รัปต์ภายนอก 0 เมื่อตั้งพินนี้แล้วเราจะรับรู้ถึงการเปลี่ยนแปลงตรรกะที่พิน PIND2
BROWN (ISC00, ISC01): บิตทั้งสองนี้ได้รับการปรับเพื่อการเปลี่ยนแปลงตรรกะที่เหมาะสมที่ PD2 ซึ่งจะถือว่าเป็นการขัดจังหวะ
ดังที่กล่าวไว้ก่อนหน้านี้เราจำเป็นต้องมีการขัดจังหวะเพื่อเริ่มการนับและหยุดมัน ดังนั้นเราจึงตั้ง ISC00 เป็นหนึ่งและเราจะได้รับการขัดจังหวะเมื่อมีลอจิก LOW ถึง HIGH ที่ INT0; ขัดจังหวะอีกครั้งเมื่อมีลอจิกสูงถึงต่ำ
RED (CS10): บิตนี้ใช้เพื่อเปิดใช้งานและปิดใช้งานตัวนับ แม้ว่ามันจะทำงานร่วมกับบิตอื่น ๆ CS10, CS12 เราไม่ได้ทำการ prescaling ใด ๆ ที่นี่ดังนั้นเราไม่จำเป็นต้องกังวลกับพวกเขา
สิ่งสำคัญบางประการที่ต้องจำไว้คือ:
เราใช้นาฬิกาภายในของ ATMEGA32A ซึ่งเป็น 1MHz ไม่มีการกำหนดขนาดล่วงหน้าที่นี่เราไม่ได้ทำการเปรียบเทียบการขัดจังหวะการจับคู่สร้างรูทีนดังนั้นจึงไม่มีการตั้งค่าการลงทะเบียนที่ซับซ้อน
ค่าการนับหลังจากการนับจะถูกเก็บไว้ในทะเบียน 16 บิต TCNT1
ตรวจสอบโครงการนี้ด้วย arduino: การวัดระยะทางโดยใช้ Arduino
คำอธิบายการเขียนโปรแกรม
การทำงานของเซ็นเซอร์วัดระยะทางอธิบายทีละขั้นตอนในโปรแกรม C ด้านล่าง
#include // header เพื่อเปิดใช้งานการควบคุมการไหลของข้อมูลบนพิน #define F_CPU 1000000 // บอกความถี่คริสตัลคอนโทรลเลอร์ที่แนบมา #include