Sa proyektong ito ay magdidisenyo kami ng isang circuit para sa pagsukat ng temperatura. Ang circuit na ito ay binuo gamit ang " LM35 ", isang linear voltage sensor. Karaniwang sinusukat ang temperatura sa "Centigrade" o "Faraheite". Nagbibigay ang sensor na "LM35" batay sa sukat ng centigrade.
Ang LM35 ay tatlong pin transistor tulad ng aparato. Mayroon itong VCC, GND at OUTPUT. Nagbibigay ang sensor na ito ng variable boltahe sa output batay sa temperatura.
Tulad ng ipinakita sa itaas na pigura, para sa bawat +1 na pagtaas ng centigrade sa temperatura magkakaroon ng + 10mV na mas mataas na output. Kaya't kung ang temperatura ay 0◦centigrade ang output ng sensor ay magiging 0V, kung ang temperatura ay 10◦ centigrade ang output ng sensor ay magiging + 100mV, kung ang temperatura ay 25◦ centigrade ang output ng sensor ay magiging + 250mV.
Kaya sa ngayon sa LM35 nakakakuha kami ng temperatura sa anyo ng variable boltahe. Ang boltahe na umaasa sa temperatura na ito ay ibinibigay bilang input sa ADC (Analog to Digital Converter) ng ATMEGA32A. Ang digital na halaga pagkatapos makuha ang conversion ay ipinapakita sa 16x2 LCD bilang temperatura.
Kinakailangan ang Mga Bahagi
Hardware: ATMEGA32 Microcontroller, power supply (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF capacitor (dalawang piraso), 100nF capacitor, LM35 Temperature Sensor.
Software: Atmel studio 6.1, progisp o flash magic.
Circuit Diagram at Paliwanag
Sa circuit, ang PORTB ng ATMEGA32 ay konektado sa port ng data ng LCD. Narito dapat tandaan na huwag paganahin ang komunikasyon ng JTAG sa PORTC ot ATMEGA sa pamamagitan ng pagbabago ng fuse bytes, kung nais na gamitin ang PORTC bilang isang normal na port ng komunikasyon. Sa 16x2 LCD mayroong 16 na pin sa lahat kung mayroong back light, kung walang back light magkakaroon ng 14 na pin. Maaari ng isang tumakbo o iwanan ang mga light light pin. Ngayon sa 14 na pin mayroong 8 data pin (7-14 o D0-D7), 2 power supply pin (1 & 2 o VSS & VDD o gnd & + 5v), 3 rd pin para sa control ng kaibahan (kinokontrol ng VEE kung gaano dapat makapal ang mga character ipinakita), 3 control pin (RS & RW & E).
Sa circuit, maaari mong obserbahan na kumuha lamang ako ng dalawang control pin dahil nagbibigay ito ng kakayahang umangkop ng mas mahusay na pag-unawa. Ang kaibahan ng kaunti at BASAHIN / Sumulat ay hindi madalas na ginagamit upang maaari silang maiksi sa lupa. Inilalagay nito ang LCD sa pinakamataas na kaibahan at mode na basahin. Kailangan lang naming makontrol ang Mga PIN na INABAYAHAN at RS upang magpadala ng mga character at data nang naaayon.
Ang mga koneksyon na tapos para sa LCD ay ibinibigay sa ibaba:
PIN1 o VSS ----------------- ground
PIN2 o VDD o VCC ------------ + 5v na lakas
PIN3 o VEE ------------- ground (nagbibigay ng pinakamataas na pagkakaiba sa pinakamahusay para sa isang nagsisimula)
PIN4 o RS (Pagpili ng Rehistro) ----------------- PD6 ng uC
Ang PIN5 o RW (Basahin / Isulat) ----------------- ground (inilalagay ang LCD sa read mode na pinapagaan ang komunikasyon para sa gumagamit)
PIN6 o E (Paganahin) ----------------- PD5 ng uC
PIN7 o D0 ---------------------------- PB0 ng uC
PIN8 o D1 ---------------------------- PB1 ng uC
PIN9 o D2 ---------------------------- PB2 ng uC
PIN10 o D3 ---------------------------- PB3 ng uC
PIN11 o D4 ---------------------------- PB4 ng uC
PIN12 o D5 ---------------------------- PB5 ng uC
PIN13 o D6 ---------------------------- PB6 ng uC
PIN14 o D7 ---------------------------- PB7 ng uC
Sa circuit maaari mong makita na ginamit namin ang 8bit na komunikasyon (D0-D7) subalit hindi ito isang sapilitan, maaari naming gamitin ang 4bit na komunikasyon (D4-D7) ngunit sa 4 na programa sa komunikasyon ay medyo kumplikado kaya't pinili ko ang 8 bit komunikasyon
Kaya mula sa pagmamasid lamang mula sa itaas na talahanayan kumokonekta kami ng 10 mga pin ng LCD sa controller kung saan ang 8 mga pin ay mga pin ng data at 2 mga pin para sa kontrol. Ang output ng boltahe na ibinigay ng sensor ay hindi ganap na linear; magiging maingay ito. Upang ma-filter ang ingay ng isang kapasitor ay kailangang ilagay sa output ng sensor tulad ng ipinakita sa pigura.
Bago magpatuloy kailangan nating pag-usapan ang tungkol sa ADC ng ATMEGA32A. Sa ATMEGA32A, maaari naming bigyan ang input ng Analog sa anuman sa walong mga channel ng PORTA, hindi mahalaga kung aling channel ang pipiliin namin bilang pareho. Pipili kami ng channel 0 o PIN0 ng PORTA. Sa ATMEGA32A, ang ADC ay may 10 bit na resolusyon, kaya't ang controller ay maaaring makakita ng isang kaunting pagbabago ng Vref / 2 ^ 10, kaya't kung ang boltahe ng sanggunian ay 5V nakakakuha kami ng isang digital output increment para sa bawat 5/2 ^ 10 = 5mV. Kaya't para sa bawat 5mV na pagtaas sa input magkakaroon kami ng isang pagtaas ng isa sa digital output.
Ngayon kailangan naming itakda ang rehistro ng ADC batay sa mga sumusunod na term:
1. Una sa lahat kailangan namin upang paganahin ang tampok na ADC sa ADC.
2. Dahil sinusukat namin ang temperatura ng kuwarto, hindi namin talaga kailangan ang mga halagang lampas sa daang degree (1000mV na output ng LM35). Kaya maaari naming i-set up ang maximum na halaga o sanggunian ng ADC sa 2.5V.
3. Ang controller ay may tampok na pag-convert ng pag-trigger, nangangahulugan iyon na ang ADC conversion ay magaganap lamang pagkatapos ng isang panlabas na pag-trigger, dahil hindi namin nais na maitakda namin ang mga rehistro para sa ADC na tumakbo sa tuluy-tuloy na libreng running mode.
4. Para sa anumang ADC, ang dalas ng conversion (Analog na halaga sa Digital na halaga) at kawastuhan ng digital output ay kabaligtaran proporsyonal. Kaya para sa mas mahusay na kawastuhan ng digital output kailangan nating pumili ng mas kaunting dalas. Para sa mas kaunting orasan ng ADC ay itinatakda namin ang presale ng ADC sa maximum na halaga (128). Dahil ginagamit namin ang panloob na orasan ng 1MHZ, ang orasan ng ADC ay magiging (1000000/128).
Ito lamang ang apat na bagay na kailangan nating malaman upang makapagsimula sa ADC. Ang lahat ng nasa itaas na apat na mga tampok ay itinakda ng dalawang rehistro.
PULA (ADEN): Ang bit na ito ay kailangang maitakda para sa pagpapagana ng tampok na ADC ng ATMEGA.
BLUE (REFS1, REFS0): Ang dalawang piraso na ito ay ginagamit upang maitakda ang sanggunian na boltahe (o ibibigay na max na boltahe ng pag-input na ibibigay namin). Dahil nais naming magkaroon ng sanggunian boltahe 2.56V, ang REFS0 at REFS1 parehong dapat itakda, sa pamamagitan ng talahanayan.
LIGHT GREEN (ADATE): Ang bit na ito ay dapat itakda para sa ADC upang magpatakbo ng tuloy-tuloy (libreng running mode).
PINK (MUX0-MUX4): Ang limang mga piraso na ito ay para sa pagsasabi sa input channel. Dahil gagamitin namin ang ADC0 o PIN0, hindi namin kailangang magtakda ng anumang mga piraso sa pamamagitan ng talahanayan.
BROWN (ADPS0-ADPS2): ang tatlong mga piraso na ito ay para sa pagtatakda ng prescalar para sa ADC. Sice gumagamit kami ng isang prescalar na 128, kailangan naming itakda ang lahat ng tatlong mga piraso.
DARK GREEN (ADSC): itinakda ito para sa ADC upang simulan ang conversion. Ang bit na ito ay maaaring hindi paganahin sa programa kung kailangan nating ihinto ang conversion.
Upang gawin ang proyektong ito sa Arduino, tingnan ang tutorial na ito: Digital Thermometer gamit ang Arduino
Paliwanag sa Programming
Ang pagtatrabaho ng TEMPARATURE MEASUREMENT ay pinakamahusay na ipinaliwanag sa hakbang-hakbang ng C code na ibinigay sa ibaba:
#include // header upang paganahin ang kontrol ng daloy ng data sa mga pin
# tukuyin ang F_CPU 1000000 // nagsasabi na naka-attach ang dalas ng kristal na Controller
# isama
#define E 5 // pagbibigay ng pangalang "paganahin" sa ika- 5 na pin ng PORTD, dahil Nakakonekta ito sa LCD paganahin ang pin
#define RS 6 // pagbibigay ng pangalang " registroelection " sa ika- 6 na pin ng PORTD, dahil nakakonekta sa LCD RS pin
walang bisa ang send_a_command (unsigned char command);
walang bisa ang send_a_character (unsigned char character);
walang bisa ang send_a_string (char * string_of_character);
int main (walang bisa)
{
DDRB = 0xFF; // paglalagay ng portB at portD bilang mga output pin
DDRD = 0xFF;
_delay_ms (50); // pagbibigay ng pagkaantala ng 50ms
DDRA = 0; // Pagkuha ng portA bilang input.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_character ++);
}
}