Hotline : 0166.666.1219
63 Lê Đức Thọ - Từ Liêm - Hà Nội
Sản phẩm Mới Nhất

Đo nhiệt độ bằng Nhiệt điện trở PIC và AVR Giao tiếp máy tính






Nhiệt điện trở (tiếng anh: Thermistor) là loại điện trở mà trở kháng của nó thay đổi một cách rõ rệt dưới tác dụng nhiệt, hơn hẳn so với các loại điện trở thông thường. Từ thermistor được kết hợp bởi từ themal (nhiệt) và resistor (điện trở). Nhiệt điện trở được ứng dụng rộng rãi trong việc hạn chế các dòng xung kích, làm cảm biến nhiệt.
Sử dụng Nhiệt điện trở ưu điểm hơn hẳn các loại cảm biến thường dùng như thời gian đáp ứng nhanh, có thể đo ở nhiệt độ cao, và rất rẻ :D ....

Phương trình phụ thuộc nhiệt độ và điện trở của Nhiệt điện trở:



[​IMG]
Trong đó: T, T0 tính theo độ Kevin.
R0 là điện trở khi nhiệt độ T0 = 25 độ C, phụ thuộc loại Nhiệt điện trở.
B là hệ số phụ thuộc vào loại Nhiệt điện trở.

Ở đây chúng ta sẽ sử dụng ADC để tìm giá trị điện trở của nhiệt điện trở, rồi từ đó dễ dàng tìm ra được nhiệt độ theo công thức.

Sơ đồ kết nối vi điều khiển:



Hình ảnh thực tế: (Trời hơi lạnh :) )
[​IMG]

Mình sử dụng Nhiệt điện trở có R0=10k, hệ số B=3470.

Sau đây là code sử dụng chip 16f887:

#include <main.h>
#include <math.h>
#define LCD_ENABLE_PIN PIN_C2
#define LCD_RS_PIN PIN_C0
#define LCD_RW_PIN PIN_C1
#define LCD_DATA4 PIN_C3
#define LCD_DATA5 PIN_C4
#define LCD_DATA6 PIN_C5
#define LCD_DATA7 PIN_C6
#include <lcd.c>

float value,A,C,T;
int16 R=4700,B=3470,R0=10000;


void main()
{
setup_adc (ADC_CLOCK_INTERNAL);
setup_adc_ports (sAN0);
delay_us (20);
set_adc_channel (0);

lcd_init();
printf(lcd_putc,"ready....");
delay_ms(500);

unsigned char mychar[8] = {12, 18, 18, 12, 0, 0, 0, 0};
lcd_set_cgram_char(1,mychar);

while(TRUE)
{

value = read_adc ();
delay_us (20);
float RT=(value*R)/(1024 - value);
A=log(RT/R0);
C=(A/B) + 0.003355704698; // 1/(25+273)
T=(1/C) - 273;

printf(lcd_putc,"\fT=%lf",T);
lcd_putc(1);
lcd_putc("C");
delay_ms(100);
}
}
File "main.h":
#include <16F887.h>
#device adc=10
#device *=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=20000000)

(code PIC)

Code AVR

code giao tiếp máy tính:
#include <16F887.h>
#device ADC=10
#device *=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20000000)
#use rs232(UART1,baud=9600,parity=N,bits=8,stream=UART)

#include <math.h>
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6
#include <lcd.c>

float value,A,C,T;
int16 R=4700,B=3470,R0=10000;


void main()
{
setup_adc (ADC_CLOCK_INTERNAL);
setup_adc_ports (sAN0);
delay_us (20);
set_adc_channel (0);

lcd_init();
printf(lcd_putc,"ready....");
delay_ms(500);
unsigned char mychar[8] = {12, 18, 18, 12, 0, 0, 0, 0};
lcd_set_cgram_char(1,mychar);

while(TRUE)
{

value = read_adc ();
delay_us (20);
float RT=(value*R)/(1024 - value);
A=log(RT/R0);
C=(A/B) + 0.003355704698;
T=(1/C) - 273;

printf(lcd_putc,"\fT=%lf",T);
lcd_putc(1);
lcd_putc("C");

fprintf(UART,"nhiet do hien tai la: %lf\n",T);
delay_ms(1000);
}
}
( Code giao tiếp máy tính)

Cám ơn các bạn đã theo dõi!

Nguồn codientu.org ( Ngô Thiện Đức)

eChipKool.Shop Trân trọng từng giây phút được phục vụ quý khách hàng

No comments:

Post a Comment