Eli Hughes
/
RobotPowerLogger-V2
For Terrance
Diff: Code/ADC.c
- Revision:
- 0:085749c8446f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Code/ADC.c Wed Jun 13 15:10:06 2012 +0000 @@ -0,0 +1,141 @@ +#include "System.h" + +volatile float BatteryVoltage = 0; +volatile float RobotBusVoltageHR = 0; +volatile float RobotBusCurrentHR = 0; + +float HighResRobotBusVoltageScalingFactor; +float HighResRobotBusVoltageOffset; +float HighResRobotBusCurrentScalingFactor; + +SIGNED_DWORD ExtADCRobotVoltage=0; +SIGNED_DWORD ExtADCRobotCurrent=0; + +AnalogIn BatteryChannel(p17); +AnalogIn RobotBusCurrentChannel(p20); +AnalogIn RobotBusVoltageChannel(p19); +AnalogIn SelfCurrentChannel(p18); + +Ticker BatteryCheck; +Ticker InputPowerCheck; + +SPI ADCSPI(p11, p12, p13); +DigitalOut ConversionStart(p14); + +void CheckBattery(); +void CheckInputPower(); + +SIGNED_DWORD VFilter[64]; +SIGNED_DWORD IFilter[64]; +WORD FilterIndex; + +SIGNED_DWORD VBattFilter[8]; +WORD VBattFilterIndex; + +DigitalOut PING(LED3); +DigitalOut PONG(LED4); + +volatile BOOL ADCDataRdy; + + +void InitADC() +{ + HighResRobotBusVoltageScalingFactor = U1_VREF * ((R2 + R4)/(R4)) * VSCALE_ADJUST; + HighResRobotBusVoltageOffset = INPUT_DIODE_DROP*2; + HighResRobotBusCurrentScalingFactor = U1_VREF * ((R6+R7)/R7) ; + + ACS576_ISCALE = ACS576_ISCALE * ACS576_ISCALE_ADJUST; + + ADCSPI.format(16,0); + + ConversionStart = 0; + + BatteryCheck.attach(&CheckBattery,0.1); + InputPowerCheck.attach(&CheckInputPower,(1.0/(SAMPLE_RATE*16))); + } + +void CheckBattery() +{ + int i; + SIGNED_DWORD TempSum = 0; + + VBattFilter[VBattFilterIndex++] = BatteryChannel.read_u16(); + VBattFilterIndex &= 0x7; + + for(i=0;i<8;i++) + { + TempSum += VBattFilter[i]; + } + + BatteryVoltage = (float)((TempSum>>3))/65535.0f * MBED_VREF * ((R17+R15)/R15); +} + +void CheckInputPower() +{ + SIGNED_DWORD TempSumV,TempSumI; + int i; + + ConversionStart = 1; + VFilter[FilterIndex] = (SIGNED_WORD)(ADCSPI.write(0x0000)); + IFilter[FilterIndex] = (SIGNED_WORD)(ADCSPI.write(0x0000)); + FilterIndex++; + ConversionStart = 0; + + //oversample and average + if(FilterIndex ==16) + { + ADCDataRdy = TRUE; + FilterIndex = 0; + TempSumV=0; + TempSumI=0; + for(i=0;i<32;i++) + { + TempSumV+=VFilter[i]; + TempSumI+=IFilter[i]; + } + + ExtADCRobotCurrent = TempSumV>>4; + ExtADCRobotVoltage = TempSumI>>4; + + RobotBusVoltageHR = ((((float)(ExtADCRobotVoltage)/(32768.0f)) * HighResRobotBusVoltageScalingFactor + HighResRobotBusVoltageOffset))- VOFFSET_ADJUST; + RobotBusCurrentHR = (((((float)(ExtADCRobotCurrent)/(32768.0f)) * HighResRobotBusCurrentScalingFactor) -ACS576_VOFFSET) * ACS576_ISCALE) - ACS576_IOFFSET_TRIM; + + if(SystemState == SYSTEM_STATE_LOGGING) + { + + if (MyDataBlock.WriteOutPtr >MyDataBlock.ReadInPtr) + { + ReadWriteDifferential = (DATA_BLOCK_SIZE - MyDataBlock.WriteOutPtr + MyDataBlock.ReadInPtr); + } + else + { + ReadWriteDifferential = ( MyDataBlock.ReadInPtr - MyDataBlock.WriteOutPtr); + } + + if(ReadWriteDifferential >= DATA_BLOCK_SIZE - 1) + { + DataLogError = TRUE; + ErrorMsg = "Overrun!"; + } + else + { + MyDataBlock.Voltage[MyDataBlock.ReadInPtr] = RobotBusVoltageHR; + MyDataBlock.Current[MyDataBlock.ReadInPtr] = RobotBusCurrentHR; + + MyDataBlock.ReadInPtr++; + + if(MyDataBlock.ReadInPtr == DATA_BLOCK_SIZE) + { + MyDataBlock.ReadInPtr = 0; + } + } + } + else + { + ReadWriteDifferential = 0; + } + } +} + + +