- วัสดุที่ต้องการ:
- การคำนวณความเร็วและระยะทางที่ครอบคลุม:
- แผนภาพวงจรและการตั้งค่าฮาร์ดแวร์:
- จำลองสถานการณ์:
- การเขียนโปรแกรม PIC16F877A ของคุณ:
- คำอธิบายการทำงาน:
การวัดความเร็ว / รอบต่อนาทีของยานพาหนะหรือมอเตอร์เป็นโครงการที่น่าสนใจสำหรับเราเสมอมา ดังนั้นในโครงการนี้เราจะสร้างขึ้นโดยใช้ไมโครคอนโทรลเลอร์ PIC ที่พร้อมสำหรับอุตสาหกรรม เราจะใช้ชิ้นส่วนของแม่เหล็กและ Hall Sensor เพื่อวัดความเร็ว มีวิธีอื่น / เซ็นเซอร์ในการวัดความเร็ว แต่การใช้เซ็นเซอร์ฮอลล์นั้นมีราคาถูกและยังสามารถใช้กับรถยนต์ / ยานพาหนะทุกประเภท การทำโครงการนี้จะช่วยเพิ่มทักษะในการเรียนรู้ PIC16F877A เนื่องจากโครงการนี้เกี่ยวข้องกับการใช้อินเทอร์รัปต์และตัวจับเวลา ในตอนท้ายของโครงการนี้คุณจะสามารถคำนวณความเร็วและระยะทางที่ครอบคลุมโดยวัตถุหมุนใด ๆ และแสดงบนหน้าจอ LCD 16x2 ให้เริ่มต้นด้วยนี้ดิจิตอล Speedometer และวัดระยะทางวงจรกับ PIC
วัสดุที่ต้องการ:
- PIC16F877A
- 7805 ตัวควบคุมแรงดันไฟฟ้า
- ฮอลล์เอฟเฟกต์เซนเซอร์ (US1881 / 04E)
- จอ LCD 16 * 2
- แม่เหล็กชิ้นเล็ก ๆ
- การเชื่อมต่อสายไฟ
- คาปาซิเตอร์
- เขียงหั่นขนม.
- แหล่งจ่ายไฟ
การคำนวณความเร็วและระยะทางที่ครอบคลุม:
ก่อนที่เราจะเริ่มสร้างวงจรจริงให้เราเข้าใจว่าเราจะใช้เซ็นเซอร์ Hall และแม่เหล็กในการคำนวณความเร็วของล้ออย่างไร ก่อนหน้านี้เราได้ใช้เทคนิคเดียวกันในการสร้าง Arduino Speedometer ซึ่งแสดงการอ่านบนสมาร์ทโฟน Android
เซ็นเซอร์ Hallเป็นอุปกรณ์ที่สามารถตรวจจับการมีอยู่ของแม่เหล็กตามขั้วของมัน เราติดแม่เหล็กชิ้นเล็ก ๆ บนล้อและวางเซ็นเซอร์ฮอลล์ไว้ใกล้ ๆ ในลักษณะที่ทุกครั้งที่ล้อหมุนเซ็นเซอร์ฮอลล์จะตรวจจับได้ จากนั้นเราใช้ความช่วยเหลือของตัวจับเวลาและอินเทอร์รัปต์บนไมโครคอนโทรลเลอร์ PIC ของเราเพื่อคำนวณเวลาที่ใช้ในการหมุนวงล้อหนึ่งครั้ง
เมื่อทราบเวลาที่ใช้แล้วเราสามารถคำนวณ RPM ได้โดยใช้สูตรด้านล่างโดยที่ 1000 / เวลาที่ใช้จะให้ RPS แก่เราและการคูณด้วย 60 จะทำให้คุณได้ RPM
รอบต่อนาที = (1,000 / เวลาถ่าย) * 60;
โดยที่ (1,000 / ตารางเวลา) ให้ rps (รอบต่อวินาที) และคูณด้วย 60 เพื่อแปลง rps เป็นรอบต่อนาที (รอบต่อนาที)
ตอนนี้ในการคำนวณความเร็วของยานพาหนะเราต้องรู้รัศมีของล้อ ในโครงการของเราเราได้ใช้ล้อของเล่นขนาดเล็กที่มีรัศมีเพียง 3 ซม. แต่เราคิดว่ารัศมีของวงล้อคือ 30 ซม. (0.3 ม.) เพื่อให้เราเห็นภาพการอ่าน
ค่านี้จะคูณด้วย 0.37699 เนื่องจากเรารู้ว่าVelocity = (RPM (เส้นผ่านศูนย์กลาง * Pi) / 60) สูตรถูกทำให้ง่ายขึ้นเป็น
v = radius_of_wheel * รอบต่อนาที * 0.37699;
เมื่อเราคำนวณความเร็วแล้วเรายังสามารถคำนวณระยะทางที่ครอบคลุมได้โดยใช้วิธีการที่คล้ายกัน ด้วยการจัดฮอลล์และแม่เหล็กทำให้เรารู้ว่าล้อหมุนกี่ครั้งแล้ว นอกจากนี้เรายังทราบรัศมีของวงล้อโดยใช้ซึ่งเราสามารถหาเส้นรอบวงของล้อได้โดยสมมติว่ารัศมีของวงล้อเท่ากับ 0.3m (R) ค่าของเส้นรอบวง Pi * R * R จะเท่ากับ 0.2827 ซึ่งหมายความว่าทุกครั้งที่เซ็นเซอร์ฮอลล์พบกับแม่เหล็กระยะ 0.2827 เมตรจะถูกบังด้วยล้อ
Distance_covered = distance_covered + circumference_of_the_circle
เนื่องจากตอนนี้เรารู้แล้วว่าโครงการนี้จะทำงานอย่างไรให้ดำเนินการต่อไปยังแผนภาพวงจรของเราและเริ่มสร้างมัน
แผนภาพวงจรและการตั้งค่าฮาร์ดแวร์:
แผนภาพวงจรของโครงการมาตรวัดความเร็วและเครื่องวัดระยะทางนี้ง่ายมากและสามารถสร้างบนเขียงหั่นขนม หากคุณทำตามบทช่วยสอน PIC คุณสามารถนำฮาร์ดแวร์ที่เราใช้ในการเรียนรู้ไมโครคอนโทรลเลอร์ PIC กลับมาใช้ใหม่ได้ ที่นี่เราได้ใช้บอร์ด perfเดียวกันกับที่เราสร้างขึ้นสำหรับ LED กะพริบด้วยไมโครคอนโทรลเลอร์ PIC ดังที่แสดงด้านล่าง:
การเชื่อมต่อพินสำหรับ MCU PIC16F877A มีให้ในตารางด้านล่าง
ส. ไม่: |
หมายเลขพิน |
ชื่อพิน |
เชื่อมต่อกับ |
1 |
21 |
RD2 |
RS ของ LCD |
2 |
22 |
RD3 |
E ของ LCD |
3 |
27 |
RD4 |
D4 ของ LCD |
4 |
28 |
RD5 |
D5 ของ LCD |
5 |
29 |
RD6 |
D6 ของ LCD |
6 |
30 |
RD7 |
D7 ของ LCD |
7 |
33 |
RB0 / INT |
3 rd pin ของ Hall sensor |
เมื่อคุณสร้างโครงการของคุณควรมีลักษณะดังนี้ในภาพด้านล่าง
อย่างที่คุณเห็นฉันใช้สองกล่องเพื่อวางมอเตอร์และเซ็นเซอร์ห้องโถงในตำแหน่งใกล้เคียง คุณสามารถยึดแม่เหล็กบนวัตถุที่กำลังหมุนของคุณและทำให้เซ็นเซอร์ห้องโถงอยู่ใกล้กับมันในลักษณะที่สามารถตรวจจับแม่เหล็กได้
หมายเหตุ: เซ็นเซอร์ฮอลล์มีขั้วดังนั้นตรวจสอบให้แน่ใจว่าตรวจจับขั้วใดและวางตาม
ตรวจสอบให้แน่ใจว่าคุณใช้ตัวต้านทานแบบดึงขึ้นกับขาเอาต์พุตของเซ็นเซอร์ฮอลล์
จำลองสถานการณ์:
การจำลองสำหรับโครงการนี้ทำโดยใช้ Proteus เนื่องจากโครงการเกี่ยวข้องกับการเคลื่อนย้ายวัตถุจึงไม่สามารถสาธิตโครงการทั้งหมดโดยใช้การจำลองได้ แต่สามารถตรวจสอบการทำงานของ LCD ได้ เพียงแค่โหลดไฟล์ฐานสิบหกไปที่ Simulation และทำการจำลอง คุณจะสังเกตเห็นการทำงานของ LCD ดังที่แสดงด้านล่าง
ในการตรวจสอบมาตรวัดความเร็วและมาตรวัดระยะทางใช้งานได้ฉันได้เปลี่ยนเซ็นเซอร์ Hall ด้วยอุปกรณ์สถานะลอจิก ในระหว่างการจำลองคุณสามารถคลิกที่ปุ่มสถานะลอจิกเพื่อเรียกใช้การขัดจังหวะและตรวจสอบว่าความเร็วและระยะทางที่ครอบคลุมกำลังได้รับการอัปเดตตามที่แสดงด้านบนหรือไม่
การเขียนโปรแกรม PIC16F877A ของคุณ:
ดังที่ได้กล่าวไว้ก่อนหน้านี้เราจะใช้ความช่วยเหลือของตัวจับเวลาและอินเทอร์รัปต์ในไมโครคอนโทรลเลอร์ PIC16F877A เพื่อคำนวณเวลาที่ใช้ในการหมุนวงล้อหนึ่งครั้ง เราได้เรียนรู้วิธีใช้ตัวจับเวลาในบทช่วยสอนของเราแล้ว ฉันให้รหัสทั้งหมดของโครงการในตอนท้ายของบทความนี้ นอกจากนี้ฉันได้อธิบายบรรทัดสำคัญสองสามข้อด้านล่าง
บรรทัดด้านล่างของโค้ดเริ่มต้นพอร์ต D เป็นพินเอาต์พุตสำหรับการเชื่อมต่อ LCD และ RB0 เป็นพินอินพุตสำหรับใช้เป็นพินภายนอก นอกจากนี้เราได้เปิดใช้งานตัวต้านทานแบบดึงขึ้นภายในโดยใช้ OPTION_REG และได้ตั้งค่า 64 เป็นพรีเซล จากนั้นเราจะเปิดใช้งาน Global และ Peripheral Interrupt เพื่อเปิดใช้งาน Timer และ External Interrupt ในการกำหนด RB0 เป็น INTE บิตอินเตอร์รัปต์ภายนอกควรทำให้สูง Overflow คือค่าถูกตั้งค่าเป็น 100 เพื่อให้ทุก ๆ 1 มิลลิวินาทีแฟล็กการขัดจังหวะตัวจับเวลา TMR0IF จะถูกทริกเกอร์ สิ่งนี้จะช่วยในการเรียกใช้ตัวจับเวลามิลลิวินาทีเพื่อกำหนดเวลาที่ใช้ในหน่วยมิลลิวินาที:
TRISD = 0x00; // PORTD ประกาศเป็นเอาต์พุตสำหรับเชื่อมต่อ LCD TRISB0 = 1; // กำหนดพิน RB0 เป็นอินพุตเพื่อใช้เป็นพินขัดจังหวะ OPTION_REG = 0b00000101; // Timer0 64 เป็น prescalar // เปิดใช้งาน PULL UPs TMR0 = 100; // โหลดค่าเวลา 1ms; delayValue สามารถอยู่ระหว่าง 0-256 เท่านั้น TMR0IE = 1; // เปิดใช้งานบิตขัดจังหวะตัวจับเวลาใน PIE1 register GIE = 1; // เปิดใช้งาน Global Interrupt PEIE = 1; // เปิดใช้งาน Peripheral Interrupt INTE = 1; // เปิดใช้งาน RB0 เป็นพินขัดจังหวะภายนอก
ฟังก์ชันด้านล่างจะถูกเรียกใช้งานทุกครั้งที่ตรวจพบการขัดจังหวะ เราสามารถตั้งชื่อฟังก์ชั่นได้ตามความต้องการของเราดังนั้นฉันจึงตั้งชื่อเป็น speed_isr () โปรแกรมนี้เกี่ยวข้องกับสองอินเทอร์รัปต์หนึ่งคือไทเมอร์อินเตอร์รัปต์และอีกอันคืออินเตอร์รัปต์ภายนอก เมื่อใดก็ตามที่ Timer Interrupt เกิดขึ้นแฟล็ก TMR0IF จะสูงขึ้นเพื่อล้างและรีเซ็ตการขัดจังหวะเราต้องทำให้ต่ำโดยกำหนด TMR0IF = 0 ดังที่แสดงในโค้ดด้านล่าง
เป็นโมฆะ interrupt speed_isr () {if (TMR0IF == 1) // Timer overflown {TMR0IF = 0; // ล้างค่าสถานะขัดจังหวะตัวจับเวลา milli_sec ++; } ถ้า (INTF == 1) {rpm = (1,000 / milli_sec) * 60; ความเร็ว = 0.3 * รอบต่อนาที * 0.37699; // (สมมติว่ารัศมีวงล้อเป็น 30 ซม.) INTF = 0; // ล้างค่าสถานะขัดจังหวะ milli_sec = 0; ระยะทาง = ระยะทาง + 028.2; }}
ในทำนองเดียวกันเมื่อการขัดจังหวะภายนอกเกิดขึ้นแฟล็ก INTF จะสูงขึ้นสิ่งนี้ควรถูกล้างด้วยการกำหนด INTF = 0 เวลาที่ใช้จะถูกติดตามโดย Timer Interrupt และ External Interrupt จะกำหนดเมื่อวงล้อเสร็จสิ้นการหมุนเต็มหนึ่งครั้ง ด้วยข้อมูลนี้ความเร็วและระยะทางที่ครอบคลุมโดยวงล้อจะถูกคำนวณระหว่างการขัดจังหวะภายนอกทุกครั้ง
เมื่อคำนวณความเร็วและระยะทางแล้วก็สามารถแสดงบนหน้าจอ LCD โดยใช้ฟังก์ชัน LCD ของเรา หากคุณยังใหม่กับ LCD โปรดดูการเชื่อมต่อ LCD ของเรากับบทแนะนำ PIC16F877A MCU
คำอธิบายการทำงาน:
หลังจากที่คุณเตรียมฮาร์ดแวร์และซอฟต์แวร์ให้พร้อมแล้วเพียงแค่อัปโหลดรหัสไปยัง PIC16F877A ของคุณ หากคุณยังใหม่กับ PIC คุณควรต้องอ่านบทช่วยสอนสองสามข้อเกี่ยวกับการรู้วิธีอัปโหลดโปรแกรมไปยังไมโครคอนโทรลเลอร์ PIC16F877A
ฉันใช้ POT ตัวแปรเพื่อปรับความเร็วของมอเตอร์เพื่อการสาธิต คุณยังสามารถใช้แอปพลิเคชันค้นหาแบบเรียลไทม์ได้ หากทุกอย่างเป็นไปตามที่คาดไว้คุณควรจะได้รับ Velocity ใน Km / Hr และระยะทางครอบคลุมในรูปของเมตรดังที่แสดงในวิดีโอด้านล่าง
หวังว่าคุณจะสนุกกับโครงการและทำให้มันใช้งานได้ หากไม่มีคุณสามารถใช้ส่วนความคิดเห็นด้านล่างหรือในฟอรัมเพื่อโพสต์ข้อสงสัยของคุณ