English
Language : 

AN839 Datasheet, PDF (3/5 Pages) Silicon Laboratories – Novel Current-Sense Measurement with Automatic Offset Correction
AN839
float Offset;
int16 Offsetcounter;
Offsetcounter= (int16) 0;
Offset= (float) 0;
LED_P1_2_Write(0xFFu);
// Indicates active mode. Remove LED for Icc.
GAINSWITCH_P1_6_Write(0xFFu); // GAINSWITCH to mode 1
CYGlobalIntEnable;
// global interrupts
//LCD_Start();
// start components (LCD optional)
isr_Start();
ADC_Start();
SleepTimer_Start();
// sleep timer params set in the GUI
for(;;)
{
ADC_StartConvert();
// make a conversion and
wait
while (ADC_IsEndConversion(ADC_RETURN_STATUS) == 0)
{}
ADCResult = ADC_CountsTo_mVolts(ADC_GetResult32()); // math
Iin= (float) ADCResult/5 ;
// units microamps
Iin_corrected= (float) Iin - Offset;
// Optional LCD display
/*
sprintf(OutputString, "%5.3f",Iin_corrected);
// 300usecs
LCD_Position(0,0);
// write to L
CD; 700usecs
LCD_PrintString("I load=");
LCD_Position(0,8);
LCD_PrintString(OutputString);
*/
ADC_StopConvert();
if (Offsetcounter==32)
{
if ((Iin> 50) && (Iin<100))
{
GAINSWITCH_P1_6_Write(0x00u);
// switch gain to m
ode 2
CyDelay(50u);
// delay
ADC_StartConvert();
// make a conversio
n and wait
while (ADC_IsEndConversion(ADC_RETURN_STATUS) == 0)
{}
ADCResult = ADC_CountsTo_mVolts(ADC_GetResult32());
Offset= (float) ADCResult/5*1.25 - Iin*0.25;
// Optional LCD display
/*
LCD_Position(1,0);
LCD_PrintString("Offset=
");
sprintf(OutputString, "%5.3f",Offset);
LCD_Position(1,8);
LCD_PrintString(OutputString);
*/
Offsetcounter= (int16) 0;
ADC_StopConvert();
GAINSWITCH_P1_6_Write(0xFFu);
// switch gain to m
ode 1
}
else
{}
}
else
Offsetcounter= (int16) Offsetcounter+1;
ADC_Sleep();
LED_P1_2_Write(0x00u);
// LED off for sleep mode.
CyPmSaveClocks();
// sleep mode
CyPmSleep(PM_SLEEP_TIME_NONE, PM_SLEEP_SRC_CTW);
CyPmReadStatus(CY_PM_CTW_INT);
CyPmRestoreClocks();
// wake up
ADC_Wakeup();
}
}
/* [] END OF FILE */
Rev. 1.0
3