123

Dependencies:   mbed

Fork of LG by igor Apu

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?

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