ในโครงการนี้เราจะออกแบบวงจรสำหรับวัดอุณหภูมิ วงจรนี้ได้รับการพัฒนาโดยใช้“ LM35 ” ซึ่งเป็นเซ็นเซอร์แรงดันไฟฟ้าเชิงเส้น โดยปกติอุณหภูมิจะวัดเป็น "เซนติเกรด" หรือ "ฟาราไฮต์" เซ็นเซอร์“ LM35” ให้เอาต์พุตตามมาตราส่วนของเซนติเกรด
LM35 เป็นทรานซิสเตอร์สามพินเหมือนอุปกรณ์ มี VCC, GND และ OUTPUT เซ็นเซอร์นี้ให้แรงดันไฟฟ้าผันแปรที่เอาต์พุตตามอุณหภูมิ
ดังที่แสดงในรูปด้านบนสำหรับทุก ๆ อุณหภูมิที่เพิ่มขึ้น +1 องศาเซลเซียสจะมีเอาต์พุตที่สูงขึ้น + 10mV ดังนั้นหากอุณหภูมิเป็น0◦องศาเซลเซียสเอาต์พุตของเซ็นเซอร์จะเป็น 0V ถ้าอุณหภูมิ 10 is องศาเซลเซียสเอาต์พุตของเซ็นเซอร์จะเป็น + 100mV หากอุณหภูมิ 25 is องศาเซลเซียสเอาต์พุตของเซ็นเซอร์จะเป็น + 250mV
ตอนนี้ด้วย LM35 เราได้รับอุณหภูมิในรูปของแรงดันไฟฟ้าผันแปร แรงดันไฟฟ้าขึ้นอยู่กับอุณหภูมินี้กำหนดให้เป็นอินพุตไปยัง ADC (ตัวแปลงอนาล็อกเป็นดิจิตอล) ของ ATMEGA32A ค่าดิจิตอลหลังการแปลงที่ได้รับจะแสดงใน LCD 16x2 เป็นอุณหภูมิ
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์: ATMEGA32 ไมโครคอนโทรลเลอร์, แหล่งจ่ายไฟ (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), ตัวเก็บประจุ 100uF (สองชิ้น), ตัวเก็บประจุ 100nF, เซ็นเซอร์อุณหภูมิ LM35
ซอฟต์แวร์: Atmel studio 6.1, progisp หรือ flash magic
แผนภาพวงจรและคำอธิบาย
ในวงจร PORTB ของ ATMEGA32 เชื่อมต่อกับพอร์ตข้อมูลของ LCD ที่นี่อย่าลืมปิดการใช้งานการสื่อสาร JTAG ใน PORTC ot ATMEGA โดยการเปลี่ยนฟิวส์ไบต์หากต้องการใช้ PORTC เป็นพอร์ตการสื่อสารปกติ ในจอ LCD 16x2 จะมีหมุดทั้งหมด 16 พินหากมีไฟด้านหลังหากไม่มีไฟส่องหลังจะมี 14 พิน หนึ่งสามารถจ่ายไฟหรือปล่อยหมุดไฟด้านหลัง ตอนนี้ใน 14 พินมีพินข้อมูล 8 พิน (7-14 หรือ D0-D7), พินแหล่งจ่ายไฟ 2 พิน (1 & 2 หรือ VSS & VDD หรือ gnd & + 5v), พิน3 rdสำหรับควบคุมคอนทราสต์ (VEE- ควบคุมความหนาของตัวอักษร แสดง), 3 พินควบคุม (RS & RW & E)
ในวงจรคุณสามารถสังเกตได้ว่าฉันใช้พินควบคุมเพียงสองอันเนื่องจากทำให้เกิดความยืดหยุ่นในการทำความเข้าใจ ไม่ได้ใช้บิตคอนทราสต์และ 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 บิตจะซับซ้อนเล็กน้อยดังนั้นฉันจึงเลือก 8 บิต การสื่อสาร.
ดังนั้นจากการสังเกตจากตารางด้านบนเรากำลังเชื่อมต่อ 10 พินของ LCD เข้ากับคอนโทรลเลอร์ซึ่ง 8 พินเป็นพินข้อมูลและ 2 พินสำหรับควบคุม เอาท์พุทแรงดันไฟฟ้าที่มาจากเซ็นเซอร์ไม่เป็นเส้นตรงอย่างสมบูรณ์ มันจะมีเสียงดัง ในการกรองสัญญาณรบกวนจำเป็นต้องวางคาปาซิเตอร์ไว้ที่เอาต์พุตของเซ็นเซอร์ดังแสดงในรูป
ก่อนที่จะก้าวไปข้างหน้าเราต้องพูดถึง ADC ของ ATMEGA32A ใน ATMEGA32A เราสามารถให้อินพุตอนาล็อกกับ PORTA แปดช่องทางใดก็ได้ไม่สำคัญว่าเราจะเลือกช่องใดเพราะทั้งหมดจะเหมือนกัน เราจะเลือกช่อง 0 หรือ PIN0 ของ PORTA ใน ATMEGA32A ADC มีความละเอียด 10 บิตดังนั้นคอนโทรลเลอร์จึงสามารถตรวจจับการเปลี่ยนแปลงขั้นต่ำของ Vref / 2 ^ 10 ได้ดังนั้นหากแรงดันอ้างอิงคือ 5V เราจะได้รับการเพิ่มเอาต์พุตดิจิตอลทุกๆ 5/2 ^ 10 = 5mV. ดังนั้นสำหรับทุกๆ 5mV ที่เพิ่มขึ้นในอินพุตเราจะเพิ่มขึ้นหนึ่งครั้งที่เอาต์พุตดิจิตอล
ตอนนี้เราต้องตั้งค่าการลงทะเบียนของ ADC ตามเงื่อนไขต่อไปนี้:
1. ก่อนอื่นเราต้องเปิดใช้งานคุณสมบัติ ADC ใน ADC
2. เนื่องจากเรากำลังวัดอุณหภูมิห้องเราจึงไม่ต้องการค่าที่สูงเกินกว่าร้อยองศา (เอาต์พุต 1000mV ของ LM35) ดังนั้นเราสามารถตั้งค่าสูงสุดหรือการอ้างอิงของ ADC เป็น 2.5V
3. คอนโทรลเลอร์มีคุณสมบัติการแปลงทริกเกอร์ซึ่งหมายความว่าการแปลง ADC จะเกิดขึ้นหลังจากทริกเกอร์ภายนอกเท่านั้นเนื่องจากเราไม่ต้องการให้เราต้องตั้งค่าการลงทะเบียนเพื่อให้ ADC ทำงานในโหมดการทำงานฟรีอย่างต่อเนื่อง
4. สำหรับ ADC ใด ๆ ความถี่ของการแปลง (ค่าอนาล็อกเป็นค่าดิจิตอล) และความแม่นยำของเอาต์พุตดิจิตอลจะแปรผกผัน ดังนั้นเพื่อความแม่นยำที่ดีขึ้นของเอาต์พุตดิจิตอลเราต้องเลือกความถี่ที่น้อยกว่า สำหรับนาฬิกา ADC ที่น้อยกว่าเรากำลังตั้งค่าการขายล่วงหน้าของ ADC เป็นค่าสูงสุด (128) เนื่องจากเราใช้นาฬิกาภายใน 1MHZ นาฬิกาของ ADC จะเป็น (1000000/128)
นี่เป็นเพียงสี่สิ่งที่เราต้องรู้เพื่อเริ่มต้นใช้งาน ADC คุณสมบัติทั้งสี่ประการข้างต้นถูกกำหนดโดยการลงทะเบียนสองรายการ
RED (ADEN): ต้องตั้งค่าบิตนี้เพื่อเปิดใช้งานคุณลักษณะ ADC ของ ATMEGA
BLUE (REFS1, REFS0): บิตทั้งสองนี้ใช้เพื่อกำหนดแรงดันอ้างอิง (หรือแรงดันไฟฟ้าขาเข้าสูงสุดที่เราจะให้) เนื่องจากเราต้องการมีแรงดันไฟฟ้าอ้างอิง 2.56V จึงควรตั้งค่า REFS0 และ REFS1 ทั้งคู่ตามตาราง
LIGHT GREEN (ADATE): ต้องตั้งค่าบิตนี้เพื่อให้ ADC ทำงานอย่างต่อเนื่อง (โหมดการทำงานฟรี)
PINK (MUX0-MUX4): บิตทั้งห้านี้ใช้สำหรับบอกช่องสัญญาณเข้า เนื่องจากเราจะใช้ ADC0 หรือ PIN0 เราจึงไม่จำเป็นต้องตั้งค่าบิตใด ๆ ตามตาราง
BROWN (ADPS0-ADPS2): บิตทั้งสามนี้ใช้สำหรับตั้งค่า prescalar สำหรับ ADC Sice เราใช้ prescalar เป็น 128 เราต้องตั้งค่าทั้งสามบิต
DARK GREEN (ADSC): บิตนี้ตั้งค่าสำหรับ ADC เพื่อเริ่มการแปลง บิตนี้สามารถปิดใช้งานได้ในโปรแกรมเมื่อเราต้องการหยุดการแปลง
ในการสร้างโปรเจ็กต์นี้กับ Arduino โปรดดูบทช่วยสอนนี้: เครื่องวัดอุณหภูมิดิจิตอลโดยใช้ Arduino
คำอธิบายการเขียนโปรแกรม
การทำงานของการวัดอุณหภูมิอธิบายได้ดีที่สุดทีละขั้นตอนของรหัส C ที่ระบุด้านล่าง:
#include // header เพื่อเปิดใช้งานการควบคุมโฟลว์ข้อมูลผ่านพิน
#define F_CPU 1000000 // บอกความถี่คริสตัลคอนโทรลเลอร์ที่แนบมา
# รวม
#define E 5 // ให้ชื่อ“เปิดใช้งาน” 5 THขา PORTD เพราะมันจะเชื่อมต่อกับจอแอลซีดีเปิดใช้งานขา
# กำหนดหมายเลข 6 // ให้ชื่อ“registerselection” ถึง 6 THขา PORTD ตั้งแต่การเชื่อมต่อกับจอแอลซีดีอาร์เอสพิน
โมฆะ send_a_command (คำสั่ง char ที่ไม่ได้ลงชื่อ);
โมฆะ send_a_character (อักขระถ่านที่ไม่ได้ลงชื่อ);
โมฆะ send_a_string (ถ่าน * string_of_characters);
int หลัก (โมฆะ)
{
DDRB = 0xFF; // วาง portB และ portD เป็นขาออก
DDRD = 0xFF;
_delay_ms (50); // ให้ดีเลย์ 50ms
DDRA = 0; // รับ portA เป็นอินพุต
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}