00001 /*@{*//*@}*/ 00014 00015 00016 /******************************************************************************/ 00017 /* Includes (#include) */ 00018 #include <avr/io.h> 00019 00020 /* Own headers */ 00021 #include "xtypes.h" 00022 #include "global.h" 00023 00024 #include "adc.h" 00025 #include "safety.h" 00026 00027 #define EXPORT 00028 #include "current.h" 00029 #undef EXPORT 00030 00031 /******************************************************************************/ 00032 /* Constants (#define) *//*@{*/ 00033 00037 #define SUM_COUNT 20U 00038 00042 #define AVG_COUNT 8U 00043 /* End: Constants (#define) *//*@}*/ 00044 /******************************************************************************/ 00045 00046 /******************************************************************************/ 00047 /* Macro definitions (#define) *//*@{*/ 00048 /* End: Macro definitions (#define) *//*@}*/ 00049 /******************************************************************************/ 00050 00051 /******************************************************************************/ 00052 /* Basic types (typedef) *//*@{*/ 00053 /* End: Basic types (typedef) *//*@}*/ 00054 /******************************************************************************/ 00055 00056 /******************************************************************************/ 00057 /* Local constants (const) *//*@{*/ 00058 /* End: Local constants (const) *//*@}*/ 00059 /******************************************************************************/ 00060 00061 /******************************************************************************/ 00062 /* Local variables *//*@{*/ 00063 00065 STATIC UINT16 mg_u16Value = 0U; 00066 00069 STATIC UINT16 mg_au16Data[SUM_COUNT]; 00070 00073 STATIC UINT16 mg_au16AvgData[AVG_COUNT]; 00074 00076 STATIC UINT16 mg_u16Sum = 0U; 00077 00079 STATIC UINT8 mg_u8SumIdx = 0U; 00080 00082 STATIC UINT8 mg_u8AvgIdx = 0U; 00083 00084 /* End: Local variables *//*@}*/ 00085 /******************************************************************************/ 00086 00087 /******************************************************************************/ 00088 /* Global variables *//*@{*/ 00089 /* End: Global variables *//*@}*/ 00090 /******************************************************************************/ 00091 00092 /******************************************************************************/ 00093 /* Prototype declarations */ 00094 /* End: Prototype declarations */ 00095 /******************************************************************************/ 00096 00097 /******************************************************************************/ 00098 /* Local functions *//*@{*/ 00099 /* End: Local functions *//*@}*/ 00100 /******************************************************************************/ 00101 00102 /******************************************************************************/ 00103 /* Global functions *//*@{*/ 00104 00105 /* ****************************************************************************/ 00119 /* ****************************************************************************/ 00120 void current_Init (void) 00121 { 00122 mg_u16Value = adc_Read(ADC_CURRENT); 00123 00124 for(UINT8 i=0U; i<SUM_COUNT; i++) 00125 { 00126 mg_au16Data[i] = 0U; 00127 } 00128 00129 for(UINT8 i=0U; i<AVG_COUNT; i++) 00130 { 00131 mg_au16AvgData[i] = 0U; 00132 } 00133 00134 mg_u16Sum = 0U; 00135 mg_u8SumIdx = 0U; 00136 mg_u8AvgIdx = 0U; 00137 } 00138 00139 00140 /* ****************************************************************************/ 00151 /* ****************************************************************************/ 00152 void current_Update (void) 00153 { 00154 mg_u16Value = adc_Read(ADC_CURRENT); 00155 if(mg_u16Value > MAX_CURRENT) 00156 { 00157 safety_SetCondition(COND_CURR_WARN); 00158 } 00159 else 00160 { 00161 safety_ClearCondition(COND_CURR_WARN); 00162 } 00163 } 00164 00165 00166 /* ****************************************************************************/ 00188 /* ****************************************************************************/ 00189 void current_UpdateSum (void) 00190 { 00191 /* get momentary current value */ 00192 UINT16 u16Help = adc_Read(ADC_CURRENT); 00193 00194 /* insert in ring array */ 00195 mg_au16Data[mg_u8SumIdx] = u16Help; 00196 mg_u8SumIdx++; 00197 if(mg_u8SumIdx >= SUM_COUNT) 00198 { 00199 mg_u8SumIdx = 0U; 00200 } 00201 00202 /* recalculate new sum from array */ 00203 u16Help = 0U; 00204 for(UINT8 i=0U; i<SUM_COUNT; i++) 00205 { 00206 u16Help += mg_au16Data[i]; 00207 } 00208 mg_u16Sum = u16Help; 00209 00210 /* check for current overload */ 00211 if(mg_u16Sum > (MAX_CURRENT * SUM_COUNT)) 00212 { 00213 safety_SetCondition(COND_CURR_ERR); 00214 safety_ClearCondition(COND_CURR_WARN); 00215 } 00216 else 00217 { 00218 safety_ClearCondition(COND_CURR_ERR); 00219 } 00220 } 00221 00222 00223 /* ****************************************************************************/ 00240 /* ****************************************************************************/ 00241 void current_UpdateAvg (void) 00242 { 00243 /* get momentary current value */ 00244 UINT16 u16Help = adc_Read(ADC_CURRENT); 00245 00246 /* insert in ring array */ 00247 mg_au16AvgData[mg_u8AvgIdx] = u16Help; 00248 mg_u8AvgIdx++; 00249 if(mg_u8AvgIdx >= AVG_COUNT) 00250 { 00251 mg_u8AvgIdx = 0U; 00252 } 00253 } 00254 00255 00256 /* ****************************************************************************/ 00263 /* ****************************************************************************/ 00264 UINT16 current_GetAvg (void) 00265 { 00266 UINT16 u16Help = 0U; 00267 00268 /* calculate average value from array */ 00269 for(UINT8 i=0U; i<AVG_COUNT; i++) 00270 { 00271 u16Help += mg_au16AvgData[i]; 00272 } 00273 u16Help /= AVG_COUNT; 00274 00275 return (u16Help); 00276 } 00277 00278 00279 /* ****************************************************************************/ 00287 /* ****************************************************************************/ 00288 UINT16 current_GetValue (void) 00289 { 00290 return (mg_u16Value); 00291 } 00292 00293 00294 /* ****************************************************************************/ 00303 /* ****************************************************************************/ 00304 UINT16 current_GetSum (void) 00305 { 00306 return (mg_u16Sum); 00307 } 00308 00309 /* End: Global functions *//*@}*/ 00310 /******************************************************************************/ 00311 00312 /**** Last line of code ****/