123
Fork of LG by
DeviceISACS.c@161:efd949e8d536, 2016-05-15 (annotated)
- Committer:
- Diletant
- Date:
- Sun May 15 19:12:12 2016 +0000
- Revision:
- 161:efd949e8d536
- Child:
- 166:c3c0b8a90d81
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 | 161:efd949e8d536 | 5 | void InitISACSOutputWithDefaults(void){ |
Diletant | 161:efd949e8d536 | 6 | device.isacs.output.settings.points = 2; |
Diletant | 161:efd949e8d536 | 7 | //Control point 1.5 volt |
Diletant | 161:efd949e8d536 | 8 | device.isacs.output.settings.voltage[0] = 0x00017fff; |
Diletant | 161:efd949e8d536 | 9 | device.isacs.output.settings.code[0] = 800; |
Diletant | 161:efd949e8d536 | 10 | //Control point 12.5 volt |
Diletant | 161:efd949e8d536 | 11 | device.isacs.output.settings.voltage[1] = 0x000c7fff; |
Diletant | 161:efd949e8d536 | 12 | device.isacs.output.settings.code[1] = 2048; |
Diletant | 161:efd949e8d536 | 13 | } |
Diletant | 161:efd949e8d536 | 14 | |
Diletant | 161:efd949e8d536 | 15 | void InitISACSOutput(void){ |
Diletant | 161:efd949e8d536 | 16 | device.isacs.output.state.voltage = 0x000c7fff; |
Diletant | 161:efd949e8d536 | 17 | isacsOutputCode(); |
Diletant | 161:efd949e8d536 | 18 | } |
Diletant | 161:efd949e8d536 | 19 | |
Diletant | 161:efd949e8d536 | 20 | void InitISACSRegulatorWithDefaults(void){ |
Diletant | 161:efd949e8d536 | 21 | device.isacs.regulator.settings.enabled = 1; |
Diletant | 161:efd949e8d536 | 22 | //Startup settings |
Diletant | 161:efd949e8d536 | 23 | device.isacs.regulator.settings.start.reference = 0x00020000; //Reference voltage 2V in 16.16 signed fixed point format |
Diletant | 161:efd949e8d536 | 24 | device.isacs.regulator.settings.start.scale = 1; //Scale factor |
Diletant | 161:efd949e8d536 | 25 | //Regular operation settings |
Diletant | 161:efd949e8d536 | 26 | device.isacs.regulator.settings.regular.reference = 0x00020000; //Reference voltage 2V in 16.16 signed fixed point format |
Diletant | 161:efd949e8d536 | 27 | device.isacs.regulator.settings.regular.scale = 1; //Scale factor |
Diletant | 161:efd949e8d536 | 28 | //Reset operation settings |
Diletant | 161:efd949e8d536 | 29 | device.isacs.regulator.settings.reset.reference = 0x00020000; //Reference voltage 2V in 16.16 signed fixed point format |
Diletant | 161:efd949e8d536 | 30 | device.isacs.regulator.settings.reset.scale = 1; //Scale factor |
Diletant | 161:efd949e8d536 | 31 | //Amplifier settings |
Diletant | 161:efd949e8d536 | 32 | //device.isacs.amplifier.settings.reference = 0x00040000; //Reference voltage 4V in 16.16 signed fixed point format |
Diletant | 161:efd949e8d536 | 33 | //device.isacs.amplifier.settings.gain = 1; //Scale factor |
Diletant | 161:efd949e8d536 | 34 | } |
Diletant | 161:efd949e8d536 | 35 | |
Diletant | 161:efd949e8d536 | 36 | void InitISACSRegulator(void){ |
Diletant | 161:efd949e8d536 | 37 | device.isacs.regulator.state.enabled = device.isacs.regulator.settings.enabled; |
Diletant | 161:efd949e8d536 | 38 | device.isacs.regulator.state.reference = device.isacs.regulator.settings.start.reference; |
Diletant | 161:efd949e8d536 | 39 | device.isacs.regulator.state.scale = device.isacs.regulator.settings.start.scale; |
Diletant | 161:efd949e8d536 | 40 | } |
Diletant | 161:efd949e8d536 | 41 | |
Diletant | 161:efd949e8d536 | 42 | void InitISACSWithDefaults(void){ |
Diletant | 161:efd949e8d536 | 43 | InitISACSOutputWithDefaults(); |
Diletant | 161:efd949e8d536 | 44 | InitISACSRegulatorWithDefaults(); |
Diletant | 161:efd949e8d536 | 45 | InitISACSPotentiometersWithDefaults(); |
Diletant | 161:efd949e8d536 | 46 | } |
Diletant | 161:efd949e8d536 | 47 | |
Diletant | 161:efd949e8d536 | 48 | void InitISACS(void){ |
Diletant | 161:efd949e8d536 | 49 | InitISACSOutput(); |
Diletant | 161:efd949e8d536 | 50 | InitISACSRegulator(); |
Diletant | 161:efd949e8d536 | 51 | InitISACSPotentiometers(); |
Diletant | 161:efd949e8d536 | 52 | } |
Diletant | 161:efd949e8d536 | 53 | |
Diletant | 161:efd949e8d536 | 54 | void StartISACS(void){ |
Diletant | 161:efd949e8d536 | 55 | } |
Diletant | 161:efd949e8d536 | 56 | |
Diletant | 161:efd949e8d536 | 57 | void isacsOutputCode(void) { |
Diletant | 161:efd949e8d536 | 58 | uint32_t v1, v2; |
Diletant | 161:efd949e8d536 | 59 | for (uint8_t i = 1; i < device.isacs.output.settings.points; i++) { |
Diletant | 161:efd949e8d536 | 60 | v1 = device.isacs.output.settings.voltage[i - 1]; |
Diletant | 161:efd949e8d536 | 61 | if (device.isacs.output.state.voltage < v1) { |
Diletant | 161:efd949e8d536 | 62 | device.isacs.output.state.code = device.isacs.output.settings.code[i - 1]; |
Diletant | 161:efd949e8d536 | 63 | device.isacs.output.state.voltage = v1; |
Diletant | 161:efd949e8d536 | 64 | return; |
Diletant | 161:efd949e8d536 | 65 | } |
Diletant | 161:efd949e8d536 | 66 | |
Diletant | 161:efd949e8d536 | 67 | v2 = device.isacs.output.settings.voltage[i]; |
Diletant | 161:efd949e8d536 | 68 | if (device.isacs.output.state.voltage < v2) { |
Diletant | 161:efd949e8d536 | 69 | //max(c2 - c1) = 4096 |
Diletant | 161:efd949e8d536 | 70 | //max(v - v1) = 25V = 0x00190000; |
Diletant | 161:efd949e8d536 | 71 | //max((c2 - c1) * (v - v1)) = 0x190000000 |
Diletant | 161:efd949e8d536 | 72 | //0x190000000 >> 2 = 0x64000000 < 0x80000000: ok |
Diletant | 161:efd949e8d536 | 73 | uint32_t dv = (device.isacs.output.state.voltage - v1); |
Diletant | 161:efd949e8d536 | 74 | uint32_t dvi = (v2 - v1); |
Diletant | 161:efd949e8d536 | 75 | uint32_t c1 = device.isacs.output.settings.code[i - 1]; |
Diletant | 161:efd949e8d536 | 76 | uint32_t c2 = device.isacs.output.settings.code[i]; |
Diletant | 161:efd949e8d536 | 77 | uint32_t dc = c2 - c1; |
Diletant | 161:efd949e8d536 | 78 | uint32_t m = 1; |
Diletant | 161:efd949e8d536 | 79 | if (device.dac.settings.resolution > 16) { |
Diletant | 161:efd949e8d536 | 80 | dv >>= 7; dc >>= 7; dvi >>= 7; m <<= 7;//For 24 bit: (21 - 7) + (24 - 7) - (21 - 7) + 7 = 24 |
Diletant | 161:efd949e8d536 | 81 | } else if (device.dac.settings.resolution > 12) { |
Diletant | 161:efd949e8d536 | 82 | dv >>= 3; dc >>= 3; dvi >>= 3; m <<= 3;//For 16 bit: (21 - 3) + (16 - 3) - (21 - 3) + 3 = 16 |
Diletant | 161:efd949e8d536 | 83 | } else { |
Diletant | 161:efd949e8d536 | 84 | dv >>= 1; dc >>= 1; dvi >>= 1; m <<= 1;//For 12 bit: (21 - 1) + (12 - 1) - (21 - 1) + 1 = 12 |
Diletant | 161:efd949e8d536 | 85 | } |
Diletant | 161:efd949e8d536 | 86 | device.isacs.output.state.code = c1 + dv * dc / dvi * m; |
Diletant | 161:efd949e8d536 | 87 | return; |
Diletant | 161:efd949e8d536 | 88 | } |
Diletant | 161:efd949e8d536 | 89 | } |
Diletant | 161:efd949e8d536 | 90 | device.isacs.output.state.code = device.isacs.output.settings.code[device.isacs.output.settings.points - 1]; |
Diletant | 161:efd949e8d536 | 91 | device.isacs.output.state.voltage = device.isacs.output.settings.voltage[device.isacs.output.settings.points - 1]; |
Diletant | 161:efd949e8d536 | 92 | } |