Adafruit Trinket M0 und MAX31685 Messwandler

Hab neues Material von Adafruit bestellt und hab gratis ein Trinket M0 (https://www.adafruit.com/product/3500) dazu bekommen ...

da die Bestellung eigentlich für PT100 & MAX31865 (https://datasheets.maximintegrated.com/en/ds/MAX31865.pdf) Temperatur Material war - warum nicht das Trinket mal testen damit

Auf dem Trinket M0 läuft CircuitPython (basierend auf MicroPython) - als HW werckelt ein Microchip ATSAMD32E controller .. (http://www.microchip.com/wwwproducts/en/ATSAMD21E18)




Das Board is ca 3x1 cm - hat 5 IOs und USB welcher als Serial und Flashdrive funktioniert .. nach dem connect landet man auf dem CircuitPython interpreter und kann gleich loslegen

Idee zum testen war nun den MAX31685 Messwandler für PT100 anzusteuern und die Temperatur zu  messen .. Tempfühler ist ein 3 wire PT100



Setup ist relativ einfach - Anbindung des MAX31685 breakout boards erfolgt über SPI. Die Pins sind gemapped über ein Python "board" module. Damit können SCK, MISO, MOSI) direkt verwendet werden

SPI funktioniert auch recht einfach - obwohl nur einfach Funktionen möglich sind - es gibt nur read oder write - keine kombinierte Funktion

http://circuitpython.readthedocs.io/en/2.x/shared-bindings/busio/SPI.html

Aber SPI ist für einfache Sachen ok ..

CS pin ist ein digital Pin der auf low gezogen wird vor dem SPI transfer - danach wieder auf high

temp "Filter" hab ich aus der Adafruit Library für den MAX31865 abgekupfert -> https://github.com/adafruit/Adafruit_MAX31865/blob/master/Adafruit_MAX31865.cpp

Der Ref Widerstand auf dem breakout board hat 430 Ohm ..

Das Board kommt auch von Adafruit (https://www.adafruit.com/product/3328) -- dort muss man nur genau schauen bzgl der 2/3/4 wire config .. bei 3/4 wire muss nicht nur die Lötbrücke gemacht werden - sonder auch eine Leiterbahn durchgekappt werden ..



https://learn.adafruit.com/adafruit-max31865-rtd-pt100-amplifier/rtd-wiring-and-config

Wenn die Leiterbahn nicht gekappt ist meint der Chip das ein shortcut zwischen -RTD / - FORCE ist

Das äussert sich darin das der RTD LSB das Fault bit gesetzt hat und keine Temperatur geliefert wird .. ist im Datenblatt gut beschrieben ..


Das FaultStatus Register hat in Fall wenn die Leiterbahn nicht raus ist D6 gesetzt ..

Hat etwas gedauert bis der Grund klar war ;-)

der Code ist straight forward - SPI setup -- MAX31685 einstellen

0x80 ist config register write und 0xd2 setzt den chip auf permanentes messen (braucht mehr strom) ((bin aber eh kein low power mensch ;-) ))



dann in der loop die RTD register auslesen  ... den Widerstandswert umrechen und Temp ermitteln

speed von PT100 ist recht gut .. reagiert schnell auf Änderung ..

funktionert  - sucess !!

######################### MAX31685 on Tinker M0 ##############################
import board
import busio
import digitalio
import time

cs = digitalio.DigitalInOut(board.D0)
cs.direction = digitalio.Direction.OUTPUT

cs.value = True

spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)

while not spi.try_lock():
  pass

spi.configure(baudrate=2000000, polarity=0, phase=1)

cs.value = False
cfg = bytes( [ 0x80, 0xd2 ])
spi.write(cfg)
cs.value = True

while True:

result = bytearray(4)
cs.value = False
spi.readinto(result)
cs.value = True

Rt = (((result[2]*0x100 + result[3])>>1) / 32768.0)*430.0

rpoly = Rt;

temp = -242.02
temp += 2.2228 * rpoly
rpoly *= Rt
temp += 2.5859e-3 * rpoly
rpoly *= Rt
temp -= 4.8260e-6 * rpoly
rpoly *= Rt
temp -= 2.8183e-8 * rpoly
rpoly *= Rt
temp += 1.5243e-10 * rpoly

print("temp: %0.4f" % temp)
time.sleep(0.2)



Auslesen der ersten drei Register - erster Wert ist die start Adresse (0x0)  (CH2 -> MISO; CH4 -> MOSI)