ntc.c
Go to the documentation of this file.00001
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #include <drv/ntc.h>
00059 #include <hw_ntc.h>
00060 #include <ntc_map.h>
00061
00062 #include <cfg/debug.h>
00063
00064 DB(bool ntc_initialized;)
00065
00074 static size_t upper_bound(const res_t *orig_table, size_t size, res_t val)
00075 {
00076 const res_t *table = orig_table;
00077
00078 while (size)
00079 {
00080 size_t pos = size / 2;
00081 if (val > table[pos])
00082 size = pos;
00083 else
00084 {
00085 table += pos+1;
00086 size -= pos+1;
00087 }
00088 }
00089
00090 return table - orig_table;
00091 }
00092
00093
00111 deg_t ntc_read(NtcDev dev)
00112 {
00113 const NtcHwInfo* hw = ntc_hw_getInfo(dev);
00114 const res_t* r = hw->resistances;
00115
00116 float rx;
00117 size_t i;
00118 deg_t degrees;
00119
00120 rx = ntc_hw_read(dev);
00121
00122
00123 i = upper_bound(r, hw->num_resistances, rx);
00124 ASSERT(i <= hw->num_resistances);
00125
00126 if (i >= hw->num_resistances)
00127 return NTC_SHORT_CIRCUIT;
00128 else if (i == 0)
00129 return NTC_OPEN_CIRCUIT;
00130
00131
00132
00133
00134
00135
00136
00137 float tmp;
00138 tmp = 10 * hw->degrees_step * (rx - r[i]) / (r[i - 1] - r[i]);
00139
00140
00141
00142
00143
00144
00145 degrees = (i * hw->degrees_step + hw->degrees_min) * 10 - (int)(tmp);
00146
00147
00148
00149 return degrees;
00150 }
00151
00152
00156 void ntc_init(void)
00157 {
00158 NTC_HW_INIT;
00159 DB(ntc_initialized = true;)
00160 }
00161