2015-05-03 17 views
6

Tôi mới làm quen với lập trình Arduino. Và gần như thiếu kinh nghiệm.Làm thế nào để đọc nhiệt độ bằng cách sử dụng bảng Arduino uno với cảm biến PT100 RTD?

Tôi đang tìm cách lập trình bảng Arduino uno của mình để đọc cấu hình dây 2/3/4 cảm biến PT100 RTD (ở mức độ chính xác ít nhất 0,5 ° C). Phạm vi nhiệt độ từ 0 đến 400 ° C và -50 đến 100 ° C.

Vì tôi hoàn toàn mới đối với lĩnh vực này, tôi sẽ đánh giá cao thông tin mô tả khá phù hợp với mạch và hình ảnh và mã.

Tôi đã nghiên cứu rất nhiều về chủ đề, nhưng không thể nhận được bất kỳ điều gì hữu ích hoặc đáng kể để giải quyết vấn đề của tôi. Hơn nữa, tôi không thể sử dụng thermistor hoặc bất kỳ IC nào để đọc nhiệt độ khi máy mà RTD được cài đặt có PID, nhưng tôi muốn tạo một bộ ghi dữ liệu có thể lấy nhiệt độ trên máy tính.

+0

Xin chào, tôi nghĩ bạn sẽ nhận được câu trả lời hay hơn tại đây -> http://arduino.stackexchange.com/ – Andreas

+0

Cảm ơn bạn. Tôi mới vào trang web này. Sẽ thử nó một lần. –

+0

Không có vấn đề gì, tôi nghĩ đây là trang web chính xác trước khi tôi liên kết được tạo ra, do đó tất cả các thẻ có sẵn :) – Andreas

Trả lời

3

PT100 tăng sức đề kháng khi nhiệt được áp dụng. Nhiệt độ so với đặc tính kháng được mô tả trong pt100 resistance table

Arduino có thể đọc điện áp trên đầu vào tương tự. Để có được đọc độ C chúng ta phải:

  1. đọc đầu vào analog là điện áp
  2. giá trị điện trở
  3. tính toán (điện áp chia)
  4. tra cứu độ C từ bảng dựa trên kháng

voltage divider

Vin là 5 volt từ arduino R1 là một sức đề kháng của giá trị được biết đến trong chương trình của tôi nó là 220 Ohm thực sự R2 là pt 100 Vout đã được kết nối với arduino hậu môn og pin đầu vào (A0 ví dụ)

R2 = R1 * 1/(Vin/Vout - 1)

Các mạch có thể được thực hiện dựa trên các hình ảnh ở trên nó là khá đơn giản.

Các phác thảo tôi đã viết chứa dữ liệu kháng từ 0C - 80C (có thể được mở rộng một cách dễ dàng) Để có được độ từ giá trị điện trở tôi sử dụng phiên bản của tôi của Multimap chức năng sử dụng mảng một phao như các giá trị điện trở và sử dụng nội suy tuyến tính để tính toán độ chính xác

float in[] = { 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51, 
       103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40, 
       107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29, 
       111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15, 
       115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01, 
       119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86, 
       123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69, 
       127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52 }; 

// known resistance in voltage divider 
int R1 = 217; 

float MultiMap(float val, float* _in, uint8_t size) 
{ 
    // calculate if value is out of range 
    if (val < _in[0]) return -99.99; 
    if (val > _in[size-1]) return 99.99; 

    // search for 'value' in _in array to get the position No. 
    uint8_t pos = 0; 
    while(val > _in[pos]) pos++; 

    // handles the 'rare' equality case 
    if (val == _in[pos]) return pos; 

    float r1 = _in[pos-1]; 
    float r2 = _in[pos]; 
    int c1 = pos-1; 
    int c2 = pos; 

return c1 + (val - r1)/(r2-r1) * (c2-c1); 
} 

void setup() { 
    // put your setup code here, to run once: 
Serial.begin(9600); 

} 
void loop() { 
    // put your main code here, to run repeatedly: 
    int pt100 = analogRead(A0); 


    float Vout = pt100 * (5.0/1023.0); 
    float R2 = R1 * 1/(5.0/Vout - 1); 

float c = MultiMap(R2,in,80); 

Serial.print("Resistance: "); 
Serial.print(R2); 
Serial.println(" Ohm"); 

Serial.print("Temperature: "); 
Serial.print(c); 
Serial.println(" C"); 


delay(400); 
} 
+0

Tính chính xác: giá trị điện trở được sử dụng cho mọi số nguyên nghĩa là 0C -> 100 ohm 1C -> 100.39 v.v. – Chris

+0

Giá trị điện trở R1 phải chính xác và chính xác nhất có thể trước tiên tôi đặt 220 ohm trong chương trình vì nó shoud đã được nhưng nó đã thực sự 217 ohm (đo bằng vạn năng) Nó có nghĩa là 3 độ ít nhất !!!!! – Chris

3

Chris, mặc dù giải pháp của bạn vẫn hoạt động, có một số cải tiến.

1) 220 ohm pullup quá nhỏ. Có một dòng điện đáng chú ý chạy liên tục qua pt100, có thể ảnh hưởng đến độ chính xác. Một cách tiếp cận rất tối giản là tăng sức kéo để giảm dòng điện này và khuếch đại điện áp trên dải phân cách, xem http://www.avrfreaks.net/sites/default/files/pt100.JPG

2) khi có cáp chạy đáng chú ý và môi trường công nghiệp tiêu chuẩn, bạn có thể quyết định sử dụng bố trí cầu đo tiêu chuẩn. Điều này sử dụng bốn dây, từ đó hai dây được sử dụng như một nguồn dòng không đổi. (Không giống như một điện trở pollup, một nguồn dòng liên tục đảm bảo readouts ổn định đầy đủ, và sẽ có sự ổn định nhiệt độ tốt hơn.Đơn giản pullup chính nó có thể có một trôi đáng kể.Không có dòng điện chạy trên các dây này, do đó khoảng cách dây thực tế của cảm biến sẽ không ảnh hưởng đến độ chính xác. Cách tiếp cận này được hiển thị ở đây: https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/4wire2.svg/286px-4wire2.svg.png và trên thực tế, tất cả các cảm biến công nghiệp đều hoạt động theo nguyên tắc này.

3) bạn có thể thích sử dụng giao diện người dùng tương tự thay vì lăn mạch tương tự của riêng bạn. AD7714 http://www.seekic.com/circuit_diagram/Measuring_and_Test_Circuit/Temperature_measurement_circuit_composed_of_the_AD7714_and_Pt100.html và nhiều giải pháp chuyên nghiệp khác tại đây: http://www.ti.com/europe/downloads/2-%203-%204-Wire%20RTD%20Measurement.pdf

Các vấn đề liên quan