BeRTOS
ntc.c
Go to the documentation of this file.
00001 
00044 #include "hw/hw_ntc.h"
00045 #include "hw/ntc_map.h"
00046 
00047 #include "cfg/cfg_ntc.h"
00048 
00049 // Define logging setting (for cfg/log.h module).
00050 #define LOG_LEVEL         CONFIG_NTC_LOG_LEVEL
00051 #define LOG_VERBOSITY     CONFIG_NTC_LOG_FORMAT
00052 #include <cfg/log.h>
00053 #include <cfg/debug.h>
00054 
00055 #include <drv/ntc.h>
00056 
00057 DB(bool ntc_initialized;)
00058 
00067 static size_t upper_bound(const res_t *orig_table, size_t size, res_t val)
00068 {
00069     const res_t *table = orig_table;
00070 
00071     while (size)
00072     {
00073         size_t pos = size / 2;
00074         if (val > table[pos])
00075             size = pos;
00076         else
00077         {
00078             table += pos+1;
00079             size -= pos+1;
00080         }
00081     }
00082 
00083     return table - orig_table;
00084 }
00085 
00086 
00104 deg_t ntc_read(NtcDev dev)
00105 {
00106     const NtcHwInfo* hw = ntc_hw_getInfo(dev);
00107     const res_t* r = hw->resistances;
00108 
00109     res_t rx;
00110     size_t i;
00111     deg_t degrees = 0;
00112 
00113     rx = ntc_hw_read(dev);
00114 
00115 
00116     i = upper_bound(r, hw->num_resistances, rx);
00117     ASSERT(i <= hw->num_resistances);
00118 
00119     if (i >= hw->num_resistances)
00120         return NTC_SHORT_CIRCUIT;
00121     else if (i == 0)
00122         return NTC_OPEN_CIRCUIT;
00123 
00124     /*
00125      * Interpolated value in 0.1 degrees multiplied by 10:
00126      *   delta t          step t
00127      * ----------  = ----------------
00128      * (rx - r[i])   (r[i-1] - r [i])
00129      */
00130     float tmp;
00131     tmp = 10 * hw->degrees_step * (rx - r[i]) / (r[i - 1] - r[i]);
00132 
00133     /*
00134      * degrees = integer part corresponding to the superior index
00135      *           in the table multiplied by 10
00136      *           - decimal part interpolated (already multiplied by 10)
00137      */
00138     degrees = (i * hw->degrees_step + hw->degrees_min) * 10 - (int)(tmp);
00139 
00140     //kprintf("dev= %d, I=%d, degrees = %d\n", dev, i , degrees);
00141 
00142     return degrees;
00143 }
00144 
00145 
00149 void ntc_init(void)
00150 {
00151     NTC_HW_INIT;
00152     DB(ntc_initialized = true;)
00153 }
00154