Programació en ASM del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Sensor de temperatura

Hem triat el sensor de temperatura TMP36 que és molt freqüent per a mesures de precisió moderada. Té una sensibilitat de 10 mV/°C i un error màxim de 2 °C sobre un rang entre -40 i +125 °C.

Sensor de temperatura

El connexionat del sensor és molt senzill. Tal com es veu a la imatge (amb les lletres davant) la pota de l'esquerra es connecta al positiu (VDD), la de la dreta a massa (negatiu, VSS) i la del centre a una entrada analògica; en el nostre exemple serà AN2 (RA2).

En el full de característiques veiem que la sortida és de 0,5 V a 0 °C i d'1 V a 50 °C. A partir d'aquestes dades, podem escriure la següent expressió que relaciona la temperatura en graus Celsius amb la tensió de sortida del sensor.

Equació

El valor que llegirà el microcontrolador serà de 1024 quan la tensió que li arriba sigui de 5 V. Substituïnt a l'expressió anterior, tenim:

Equació

A la següent taula tenim uns quants casos, entre ells els corresponents als valors extrems:

Temperatura (°C) Tensió (V) Valor llegit (ADRES)
-40 0,1 21
-25 0,25 51
0 0,5 102
24 0,74 152
25 0,75 154
50 1 205
75 1,25 256
100 1,5 307
125 1,75 358

Substituïnt obtenim la següent expressió en la que, atès que els tres nombres són múltiples de quatre, podem simplificar:

Equació

La lectura que podrem fer amb el conversor analògic-digital del microcontrolador seran nombres enters. Per tal que la temperatura ens sigui fàcil de tractar també ens convindrà que siguin nombres enters. Si ens fixem en la taula, veiem que un canvi d'un grau Celsius dóna lloc a una veriació aproximada de dues unitats en el valor llegit. Si volem la temperatura amb una resolució d'un grau aquesta expressió ja ens va bé. Si, en canvi, volem aprofitar la possibilitat de veure els mitjos graus, caldrà evitar perdre-ho. Si en lloc de fer la divisió per 256, ho fem per 128 tindrem el doble de la temperatura i podrem tenir en compte aquest mig grau.

Si ens fixem, el valor més gran que podem llegir són 125 °C i correspon a una lectura de 358. Quan ho multipliquem per 125 tindrem 44750 que encara cap sobradament en un unsigned int (dos bytes). Per tant, podrem fer tots els càlculs amb unsigned int.

A l'exemple MT hi ha un programa que llegeix aquest sensor i mostra la temperatura a una pantalla sèrie. A continuació n'hem posat algunes línies.

La variable Lectura és on guardem la lectura que la formem a partir d'ADRESH i ADRESL. També tindrem una variable binària que ens recordarà si el valor era positiu o negatiu per mostrar o no el signe menys a la pantalla. El vector Digits guardarà els quatre dígits de la lectura amb el decimal a la posició 0 i les centenes a la 3.

Hem evitat fer la resta de forma general ja que si el resultat pot ser positiu o negatiu no ens cabria en un unsigned int i ens caldria un short long. Segons quin dels dos elements de la resta és més gros fem la resta en un sentit o un altre i activem o no el bit Negatiu. El resultat de la resta (que és el valor absolut del numerador) el dividim per 128 i ja tenim el doble de la temperatura. Comparant aquest valor amb el doble de la seva meitat veiem si quan dividim es perden decimals o no. Com la diferència és de només un bit, si es perden decimals considerem mig grau més (Digits[0] = 5) que si no es perden.

Finalment passem a BCD (separem els dígits) i els convertim a ASCII per poder-los mostrar a la pantalla.

unsigned int Lectura;				// Valor llegit
char Digits[4];					// Variable amb el número dígit a dígit
						// Digits[0] és el decimal
bit Negatiu;					// Guarda si el valor és negatiu o positiu
...
	Lectura = 256 * ADRESH + ADRESL;	// Valor llegit
						// T = (125 * Lectura - 12800) / 256 
	Lectura = 125 * Lectura;		// Primer pas del càlcul
	if (Lectura >= 12800) {			// És positiu?
		Negatiu = 0;			// Sí
		Lectura = Lectura - 12800;	// Segon pas del càlcul
	} else {
		Negatiu = 1;			// És negatiu
		Lectura = 12800 - Lectura;	// Segon pas del càlcul
	}
	Lectura = Lectura / 128;		// Lectura té el doble de la temperatura
						// En valor absolut
	if (Lectura == 2 * (Lectura / 2)) {	// Mirem si el decimal és 0 o 5
		Digits[0] = 0;
	} else {
		Digits[0] = 5;
	}
						// Separem els dígits
	Lectura = Lectura / 2;			// Lectura té la temperatura en valor absolut
	Digits[1] = Lectura % 10;		// Unitats
	Lectura = Lectura / 10;
	Digits[2] = Lectura % 10;		// Desenes
	Digits[3] = Lectura / 10;		// Centenes
...		

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.