• Main Page
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

current.c

Go to the documentation of this file.
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                                                    ****/

Generated on Sun Jan 23 2011 14:05:40 for ULA replacement firmware by  doxygen 1.7.2