Moduł dla Rspberry Pi 2 i 3 do pomiaru temperatury za pomocą czujnika PT100.

Zestaw zawiera:

  • Moduł RM-RPI-PT100
  • Komplet złącz do przylutowania
  • Tuleje dystansowe z gwintem M2,5 - 2szt.

 Opis 

  • Moduł jest zbudowany na bazie przetwornika A/C ADS1247 firmy Texas Instrument bazując na projekcie referencyjnymDodatkowo posiada wyprowadzenia sygnałów dla I2C oraz wyjście tranzystorowe sterujące napięciem 5V, które może służyć do sterowania elementem wykonawczym np. przekaźnik SSR.
  • Złącza CON1, CON2 i JP3 należy przylutować do płytki. (są dołączone do zestawu)
  • Rezystory R10 i R11 są opcjonalne i nie są montowane
  • Czujnik PT100 3-przewodowy należy podłączyć do CON1, przewód pojedyńczy (biały) do środkowego zacisku, zwarte przewody (czerwone) do pozostałych zacisków. W przypadku czujnika dwuprzewodowego należy zewrzeć ze sobą zaciski 1 i 3.
  • Zakres pomiarowy: -200°C do 200°C
  • Prezentowny moduł należy traktować jako płytka rozwojowa w celach testowych i eksperymentalnych, nie jest urządzeniem i nie jest przeznaczony do użytku konsumenckiego.
  • Dane z rejestracji regulatora temperatury zbudowanego z wykorzystaniem tego modułu dostępne na stronie data.sparkfun.com

 Ustawienia zworek:

  • JP1 służy do wyboru wejścia CE interfejsu SPI. SPI_CE0 lub SPI_CE1
  • JP2 ustalamy wyjście sterujące tranzystorem Q1
  • JP4 opcjonalne można doprowadzić sygnał READY z układu ADS1247 (szczegóły na schemacie)

 Schemat

Przedstawiam listing programu służącego do przetestowania działania płytki.

 Program testowy

/*
 * Program testowy modulu RM-RPI-PT100
 * Odczyt temperatury
 *         www.rasmatic.pl
 */

#include <stdio.h>
#include <bcm2835.h>
#include <math.h>

#define czekaj 100

int inicjacja_spi()
	{
	   if (bcm2835_init()) {
        
			bcm2835_spi_begin();
			bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);    
			bcm2835_spi_setDataMode(BCM2835_SPI_MODE1);                   
			bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_1024);
			bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                    
			bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);    
			return 1;
		}
		else return 0;
	}

int ad1247_setup()
	{
		char send_data[6];
		char read_data[6];
		long wartosc;
		double napiecie;
		
		// Reset AD1247
		send_data[0] = 0x06;
		bcm2835_spi_transfernb(send_data, read_data, 1);
		bcm2835_delay(czekaj);
		
		//Wylaczenie ciaglego odczytu
		send_data[0] = 0x16;   
		send_data[1] = 0xff;
		send_data[2] = 0xff;
		bcm2835_spi_transfernb(send_data, read_data, 3);
		bcm2835_delay(czekaj);
		
		//Konfiguracja cz1
		send_data[0] = 0x40;
		send_data[1] = 0x03;
		send_data[2] = 0x0a;
		send_data[3] = 0x00;
		send_data[4] = 0x20;
		send_data[5] = 0x32;
		bcm2835_spi_transfernb(send_data, read_data, 6);
		bcm2835_delay(czekaj);
		
		//Konfiguracja cz2
		send_data[0] = 0x4A;
		send_data[1] = 0x01;
		send_data[2] = 0x96;
		send_data[3] = 0x03;
		bcm2835_spi_transfernb(send_data, read_data, 4);
		bcm2835_delay(czekaj);
		
		//Samokalibracja
		send_data[0] = 0x62;
		bcm2835_spi_transfernb(send_data, read_data, 1);
		bcm2835_delay(czekaj);
		printf("Kalibracja\n");
			
		send_data[0] = 0x12;
		send_data[1] = 0xff;
		send_data[2] = 0xff;
		send_data[3] = 0xff;
		bcm2835_spi_transfernb(send_data, read_data, 4);
		bcm2835_delay(czekaj);
		printf("Wyslane odczyt wart: %x   %x   %x   %x\n", send_data[0], send_data[1], send_data[2], send_data[3]);
		printf("Odebrane odczyt wart: %x   %x   %x   %x\n", read_data[0], read_data[1], read_data[2], read_data[3]);  
  
		wartosc = (read_data[1] << 16) + (read_data[2] << 8) + (read_data[3]);
		napiecie = 1.64/8/8388607 * wartosc;
		printf("Wartosc: %ld   napiecie: %f\n", wartosc, napiecie);
		return 1;		
	}

double temperetura_ad1247()
	{
		char sr_data[4] = {0x12, 0xff, 0xff, 0xff};
		long wartosc;
		double napiecie, temperatura;
		const double stala_a = 3.9083e-3;
		const double stala_b = -5.775e-7;
			
		bcm2835_spi_transfern(sr_data, 4);
		wartosc = (sr_data[1] << 16) + (sr_data[2] << 8) + (sr_data[3]);
		napiecie = 1.64/8/8388607 * wartosc;
		temperatura = ((-1*stala_a)+sqrt((stala_a*stala_a)-((0.1-napiecie)*(40*stala_b))))/(2*stala_b);
		return temperatura;
	}


int main(int argc, char **argv)
{
	double temp;
	
	if (!inicjacja_spi()) return 1;
	if (!ad1247_setup()) return 2;
	
	temp = temperetura_ad1247();
	printf("!!!! temp: %f\n", temp);
	
	bcm2835_spi_end();
    bcm2835_close();
	return 0;
}