123
Fork of LG by
Diff: DeviceISACS.c
- Revision:
- 177:672ef279c8e0
- Parent:
- 173:7f938afb0447
- Child:
- 183:c7a9c309086c
--- a/DeviceISACS.c Thu Jun 30 09:04:22 2016 +0000 +++ b/DeviceISACS.c Sun Jul 03 13:40:48 2016 +0000 @@ -3,6 +3,44 @@ extern Device device; void InitISACSOutputDefaultSettings(void){ + device.isacs.regulator.settings.start.enabled = 1; + device.isacs.regulator.settings.regular.enabled = 1; + device.isacs.regulator.settings.reset.enabled = 1; + + device.isacs.regulator.settings.transfer.points = 16; + device.isacs.regulator.settings.transfer.error[0] = -0x20000; //-2.0V + device.isacs.regulator.settings.transfer.correction[0] = 0x10000; //1.0 + device.isacs.regulator.settings.transfer.error[1] = -0x1bbbb; //-1.7333333333333334V + device.isacs.regulator.settings.transfer.correction[1] = 0xb473; //0.7048888888888889 + device.isacs.regulator.settings.transfer.error[2] = -0x17777; //-1.4666666666666668V + device.isacs.regulator.settings.transfer.correction[2] = 0x7aa7; //0.47911111111111115 + device.isacs.regulator.settings.transfer.error[3] = -0x13333; //-1.2V + device.isacs.regulator.settings.transfer.correction[3] = 0x4fdf; //0.31199999999999994 + device.isacs.regulator.settings.transfer.error[4] = -0xeeee; //-0.9333333333333333V + device.isacs.regulator.settings.transfer.correction[4] = 0x3161; //0.1928888888888889 + device.isacs.regulator.settings.transfer.error[5] = -0xaaaa; //-0.6666666666666667V + device.isacs.regulator.settings.transfer.correction[5] = 0x1c71; //0.11111111111111113 + device.isacs.regulator.settings.transfer.error[6] = -0x6666; //-0.3999999999999999V + device.isacs.regulator.settings.transfer.correction[6] = 0xe56; //0.05599999999999999 + device.isacs.regulator.settings.transfer.error[7] = -0x2222; //-0.1333333333333333V + device.isacs.regulator.settings.transfer.correction[7] = 0x452; //0.016888888888888884 + device.isacs.regulator.settings.transfer.error[8] = 0x2222; //0.1333333333333333V + device.isacs.regulator.settings.transfer.correction[8] = -0x452; //-0.016888888888888884 + device.isacs.regulator.settings.transfer.error[9] = 0x6666; //0.3999999999999999V + device.isacs.regulator.settings.transfer.correction[9] = -0xe56; //-0.05599999999999999 + device.isacs.regulator.settings.transfer.error[10] = 0xaaaa; //0.6666666666666665V + device.isacs.regulator.settings.transfer.correction[10] = -0x1c71; //-0.11111111111111108 + device.isacs.regulator.settings.transfer.error[11] = 0xeeee; //0.9333333333333331V + device.isacs.regulator.settings.transfer.correction[11] = -0x3161; //-0.1928888888888888 + device.isacs.regulator.settings.transfer.error[12] = 0x13333; //1.2000000000000002V + device.isacs.regulator.settings.transfer.correction[12] = -0x4fdf; //-0.31200000000000006 + device.isacs.regulator.settings.transfer.error[13] = 0x17777; //1.4666666666666668V + device.isacs.regulator.settings.transfer.correction[13] = -0x7aa7; //-0.47911111111111115 + device.isacs.regulator.settings.transfer.error[14] = 0x1bbbb; //1.7333333333333334V + device.isacs.regulator.settings.transfer.correction[14] = -0xb473; //-0.7048888888888889 + device.isacs.regulator.settings.transfer.error[15] = 0x20000; //2.0V + device.isacs.regulator.settings.transfer.correction[15] = -0x10000; //-1.0 + device.isacs.output.settings.transfer.points = 2; //Control point 1.5 volt - low output limit device.isacs.output.settings.transfer.voltage[0] = 0x00017fff; @@ -39,6 +77,8 @@ device.isacs.regulator.state.enabled = device.isacs.regulator.settings.start.enabled; device.isacs.regulator.state.reference = device.isacs.regulator.settings.start.reference; device.isacs.regulator.state.scale = device.isacs.regulator.settings.start.scale; + device.isacs.regulator.state.error = 0; + device.isacs.regulator.state.correction = 0; } void DeviceStartISACSRegulator(void){ @@ -102,22 +142,40 @@ } } -int32_t isacsInput(uint32_t code) { - int32_t c1, c2; +int32_t isacsInput(uint32_t raw) { + int32_t r1, r2; for (uint8_t i = 1; i < device.isacs.input.settings.transfer.points; i++) { - c1 = device.isacs.input.settings.transfer.code[i - 1]; - if (code < c1) { - return device.isacs.input.settings.transfer.voltage[i - 1]; + r1 = device.isacs.input.settings.transfer.raw[i - 1]; + if (raw < r1) { + return device.isacs.input.settings.transfer.V[i - 1]; } - c2 = device.isacs.input.settings.transfer.code[i]; - if (code < c2) { - int32_t v1 = device.isacs.input.settings.transfer.voltage[i - 1]; - int32_t v2 = device.isacs.input.settings.transfer.voltage[i]; - return isacsInterpolate(code, c1, c2, v1, v2); + r2 = device.isacs.input.settings.transfer.raw[i]; + if (raw < r2) { + int32_t v1 = device.isacs.input.settings.transfer.V[i - 1]; + int32_t v2 = device.isacs.input.settings.transfer.V[i]; + return isacsInterpolate(raw, r1, r2, v1, v2); } } - return device.isacs.input.settings.transfer.voltage[device.isacs.input.settings.transfer.points - 1]; + return device.isacs.input.settings.transfer.V[device.isacs.input.settings.transfer.points - 1]; +} + +uint32_t isacsCorrection(int32_t error) { + int32_t e1, e2; + for (uint8_t i = 1; i < device.isacs.regulator.settings.transfer.points; i++) { + e1 = device.isacs.regulator.settings.transfer.error[i - 1]; + if (error < e1) { + return device.isacs.regulator.settings.transfer.correction[i - 1]; + } + + e2 = device.isacs.regulator.settings.transfer.error[i]; + if (error < e2) { + int32_t c1 = device.isacs.regulator.settings.transfer.correction[i - 1]; + int32_t c2 = device.isacs.regulator.settings.transfer.correction[i]; + return isacsInterpolate(error, e1, e2, c1, c2); + } + } + return device.isacs.regulator.settings.transfer.correction[device.isacs.regulator.settings.transfer.points - 1]; } int32_t isacsOutput(uint32_t voltage) { @@ -138,84 +196,17 @@ return device.isacs.output.settings.transfer.code[device.isacs.output.settings.transfer.points - 1]; } -/* -void isacsSetOutputVoltage(int32_t voltage) { - int32_t v1, v2; - for (uint8_t i = 1; i < device.isacs.output.interpolator.settings.points; i++) { - v1 = device.isacs.output.interpolator.settings.voltage[i - 1]; - if (voltage < v1) { - uint32_t code = device.isacs.output.interpolator.settings.code[i - 1]; - device.isacs.output.voltage = v1; - device.controller.SSP.out[0] = code; - return; - } - - v2 = device.isacs.output.interpolator.settings.voltage[i]; - if (voltage < v2) { - //int32_t dv = device.isacs.output.state.voltage - v1; - //int32_t dvi = v2 - v1; - //int32_t c1 = device.isacs.output.settings.code[i - 1]; - //int32_t c2 = device.isacs.output.settings.code[i]; - //int32_t dc = c2 - c1; - - //uint32_t m = 1; - //if (device.dac.settings.resolution > 16) { - // dv >>= 7; dc >>= 7; dvi >>= 7; m <<= 7;//For 24 bit: (21 - 7) + (24 - 7) - (21 - 7) + 7 = 24 - //} else if (device.dac.settings.resolution > 12) { - // dv >>= 3; dc >>= 3; dvi >>= 3; m <<= 3;//For 16 bit: (21 - 3) + (16 - 3) - (21 - 3) + 3 = 16 - //} else { - // dv >>= 1; dc >>= 1; dvi >>= 1; m <<= 1;//For 12 bit: (21 - 1) + (12 - 1) - (21 - 1) + 1 = 12 - //} - //device.isacs.output.state.code = c1 + dv * dc / dvi * m; - //device.isacs.output.state.voltage = voltage; - - int32_t c1 = device.isacs.output.interpolator.settings.code[i - 1]; - int32_t c2 = device.isacs.output.interpolator.settings.code[i]; - uint32_t code = isacsInterpolate(voltage, v1, v2, c1, c2); - device.isacs.output.voltage = voltage; - device.controller.SSP.out[0] = code; - return; - } - } - uint32_t code = device.isacs.output.interpolator.settings.code[device.isacs.output.interpolator.settings.points - 1]; - device.isacs.output.voltage = device.isacs.output.interpolator.settings.voltage[device.isacs.output.interpolator.settings.points - 1]; - device.controller.SSP.out[0] = code; -} - -void isacsSetOutputCode(int32_t code) { - int32_t c1, c2; - for (uint8_t i = 1; i < device.isacs.output.interpolator.settings.points; i++) { - c1 = device.isacs.output.interpolator.settings.code[i - 1]; - if (code < c1) { - device.isacs.output.voltage = device.isacs.output.interpolator.settings.voltage[i - 1]; - device.controller.SSP.out[0] = c1; - return; - } - - c2 = device.isacs.output.interpolator.settings.code[i]; - if (code < c2) { - int32_t v1 = device.isacs.output.interpolator.settings.voltage[i - 1]; - int32_t v2 = device.isacs.output.interpolator.settings.voltage[i]; - device.isacs.output.voltage = isacsInterpolate(code, c1, c2, v1, v2); - device.controller.SSP.out[0] = code; - return; - } - } - device.isacs.output.voltage = device.isacs.output.interpolator.settings.voltage[device.isacs.output.interpolator.settings.points - 1]; - device.controller.SSP.out[0] = device.isacs.output.interpolator.settings.code[device.isacs.output.interpolator.settings.points - 1]; -} -*/ - void isacsProcess(void) { - device.isacs.input.state.voltage = isacsInput(device.controller.SSP.in[4]); - device.isacs.input.state.sum += device.isacs.input.state.voltage; + device.isacs.input.state.sum += device.controller.SSP.in[4]; if (device.measurement.counter == 31) { - device.isacs.input.state.average = device.isacs.input.state.sum >> 5; + device.isacs.input.state.raw = device.isacs.input.state.sum >> 5; device.isacs.input.state.sum = 0; + device.isacs.input.state.V = isacsInput(device.isacs.input.state.raw); if (device.isacs.regulator.state.enabled) { - device.isacs.regulator.state.error = device.isacs.regulator.state.reference - device.isacs.input.state.average; - device.isacs.output.state.voltage += device.isacs.regulator.state.error * device.isacs.regulator.state.scale; + device.isacs.regulator.state.error = device.isacs.regulator.state.reference - device.isacs.input.state.V; + device.isacs.regulator.state.correction = (device.isacs.regulator.state.scale * isacsCorrection(device.isacs.regulator.state.error)) >> 16; + device.isacs.output.state.voltage += device.isacs.regulator.state.correction; device.controller.SSP.out[0] = isacsOutput(device.isacs.output.state.voltage); } }