Sprinterのルックアップテーブルを利用した温度測定の原理
http://d.hatena.ne.jp/seinzumtode/20171211/1512956856
で書いたような方法ではArty Z7でXADCを使った温度測定ができなかったのでメモ。
ZYNQのXADCは0-1.0Vのレンジを計測できるが、Arty Z7のA0-A5は分圧抵抗を使うことで0-3.3Vが測れるようになっている。この分圧抵抗のためにReprapとは異なる計算式(LUT)が必要になる。
計算したものが以下
VはAIN-GNDの端子間電圧
Vcc=3.3Vとする(実測したら3.279だった)

LUT計算コード
from math import * if __name__ == "__main__": adcs = [1, 18, 35, 52, 69, 86, 103, 120, 137, 154, 171, 188, 205, 222, 239, 256, 273, 290, 307, 324, 341, 358, 375, 392, 409, 426, 443, 460, 477, 494, 511, 528, 545, 562, 579, 596, 613, 630, 647, 664, 681, 698, 715, 732, 749, 766, 783, 800, 817, 834, 851, 868, 885, 902, 919, 936, 953, 970, 987, 1004, 1021] r0 = 100000; t0 = 25; beta = 4267; r1 = 0; r2 = 4700; num_temps = int(61); vcc = 3.279 max_adc = 1023 print("// Thermistor lookup table for RepRap Temperature Sensor Boards (http://make.rrrf.org/ts)") print("// Shohei Aoki, 2017 ") print("// Customized codes from createTemperatureLookup.py (http://svn.reprap.org/trunk/reprap/firmware/Arduino/utilities/createTemperatureLookup.py)") print("// r0: %s" % (r0)) print("// t0: %s" % (t0)) print("// r1: %s" % (r1)) print("// r2: %s" % (r2)) print("// beta: %s" % (beta)) print("// max adc: %s" % (max_adc)) print("// vcc: %s" % (vcc)) print("#define NUMTEMPS %s" % (len(adcs))) print("short temptable[NUMTEMPS][2] = {") counter = 0 for adc in adcs: counter = counter +1 v = (adc/1024.0) T0 = t0 + 273.15 # temperature at stated resistance, e.g. 25C k = r0 * exp(-beta / T0) # constant part of calculation if (1000*vcc-3320*v>0): temp_adc = int(round( (beta * 1.0) / (log (( 1000*vcc - 3320*v) / (k*v))) - 273.15)) else: temp_adc = 0 if counter == len(adcs): print(" {%s, %s}" % (adc, temp_adc)) else: print(" {%s, %s}," % (adc, temp_adc)) print("};")
実行結果
// Thermistor lookup table for RepRap Temperature Sensor Boards (http://make.rrrf.org/ts)
// Shohei Aoki, 2017
// Customized codes from createTemperatureLookup.py (http://svn.reprap.org/trunk/reprap/firmware/Arduino/utilities/createTemperatureLookup.py)
// r0: 100000
// t0: 25
// r1: 0
// r2: 4700
// beta: 4267
// max adc: 1023
// vcc: 3.279
#define NUMTEMPS 61
short temptable[NUMTEMPS][2] = {
{1, -34},
{18, 13},
{35, 27},
{52, 36},
{69, 42},
{86, 48},
{103, 53},
{120, 57},
{137, 61},
{154, 65},
{171, 68},
{188, 71},
{205, 74},
{222, 77},
{239, 80},
{256, 83},
{273, 85},
{290, 88},
{307, 90},
{324, 93},
{341, 95},
{358, 98},
{375, 100},
{392, 102},
{409, 105},
{426, 107},
{443, 109},
{460, 112},
{477, 114},
{494, 116},
{511, 119},
{528, 121},
{545, 124},
{562, 126},
{579, 129},
{596, 131},
{613, 134},
{630, 137},
{647, 140},
{664, 143},
{681, 146},
{698, 149},
{715, 152},
{732, 156},
{749, 160},
{766, 164},
{783, 168},
{800, 172},
{817, 177},
{834, 183},
{851, 189},
{868, 195},
{885, 203},
{902, 212},
{919, 223},
{936, 236},
{953, 253},
{970, 277},
{987, 319},
{1004, 439},
{1021, 0}
};
