123
Fork of LG by
DeviceISACS.c@173:7f938afb0447, 2016-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |