ntc.c

Go to the documentation of this file.
00001 
00046 /*#*
00047  *#* $Log$
00048  *#* Revision 1.2  2006/07/19 12:56:26  bernie
00049  *#* Convert to new Doxygen style.
00050  *#*
00051  *#* Revision 1.1  2005/11/04 17:59:47  bernie
00052  *#* Import into DevLib.
00053  *#*
00054  *#* Revision 1.1  2005/05/24 09:17:58  batt
00055  *#* Move drivers to top-level.
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      * Interpolated value in 0.1 degrees multiplied by 10:
00133      *   delta t          step t
00134      * ----------  = ----------------
00135      * (rx - r[i])   (r[i-1] - r [i])
00136      */
00137     float tmp;
00138     tmp = 10 * hw->degrees_step * (rx - r[i]) / (r[i - 1] - r[i]);
00139 
00140     /*
00141      * degrees = integer part corresponding to the superior index
00142      *           in the table multiplied by 10
00143      *           - decimal part interpolated (already multiplied by 10)
00144      */
00145     degrees = (i * hw->degrees_step + hw->degrees_min) * 10 - (int)(tmp);
00146 
00147     //kprintf("dev= %d, I=%d, degrees = %d\n", dev, i , degrees);
00148 
00149     return degrees;
00150 }
00151 
00152 
00156 void ntc_init(void)
00157 {
00158     NTC_HW_INIT;
00159     DB(ntc_initialized = true;)
00160 }
00161