00001 /*@{*//*@}*/ 00014 00015 /******************************************************************************/ 00016 /* Includes (#include) */ 00017 #include <avr/io.h> 00018 00019 /* Own headers */ 00020 #include "xtypes.h" 00021 #include "global.h" 00022 00023 #include "adc.h" 00024 #include "safety.h" 00025 00026 #define EXPORT 00027 #include "temp.h" 00028 #undef EXPORT 00029 00030 /******************************************************************************/ 00031 /* Constants (#define) *//*@{*/ 00032 00034 #define AVG_COUNT 10U 00035 00038 #define WARNING_COUNT 20U 00039 00040 /* End: Constants (#define) *//*@}*/ 00041 /******************************************************************************/ 00042 00043 /******************************************************************************/ 00044 /* Macro definitions (#define) *//*@{*/ 00045 /* End: Macro definitions (#define) *//*@}*/ 00046 /******************************************************************************/ 00047 00048 /******************************************************************************/ 00049 /* Basic types (typedef) *//*@{*/ 00050 /* End: Basic types (typedef) *//*@}*/ 00051 /******************************************************************************/ 00052 00053 /******************************************************************************/ 00054 /* Local constants (const) *//*@{*/ 00055 /* End: Local constants (const) *//*@}*/ 00056 /******************************************************************************/ 00057 00058 /******************************************************************************/ 00059 /* Local variables *//*@{*/ 00060 00062 STATIC UINT16 mg_au16Data[AVG_COUNT]; 00063 00065 STATIC UINT16 mg_u16Value = 0U; 00066 00068 STATIC UINT8 mg_u8Idx = 0U; 00069 00071 STATIC UINT8 mg_u8WarningCnt = 0U; 00072 00073 /* End: Local variables *//*@}*/ 00074 /******************************************************************************/ 00075 00076 /******************************************************************************/ 00077 /* Global variables *//*@{*/ 00078 /* End: Global variables *//*@}*/ 00079 /******************************************************************************/ 00080 00081 /******************************************************************************/ 00082 /* Prototype declarations */ 00083 /* End: Prototype declarations */ 00084 /******************************************************************************/ 00085 00086 /******************************************************************************/ 00087 /* Local functions *//*@{*/ 00088 /* End: Local functions *//*@}*/ 00089 /******************************************************************************/ 00090 00091 /******************************************************************************/ 00092 /* Global functions *//*@{*/ 00093 00094 /* ****************************************************************************/ 00104 /* ****************************************************************************/ 00105 void temp_Init (void) 00106 { 00107 UINT16 u16Help = adc_Read(ADC_TEMPERATURE); 00108 00109 for(UINT8 i=0U; i<AVG_COUNT; i++) 00110 { 00111 mg_au16Data[i] = u16Help; 00112 } 00113 mg_u16Value = u16Help; 00114 mg_u8Idx = 0U; 00115 } 00116 00117 00118 /* ****************************************************************************/ 00127 /* ****************************************************************************/ 00128 void temp_Update (void) 00129 { 00130 UINT16 u16Help = adc_Read(ADC_TEMPERATURE); 00131 00132 mg_au16Data[mg_u8Idx] = u16Help; 00133 mg_u8Idx++; 00134 if(mg_u8Idx >= AVG_COUNT) 00135 { 00136 mg_u8Idx = 0U; 00137 } 00138 u16Help = 0U; 00139 for(UINT8 i=0U; i<AVG_COUNT; i++) 00140 { 00141 u16Help += mg_au16Data[i]; 00142 } 00143 u16Help /= AVG_COUNT; 00144 mg_u16Value = u16Help; 00145 } 00146 00147 00148 /* ****************************************************************************/ 00164 /* ****************************************************************************/ 00165 void temp_Check (void) 00166 { 00167 if(temp_GetCelsius(mg_u16Value) < VALUE_TEMP_WARN) 00168 { 00169 if (mg_u8WarningCnt > 0U) 00170 { 00171 mg_u8WarningCnt--; 00172 } 00173 } 00174 else if(temp_GetCelsius(mg_u16Value) < VALUE_TEMP_ERROR) 00175 { 00176 mg_u8WarningCnt++; 00177 } 00178 else 00179 { 00180 mg_u8WarningCnt = WARNING_COUNT; 00181 } 00182 00183 if(mg_u8WarningCnt >= WARNING_COUNT) 00184 { 00185 mg_u8WarningCnt = WARNING_COUNT; 00186 safety_ClearCondition(COND_TEMP_WARN); 00187 safety_SetCondition(COND_TEMP_ERR); 00188 } 00189 else if (mg_u8WarningCnt > 0U) 00190 { 00191 safety_SetCondition(COND_TEMP_WARN); 00192 safety_ClearCondition(COND_TEMP_ERR); 00193 } 00194 else 00195 { 00196 safety_ClearCondition(COND_TEMP_WARN); 00197 safety_ClearCondition(COND_TEMP_ERR); 00198 } 00199 } 00200 00201 00202 /* ****************************************************************************/ 00211 /* ****************************************************************************/ 00212 UINT16 temp_GetAvg (void) 00213 { 00214 return (mg_u16Value); 00215 } 00216 00217 00218 00219 /* ****************************************************************************/ 00229 /* ****************************************************************************/ 00230 UINT16 temp_GetCelsius (UINT16 adc_val) 00231 { 00232 INT16 u16Ret = 85U; 00233 UINT16 u16NTC; 00234 00235 if (0U != adc_val) 00236 { 00237 u16NTC = (UINT16) (((1024UL * 1100UL) / ((UINT32)adc_val)) - 1100UL); 00238 00239 if (u16NTC >= 12500U) 00240 { 00241 u16Ret = 0U; 00242 } 00243 else if (u16NTC >= 9000U) 00244 { 00245 u16Ret = 5U; 00246 } 00247 else if (u16NTC >= 7500U) 00248 { 00249 u16Ret = 10U; 00250 } 00251 else if (u16NTC >= 6000U) 00252 { 00253 u16Ret = 15U; 00254 } 00255 else if (u16NTC >= 4700U) 00256 { 00257 u16Ret = 20U; 00258 } 00259 else if (u16NTC >= 3800U) 00260 { 00261 u16Ret = 25U; 00262 } 00263 else if (u16NTC >= 3300U) 00264 { 00265 u16Ret = 30U; 00266 } 00267 else if (u16NTC >= 2500U) 00268 { 00269 u16Ret = 35U; 00270 } 00271 else if (u16NTC >= 2000U) 00272 { 00273 u16Ret = 40U; 00274 } 00275 else if (u16NTC >= 1700U) 00276 { 00277 u16Ret = 45U; 00278 } 00279 else if (u16NTC >= 1200U) 00280 { 00281 u16Ret = 50U; 00282 } 00283 else if (u16NTC >= 1000U) 00284 { 00285 u16Ret = 55U; 00286 } 00287 else if (u16NTC >= 800U) 00288 { 00289 u16Ret = 60U; 00290 } 00291 else if (u16NTC >= 900U) 00292 { 00293 u16Ret = 65U; 00294 } 00295 else if (u16NTC >= 800U) 00296 { 00297 u16Ret = 70U; 00298 } 00299 else if (u16NTC >= 600U) 00300 { 00301 u16Ret = 75U; 00302 } 00303 else if (u16NTC >= 500U) 00304 { 00305 u16Ret = 80U; 00306 } 00307 else 00308 { 00309 u16Ret = 85U; 00310 } 00311 } 00312 00313 return (u16Ret); 00314 } 00315 00316 /* End: Global functions *//*@}*/ 00317 /******************************************************************************/ 00318 00319 /**** Last line of code ****/