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} };