123

Dependencies:   mbed

Fork of LG by igor Apu

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);
     }
   }