123

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Diletant
Date:
Sun Jun 19 03:54:35 2016 +0000
Revision:
173:7f938afb0447
Parent:
167:bedc0a9d559a
Child:
177:672ef279c8e0
Device&... update. Not final!!!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Diletant 161:efd949e8d536 1 #include "Device.h"
Diletant 161:efd949e8d536 2
Diletant 161:efd949e8d536 3 extern Device device;
Diletant 161:efd949e8d536 4
Diletant 167:bedc0a9d559a 5 void InitISACSOutputDefaultSettings(void){
Diletant 167:bedc0a9d559a 6 device.isacs.output.settings.transfer.points = 2;
Diletant 166:c3c0b8a90d81 7 //Control point 1.5 volt - low output limit
Diletant 167:bedc0a9d559a 8 device.isacs.output.settings.transfer.voltage[0] = 0x00017fff;
Diletant 167:bedc0a9d559a 9 device.isacs.output.settings.transfer.code[0] = 800;
Diletant 166:c3c0b8a90d81 10 //Control point 12.5 volt - high output limit
Diletant 167:bedc0a9d559a 11 device.isacs.output.settings.transfer.voltage[1] = 0x000c7fff;
Diletant 167:bedc0a9d559a 12 device.isacs.output.settings.transfer.code[1] = 2048;
Diletant 167:bedc0a9d559a 13 device.isacs.output.settings.start.voltage = 0x000c7fff; //+12.5V start
Diletant 167:bedc0a9d559a 14 device.isacs.output.settings.reset.voltage = 0x00077fff; //+7.5V if regulator disabled at reset time
Diletant 161:efd949e8d536 15 }
Diletant 161:efd949e8d536 16
Diletant 167:bedc0a9d559a 17 void InitISACSOutputState(void){
Diletant 161:efd949e8d536 18 }
Diletant 161:efd949e8d536 19
Diletant 167:bedc0a9d559a 20 void DeviceStartISACSOutput(void){
Diletant 167:bedc0a9d559a 21 }
Diletant 167:bedc0a9d559a 22
Diletant 167:bedc0a9d559a 23 void InitISACSRegulatorDefaultSettings(void){
Diletant 161:efd949e8d536 24 //Startup settings
Diletant 166:c3c0b8a90d81 25 device.isacs.regulator.settings.start.enabled = 1;
Diletant 161:efd949e8d536 26 device.isacs.regulator.settings.start.reference = 0x00020000; //Reference voltage 2V in 16.16 signed fixed point format
Diletant 161:efd949e8d536 27 device.isacs.regulator.settings.start.scale = 1; //Scale factor
Diletant 161:efd949e8d536 28 //Regular operation settings
Diletant 166:c3c0b8a90d81 29 device.isacs.regulator.settings.regular.enabled = 1;
Diletant 161:efd949e8d536 30 device.isacs.regulator.settings.regular.reference = 0x00020000; //Reference voltage 2V in 16.16 signed fixed point format
Diletant 161:efd949e8d536 31 device.isacs.regulator.settings.regular.scale = 1; //Scale factor
Diletant 161:efd949e8d536 32 //Reset operation settings
Diletant 166:c3c0b8a90d81 33 device.isacs.regulator.settings.reset.enabled = 1;
Diletant 161:efd949e8d536 34 device.isacs.regulator.settings.reset.reference = 0x00020000; //Reference voltage 2V in 16.16 signed fixed point format
Diletant 161:efd949e8d536 35 device.isacs.regulator.settings.reset.scale = 1; //Scale factor
Diletant 161:efd949e8d536 36 }
Diletant 161:efd949e8d536 37
Diletant 167:bedc0a9d559a 38 void InitISACSRegulatorState(void){
Diletant 166:c3c0b8a90d81 39 device.isacs.regulator.state.enabled = device.isacs.regulator.settings.start.enabled;
Diletant 161:efd949e8d536 40 device.isacs.regulator.state.reference = device.isacs.regulator.settings.start.reference;
Diletant 161:efd949e8d536 41 device.isacs.regulator.state.scale = device.isacs.regulator.settings.start.scale;
Diletant 161:efd949e8d536 42 }
Diletant 161:efd949e8d536 43
Diletant 167:bedc0a9d559a 44 void DeviceStartISACSRegulator(void){
Diletant 167:bedc0a9d559a 45 }
Diletant 167:bedc0a9d559a 46
Diletant 167:bedc0a9d559a 47 void InitISACSDefaultSettings(void){
Diletant 167:bedc0a9d559a 48 InitISACSPotentiometersDefaultSettings();
Diletant 167:bedc0a9d559a 49 InitISACSRegulatorDefaultSettings();
Diletant 167:bedc0a9d559a 50 InitISACSOutputDefaultSettings();
Diletant 161:efd949e8d536 51 }
Diletant 161:efd949e8d536 52
Diletant 167:bedc0a9d559a 53 void InitISACSState(void){
Diletant 167:bedc0a9d559a 54 InitISACSPotentiometersState();
Diletant 167:bedc0a9d559a 55 InitISACSRegulatorState();
Diletant 167:bedc0a9d559a 56 InitISACSOutputState();
Diletant 161:efd949e8d536 57 }
Diletant 161:efd949e8d536 58
Diletant 167:bedc0a9d559a 59 void DeviceStartISACS(void){
Diletant 167:bedc0a9d559a 60 DeviceStartISACSPotentiometers();
Diletant 167:bedc0a9d559a 61 DeviceStartISACSRegulator();
Diletant 167:bedc0a9d559a 62 DeviceStartISACSOutput();
Diletant 161:efd949e8d536 63 }
Diletant 161:efd949e8d536 64
Diletant 166:c3c0b8a90d81 65 /*
Diletant 166:c3c0b8a90d81 66 //Count leading zeroes
Diletant 166:c3c0b8a90d81 67 static uint8_t clz(uint32_t x) {
Diletant 166:c3c0b8a90d81 68 uint8_t result = 0;
Diletant 166:c3c0b8a90d81 69 if (x == 0) return 32;
Diletant 166:c3c0b8a90d81 70 while (!(x & 0xF0000000)) { result += 4; x <<= 4; }
Diletant 166:c3c0b8a90d81 71 while (!(x & 0x80000000)) { result += 1; x <<= 1; }
Diletant 166:c3c0b8a90d81 72 return result;
Diletant 166:c3c0b8a90d81 73 }
Diletant 166:c3c0b8a90d81 74 //Count trailing zeroes
Diletant 166:c3c0b8a90d81 75 static uint8_t ctz(uint32_t x) {
Diletant 166:c3c0b8a90d81 76 uint8_t result = 0;
Diletant 166:c3c0b8a90d81 77 if (x == 0) return 32;
Diletant 166:c3c0b8a90d81 78 while (!(x & 0xF0000000)) { result += 4; x <<= 4; }
Diletant 166:c3c0b8a90d81 79 while (!(x & 0x80000000)) { result += 1; x <<= 1; }
Diletant 166:c3c0b8a90d81 80 return result;
Diletant 166:c3c0b8a90d81 81 }
Diletant 166:c3c0b8a90d81 82 */
Diletant 166:c3c0b8a90d81 83
Diletant 166:c3c0b8a90d81 84 int32_t isacsInterpolate(int32_t a,int32_t a1,int32_t a2,int32_t b1,int32_t b2) {
Diletant 166:c3c0b8a90d81 85 int32_t ma, mb;
Diletant 166:c3c0b8a90d81 86 while (1) {
Diletant 166:c3c0b8a90d81 87 if (a1 == a) return b1;
Diletant 166:c3c0b8a90d81 88 if (a2 == a) return b2;
Diletant 166:c3c0b8a90d81 89
Diletant 166:c3c0b8a90d81 90 ma = (a1 + a2) >> 1;
Diletant 166:c3c0b8a90d81 91 mb = (b1 + b2) >> 1;
Diletant 166:c3c0b8a90d81 92
Diletant 166:c3c0b8a90d81 93 if (a < ma) {
Diletant 166:c3c0b8a90d81 94 if (a2 == ma) return mb;
Diletant 166:c3c0b8a90d81 95 if (b1 == mb) return mb;
Diletant 166:c3c0b8a90d81 96 a2 = ma; b2 = mb;
Diletant 166:c3c0b8a90d81 97 } else if (a > ma) {
Diletant 166:c3c0b8a90d81 98 if (a1 == ma) return mb;
Diletant 166:c3c0b8a90d81 99 if (b2 == mb) return mb;
Diletant 166:c3c0b8a90d81 100 a1 = ma; b1 = mb;
Diletant 166:c3c0b8a90d81 101 } else return mb;
Diletant 166:c3c0b8a90d81 102 }
Diletant 166:c3c0b8a90d81 103 }
Diletant 166:c3c0b8a90d81 104
Diletant 173:7f938afb0447 105 int32_t isacsInput(uint32_t code) {
Diletant 166:c3c0b8a90d81 106 int32_t c1, c2;
Diletant 167:bedc0a9d559a 107 for (uint8_t i = 1; i < device.isacs.input.settings.transfer.points; i++) {
Diletant 167:bedc0a9d559a 108 c1 = device.isacs.input.settings.transfer.code[i - 1];
Diletant 166:c3c0b8a90d81 109 if (code < c1) {
Diletant 167:bedc0a9d559a 110 return device.isacs.input.settings.transfer.voltage[i - 1];
Diletant 166:c3c0b8a90d81 111 }
Diletant 166:c3c0b8a90d81 112
Diletant 167:bedc0a9d559a 113 c2 = device.isacs.input.settings.transfer.code[i];
Diletant 166:c3c0b8a90d81 114 if (code < c2) {
Diletant 167:bedc0a9d559a 115 int32_t v1 = device.isacs.input.settings.transfer.voltage[i - 1];
Diletant 167:bedc0a9d559a 116 int32_t v2 = device.isacs.input.settings.transfer.voltage[i];
Diletant 166:c3c0b8a90d81 117 return isacsInterpolate(code, c1, c2, v1, v2);
Diletant 166:c3c0b8a90d81 118 }
Diletant 166:c3c0b8a90d81 119 }
Diletant 167:bedc0a9d559a 120 return device.isacs.input.settings.transfer.voltage[device.isacs.input.settings.transfer.points - 1];
Diletant 166:c3c0b8a90d81 121 }
Diletant 166:c3c0b8a90d81 122
Diletant 173:7f938afb0447 123 int32_t isacsOutput(uint32_t voltage) {
Diletant 166:c3c0b8a90d81 124 int32_t v1, v2;
Diletant 167:bedc0a9d559a 125 for (uint8_t i = 1; i < device.isacs.output.settings.transfer.points; i++) {
Diletant 167:bedc0a9d559a 126 v1 = device.isacs.output.settings.transfer.voltage[i - 1];
Diletant 166:c3c0b8a90d81 127 if (voltage < v1) {
Diletant 167:bedc0a9d559a 128 return device.isacs.output.settings.transfer.code[i - 1];
Diletant 166:c3c0b8a90d81 129 }
Diletant 166:c3c0b8a90d81 130
Diletant 167:bedc0a9d559a 131 v2 = device.isacs.output.settings.transfer.voltage[i];
Diletant 166:c3c0b8a90d81 132 if (voltage < v2) {
Diletant 167:bedc0a9d559a 133 int32_t c1 = device.isacs.output.settings.transfer.code[i - 1];
Diletant 167:bedc0a9d559a 134 int32_t c2 = device.isacs.output.settings.transfer.code[i];
Diletant 166:c3c0b8a90d81 135 return isacsInterpolate(voltage, v1, v2, c1, c2);
Diletant 166:c3c0b8a90d81 136 }
Diletant 166:c3c0b8a90d81 137 }
Diletant 167:bedc0a9d559a 138 return device.isacs.output.settings.transfer.code[device.isacs.output.settings.transfer.points - 1];
Diletant 166:c3c0b8a90d81 139 }
Diletant 166:c3c0b8a90d81 140
Diletant 166:c3c0b8a90d81 141 /*
Diletant 166:c3c0b8a90d81 142 void isacsSetOutputVoltage(int32_t voltage) {
Diletant 166:c3c0b8a90d81 143 int32_t v1, v2;
Diletant 166:c3c0b8a90d81 144 for (uint8_t i = 1; i < device.isacs.output.interpolator.settings.points; i++) {
Diletant 166:c3c0b8a90d81 145 v1 = device.isacs.output.interpolator.settings.voltage[i - 1];
Diletant 166:c3c0b8a90d81 146 if (voltage < v1) {
Diletant 166:c3c0b8a90d81 147 uint32_t code = device.isacs.output.interpolator.settings.code[i - 1];
Diletant 166:c3c0b8a90d81 148 device.isacs.output.voltage = v1;
Diletant 166:c3c0b8a90d81 149 device.controller.SSP.out[0] = code;
Diletant 161:efd949e8d536 150 return;
Diletant 161:efd949e8d536 151 }
Diletant 161:efd949e8d536 152
Diletant 166:c3c0b8a90d81 153 v2 = device.isacs.output.interpolator.settings.voltage[i];
Diletant 166:c3c0b8a90d81 154 if (voltage < v2) {
Diletant 166:c3c0b8a90d81 155 //int32_t dv = device.isacs.output.state.voltage - v1;
Diletant 166:c3c0b8a90d81 156 //int32_t dvi = v2 - v1;
Diletant 166:c3c0b8a90d81 157 //int32_t c1 = device.isacs.output.settings.code[i - 1];
Diletant 166:c3c0b8a90d81 158 //int32_t c2 = device.isacs.output.settings.code[i];
Diletant 166:c3c0b8a90d81 159 //int32_t dc = c2 - c1;
Diletant 166:c3c0b8a90d81 160
Diletant 166:c3c0b8a90d81 161 //uint32_t m = 1;
Diletant 166:c3c0b8a90d81 162 //if (device.dac.settings.resolution > 16) {
Diletant 166:c3c0b8a90d81 163 // dv >>= 7; dc >>= 7; dvi >>= 7; m <<= 7;//For 24 bit: (21 - 7) + (24 - 7) - (21 - 7) + 7 = 24
Diletant 166:c3c0b8a90d81 164 //} else if (device.dac.settings.resolution > 12) {
Diletant 166:c3c0b8a90d81 165 // dv >>= 3; dc >>= 3; dvi >>= 3; m <<= 3;//For 16 bit: (21 - 3) + (16 - 3) - (21 - 3) + 3 = 16
Diletant 166:c3c0b8a90d81 166 //} else {
Diletant 166:c3c0b8a90d81 167 // dv >>= 1; dc >>= 1; dvi >>= 1; m <<= 1;//For 12 bit: (21 - 1) + (12 - 1) - (21 - 1) + 1 = 12
Diletant 166:c3c0b8a90d81 168 //}
Diletant 166:c3c0b8a90d81 169 //device.isacs.output.state.code = c1 + dv * dc / dvi * m;
Diletant 166:c3c0b8a90d81 170 //device.isacs.output.state.voltage = voltage;
Diletant 166:c3c0b8a90d81 171
Diletant 166:c3c0b8a90d81 172 int32_t c1 = device.isacs.output.interpolator.settings.code[i - 1];
Diletant 166:c3c0b8a90d81 173 int32_t c2 = device.isacs.output.interpolator.settings.code[i];
Diletant 166:c3c0b8a90d81 174 uint32_t code = isacsInterpolate(voltage, v1, v2, c1, c2);
Diletant 166:c3c0b8a90d81 175 device.isacs.output.voltage = voltage;
Diletant 166:c3c0b8a90d81 176 device.controller.SSP.out[0] = code;
Diletant 161:efd949e8d536 177 return;
Diletant 161:efd949e8d536 178 }
Diletant 161:efd949e8d536 179 }
Diletant 166:c3c0b8a90d81 180 uint32_t code = device.isacs.output.interpolator.settings.code[device.isacs.output.interpolator.settings.points - 1];
Diletant 166:c3c0b8a90d81 181 device.isacs.output.voltage = device.isacs.output.interpolator.settings.voltage[device.isacs.output.interpolator.settings.points - 1];
Diletant 166:c3c0b8a90d81 182 device.controller.SSP.out[0] = code;
Diletant 166:c3c0b8a90d81 183 }
Diletant 166:c3c0b8a90d81 184
Diletant 166:c3c0b8a90d81 185 void isacsSetOutputCode(int32_t code) {
Diletant 166:c3c0b8a90d81 186 int32_t c1, c2;
Diletant 166:c3c0b8a90d81 187 for (uint8_t i = 1; i < device.isacs.output.interpolator.settings.points; i++) {
Diletant 166:c3c0b8a90d81 188 c1 = device.isacs.output.interpolator.settings.code[i - 1];
Diletant 166:c3c0b8a90d81 189 if (code < c1) {
Diletant 166:c3c0b8a90d81 190 device.isacs.output.voltage = device.isacs.output.interpolator.settings.voltage[i - 1];
Diletant 166:c3c0b8a90d81 191 device.controller.SSP.out[0] = c1;
Diletant 166:c3c0b8a90d81 192 return;
Diletant 166:c3c0b8a90d81 193 }
Diletant 166:c3c0b8a90d81 194
Diletant 166:c3c0b8a90d81 195 c2 = device.isacs.output.interpolator.settings.code[i];
Diletant 166:c3c0b8a90d81 196 if (code < c2) {
Diletant 166:c3c0b8a90d81 197 int32_t v1 = device.isacs.output.interpolator.settings.voltage[i - 1];
Diletant 166:c3c0b8a90d81 198 int32_t v2 = device.isacs.output.interpolator.settings.voltage[i];
Diletant 166:c3c0b8a90d81 199 device.isacs.output.voltage = isacsInterpolate(code, c1, c2, v1, v2);
Diletant 166:c3c0b8a90d81 200 device.controller.SSP.out[0] = code;
Diletant 166:c3c0b8a90d81 201 return;
Diletant 166:c3c0b8a90d81 202 }
Diletant 166:c3c0b8a90d81 203 }
Diletant 166:c3c0b8a90d81 204 device.isacs.output.voltage = device.isacs.output.interpolator.settings.voltage[device.isacs.output.interpolator.settings.points - 1];
Diletant 166:c3c0b8a90d81 205 device.controller.SSP.out[0] = device.isacs.output.interpolator.settings.code[device.isacs.output.interpolator.settings.points - 1];
Diletant 166:c3c0b8a90d81 206 }
Diletant 166:c3c0b8a90d81 207 */
Diletant 166:c3c0b8a90d81 208
Diletant 166:c3c0b8a90d81 209 void isacsProcess(void) {
Diletant 173:7f938afb0447 210 device.isacs.input.state.voltage = isacsInput(device.controller.SSP.in[4]);
Diletant 167:bedc0a9d559a 211 device.isacs.input.state.sum += device.isacs.input.state.voltage;
Diletant 166:c3c0b8a90d81 212 if (device.measurement.counter == 31) {
Diletant 167:bedc0a9d559a 213 device.isacs.input.state.average = device.isacs.input.state.sum >> 5;
Diletant 167:bedc0a9d559a 214 device.isacs.input.state.sum = 0;
Diletant 166:c3c0b8a90d81 215
Diletant 166:c3c0b8a90d81 216 if (device.isacs.regulator.state.enabled) {
Diletant 167:bedc0a9d559a 217 device.isacs.regulator.state.error = device.isacs.regulator.state.reference - device.isacs.input.state.average;
Diletant 167:bedc0a9d559a 218 device.isacs.output.state.voltage += device.isacs.regulator.state.error * device.isacs.regulator.state.scale;
Diletant 173:7f938afb0447 219 device.controller.SSP.out[0] = isacsOutput(device.isacs.output.state.voltage);
Diletant 166:c3c0b8a90d81 220 }
Diletant 166:c3c0b8a90d81 221 }
Diletant 161:efd949e8d536 222 }