Datasheet du MAX31855 Après le test du MAX6675, voici son remplaçant, avec un registre de 32 bits au lieu de 16 pour lire la température du thermocouple de -270 à + 1372°C (type K) et de la température interne du driver.
La lecture du registre 32 bits se fait en deux fois, pour extraire deux variables de 16 bits. Ces variables contiennent les informations de température: thermocouple et interne avec des bits d'alarmes diverses: court circuit, coupure, défauts divers (voir datasheet).
Après avoir fait un peu de tri, on peut afficher les températures: Comparaison avec un thermomètre de référence |  |
on voit un peu mieux le petit circuit avec le driver MAX31855 Doit manquer un peu de glace... |  |
Le code:
La fonction SPIIN n'est pas disponible sur la version M2 des picaxes. Elle est remplacée par une macro pour lire le registre du MAX31855 et extraire les deux variables de 16 bits.
Il faut un peu manipuler ces variables, traiter les valeurs négatives, afficher les températures et ajouter quelques alarmes.
Rien de très compliqué.
;lecture thermocouple par MAX31855 MM 24072016
;La broche SO va prendre successivement la valeur de chaque bit du registre.
; scanné poids fort en tête
; #picaxe 08M2
#no_data
symbol CLK=C.1 ; pulse horloge
symbol CSB=C.2 ;demande lecture _____/
symbol SO=pinC.3 ;bit de donnée serial out
symbol def1=bit0
symbol def2=bit1
symbol cpt=b1
;b2,b3,b4,b5,b6,b7,b8 chiffres affichage
symbol sig=b9 ;signe valeur
symbol decim=w10 ;décimales
symbol varw=w13 ;var temporaire
symbol tempint=w12 ;tempé interne
symbol temptherm=w11 ;tempé thermocouple
setfreq M4
symbol baud=N2400_4
;*****************************
#macro spin(varw) ;macro SPIIN
varw = 0
for cpt = 1 to 16
varw=varw * 2 + SO ;décalage à gauche + SO (0 ou 1)
pulsout CLK,1 ;pulse horloge
next cpt
#endmacro
;************************************
pause 500
serout C.0,baud, (254,1)
;serout C.0,baud, (254,131,"Temp",1,"rature")
high CSB ;première conversion
debut:
Do
pause 5000 ;1 mesure par 5 secondes
low CSB ;lecture registre
spin(temptherm) ;exécution macro 16 premiers bits (poid fort en tête
spin(tempint) ;seonde moitié du registre
high CSB ;nouvelle conversion
;temptherm=%0000011001001100 ;test 100,75 °C
;tempint= %0001100100000000 ;test 25 °C
;*****defaut **********************
def2=tempint//2 ;isol bit défaut
def1=temptherm//2 ;isol bit défaut
if def1>0 or def2>0 then erreur
;**** temp thermocouple ******************************
sig=" "
temptherm=temptherm/4 ;suppression des 2 derniers bits
if temptherm>=$2000 then ;test 1er bit des 14 bits pour valeur négative
sig="-"
temptherm = not temptherm + 1 ;complément à 2 pour valeur "positive"
endif
decim=temptherm//4 ;mémo des 2 décimales
temptherm=temptherm/4 ;suppression des décimales-> val entière
temptherm=temptherm//4096 ;on garde les 12 derniers bits
bintoascii temptherm,b4,b4,b5,b6,b7
decim= decim*25 ;valeur des décimales en 1/4 de degré
bintoascii decim,b2,b2,b3 ;découpage pour affichage
serout C.0,baud, (254,128,"Ttc ",sig,b4,b5,b6,b7,",",b2,b3," ßC ")
;**** temp interne ****************
sig=" "
tempint=tempint/16 ;supp 4 derniers bits ->val entière
if tempint>= 1023 then ;c'est une valeur négative!
sig="-"
tempint= not tempint + 1 ;complément à 2 pour valeur "positive"
endif
decim=tempint//16
tempint=tempint/16
tempint=tempint//256
decim=decim*625
bintoascii decim,b2,b2,b3,b4,b5
bintoascii tempint,b6,b6,b6,b7,b8
serout C.0,baud, (254,192,"Tint ",sig,b6,b7,b8,",",b2,b3,b4,b5,"ßC")
loop
erreur:
serout C.0,baud, (254,1,254,128," ERREUR")
if def1=1 then
serout C.0,baud, (254,194,"PAS DE SONDE")
else
serout C.0,baud, (254,193,"DEFAUT INTERNE")
endif
pause 1000
goto debut