ArtyZ7ボードでサーミスタを使う

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

カーブとしてはこうなっている