K22F Power Conditioner
Dependencies: NetworkServices W5500Interface
main.cpp@1:f857c10c3cd2, 2017-06-13 (annotated)
- Committer:
- amccartney
- Date:
- Tue Jun 13 21:58:35 2017 +0000
- Revision:
- 1:f857c10c3cd2
- Parent:
- 0:9d0945119ba4
- Child:
- 2:ab7e8b9c7903
Prototype code complete
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
amccartney | 0:9d0945119ba4 | 1 | #include "mbed.h" |
amccartney | 1:f857c10c3cd2 | 2 | #include "config.h" |
amccartney | 0:9d0945119ba4 | 3 | |
amccartney | 1:f857c10c3cd2 | 4 | #define READBUFFERSIZE (32) |
amccartney | 1:f857c10c3cd2 | 5 | |
amccartney | 1:f857c10c3cd2 | 6 | RawSerial pc(USBTX, USBRX); |
amccartney | 0:9d0945119ba4 | 7 | DigitalIn sw2(SW2); |
amccartney | 0:9d0945119ba4 | 8 | DigitalIn sw3(SW3); |
amccartney | 1:f857c10c3cd2 | 9 | InterruptIn zeroCross(A2);//Arduino A2 |
amccartney | 1:f857c10c3cd2 | 10 | Timer halfCycle; |
amccartney | 1:f857c10c3cd2 | 11 | Ticker freqGen; |
amccartney | 1:f857c10c3cd2 | 12 | Ticker sampler; |
amccartney | 1:f857c10c3cd2 | 13 | DigitalOut do1(D7);//Arduino D7 |
amccartney | 1:f857c10c3cd2 | 14 | DigitalOut do2(D6);//Arduino D6 |
amccartney | 1:f857c10c3cd2 | 15 | AnalogIn Vrms(A0); |
amccartney | 1:f857c10c3cd2 | 16 | AnalogIn Arms(A1); |
amccartney | 1:f857c10c3cd2 | 17 | //LocalFileSystem local("local"); |
amccartney | 1:f857c10c3cd2 | 18 | //FlashIAP flash; |
amccartney | 0:9d0945119ba4 | 19 | |
amccartney | 1:f857c10c3cd2 | 20 | int flip = 0; |
amccartney | 1:f857c10c3cd2 | 21 | int halfPeriod = 16600; |
amccartney | 1:f857c10c3cd2 | 22 | float freq = 60; |
amccartney | 1:f857c10c3cd2 | 23 | float period = 0; |
amccartney | 1:f857c10c3cd2 | 24 | double setFreq = 50.00; |
amccartney | 1:f857c10c3cd2 | 25 | double periodFreqGen; |
amccartney | 1:f857c10c3cd2 | 26 | float Vsample[32]; |
amccartney | 1:f857c10c3cd2 | 27 | float Asample[32]; |
amccartney | 1:f857c10c3cd2 | 28 | int sample = 0; |
amccartney | 1:f857c10c3cd2 | 29 | int sampleMax = 0; |
amccartney | 1:f857c10c3cd2 | 30 | float Vhold[32]; |
amccartney | 1:f857c10c3cd2 | 31 | float Ahold[32]; |
amccartney | 1:f857c10c3cd2 | 32 | int i; |
amccartney | 1:f857c10c3cd2 | 33 | int j; |
amccartney | 1:f857c10c3cd2 | 34 | int cycleFlag = 0; |
amccartney | 1:f857c10c3cd2 | 35 | double VsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 36 | double Vmean = 0; |
amccartney | 1:f857c10c3cd2 | 37 | double Vroot = 0; |
amccartney | 1:f857c10c3cd2 | 38 | double AsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 39 | double Amean = 0; |
amccartney | 1:f857c10c3cd2 | 40 | double Aroot = 0; |
amccartney | 1:f857c10c3cd2 | 41 | char tempBuffer[20]; |
amccartney | 1:f857c10c3cd2 | 42 | char buffer[20]; |
amccartney | 1:f857c10c3cd2 | 43 | char k = 0; |
amccartney | 1:f857c10c3cd2 | 44 | char c; |
amccartney | 0:9d0945119ba4 | 45 | |
amccartney | 1:f857c10c3cd2 | 46 | void rxCallback() |
amccartney | 0:9d0945119ba4 | 47 | { |
amccartney | 1:f857c10c3cd2 | 48 | do1 = 1; |
amccartney | 1:f857c10c3cd2 | 49 | c = pc.getc(); |
amccartney | 1:f857c10c3cd2 | 50 | do1 = 0; |
amccartney | 1:f857c10c3cd2 | 51 | tempBuffer[k] = c; |
amccartney | 1:f857c10c3cd2 | 52 | k++; |
amccartney | 1:f857c10c3cd2 | 53 | do1 = 1; |
amccartney | 1:f857c10c3cd2 | 54 | if ( c == '\n' ) |
amccartney | 1:f857c10c3cd2 | 55 | { |
amccartney | 1:f857c10c3cd2 | 56 | k = 0; |
amccartney | 1:f857c10c3cd2 | 57 | strncpy(buffer,tempBuffer,sizeof(tempBuffer)); |
amccartney | 1:f857c10c3cd2 | 58 | memset(tempBuffer,0,sizeof(tempBuffer)); |
amccartney | 0:9d0945119ba4 | 59 | } |
amccartney | 1:f857c10c3cd2 | 60 | //pc.printf("\n%s\n", &buffer); //echo back to terminal |
amccartney | 1:f857c10c3cd2 | 61 | do1 = 0; |
amccartney | 0:9d0945119ba4 | 62 | } |
amccartney | 0:9d0945119ba4 | 63 | |
amccartney | 1:f857c10c3cd2 | 64 | void sampleTimer() |
amccartney | 1:f857c10c3cd2 | 65 | { |
amccartney | 1:f857c10c3cd2 | 66 | do2 = 1; |
amccartney | 1:f857c10c3cd2 | 67 | Asample[sample] = ( 1 / 0.34286 ) * 3.3 * Arms.read(); |
amccartney | 1:f857c10c3cd2 | 68 | Vsample[sample] = 64.7519 * 3.3 * Vrms.read(); |
amccartney | 1:f857c10c3cd2 | 69 | sample++; |
amccartney | 1:f857c10c3cd2 | 70 | if ( sample == 33 ) //In case there is no zero cross signal |
amccartney | 1:f857c10c3cd2 | 71 | { |
amccartney | 1:f857c10c3cd2 | 72 | sample = 0; |
amccartney | 1:f857c10c3cd2 | 73 | cycleFlag = 1; |
amccartney | 1:f857c10c3cd2 | 74 | } |
amccartney | 1:f857c10c3cd2 | 75 | do2 = 0; |
amccartney | 1:f857c10c3cd2 | 76 | } |
amccartney | 1:f857c10c3cd2 | 77 | |
amccartney | 1:f857c10c3cd2 | 78 | void startMeasFreq() |
amccartney | 0:9d0945119ba4 | 79 | { |
amccartney | 1:f857c10c3cd2 | 80 | halfCycle.start(); |
amccartney | 1:f857c10c3cd2 | 81 | sampler.detach(); |
amccartney | 1:f857c10c3cd2 | 82 | sampler.attach(&sampleTimer, (periodFreqGen / 32) ); |
amccartney | 1:f857c10c3cd2 | 83 | for (j = 0; j < 32; j++) { |
amccartney | 1:f857c10c3cd2 | 84 | Vhold[j] = Vsample[j]; |
amccartney | 1:f857c10c3cd2 | 85 | Ahold[j] = Asample[j]; |
amccartney | 1:f857c10c3cd2 | 86 | } |
amccartney | 1:f857c10c3cd2 | 87 | cycleFlag = 1; |
amccartney | 1:f857c10c3cd2 | 88 | sampleMax = sample; |
amccartney | 1:f857c10c3cd2 | 89 | sample = 0; //Reset the sample counter |
amccartney | 0:9d0945119ba4 | 90 | } |
amccartney | 0:9d0945119ba4 | 91 | |
amccartney | 1:f857c10c3cd2 | 92 | void stopMeasFreq() |
amccartney | 1:f857c10c3cd2 | 93 | { |
amccartney | 1:f857c10c3cd2 | 94 | halfPeriod = ( halfPeriod + halfCycle.read_us() ) /2; |
amccartney | 1:f857c10c3cd2 | 95 | halfCycle.stop(); |
amccartney | 1:f857c10c3cd2 | 96 | halfCycle.reset(); |
amccartney | 1:f857c10c3cd2 | 97 | } |
amccartney | 1:f857c10c3cd2 | 98 | |
amccartney | 0:9d0945119ba4 | 99 | int main() |
amccartney | 0:9d0945119ba4 | 100 | { |
amccartney | 0:9d0945119ba4 | 101 | |
amccartney | 1:f857c10c3cd2 | 102 | float VA; |
amccartney | 1:f857c10c3cd2 | 103 | int PercentLoad = 0; |
amccartney | 0:9d0945119ba4 | 104 | |
amccartney | 1:f857c10c3cd2 | 105 | //NVIC_SetPriority(PORTC_IRQn, 2); |
amccartney | 1:f857c10c3cd2 | 106 | pc.baud(115200); |
amccartney | 1:f857c10c3cd2 | 107 | pc.printf("\n\nFRDM-K22F Power Conditioner.\n\n"); |
amccartney | 1:f857c10c3cd2 | 108 | do1 = 0; |
amccartney | 1:f857c10c3cd2 | 109 | do2 = 0; |
amccartney | 1:f857c10c3cd2 | 110 | |
amccartney | 1:f857c10c3cd2 | 111 | while(pc.readable()) { |
amccartney | 1:f857c10c3cd2 | 112 | //char e = pc.getc(); |
amccartney | 0:9d0945119ba4 | 113 | } |
amccartney | 0:9d0945119ba4 | 114 | |
amccartney | 1:f857c10c3cd2 | 115 | |
amccartney | 1:f857c10c3cd2 | 116 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 117 | wait(2.0); |
amccartney | 1:f857c10c3cd2 | 118 | periodFreqGen = ( ( 1 / freq ) ); |
amccartney | 1:f857c10c3cd2 | 119 | //pc.printf("periodFreqGen: %f\n",periodFreqGen); |
amccartney | 1:f857c10c3cd2 | 120 | sampler.attach(&sampleTimer, (periodFreqGen / 32) ); |
amccartney | 1:f857c10c3cd2 | 121 | zeroCross.fall(&startMeasFreq); |
amccartney | 1:f857c10c3cd2 | 122 | zeroCross.rise(&stopMeasFreq); |
amccartney | 1:f857c10c3cd2 | 123 | pc.attach(&rxCallback,pc.RxIrq);//Serial::RxIrq); |
amccartney | 1:f857c10c3cd2 | 124 | while(1) |
amccartney | 1:f857c10c3cd2 | 125 | { |
amccartney | 1:f857c10c3cd2 | 126 | period = halfPeriod * 2; |
amccartney | 1:f857c10c3cd2 | 127 | freq = 0.5 * ( 1000000 / halfPeriod ); |
amccartney | 1:f857c10c3cd2 | 128 | |
amccartney | 1:f857c10c3cd2 | 129 | if (cycleFlag == 1) |
amccartney | 1:f857c10c3cd2 | 130 | { |
amccartney | 1:f857c10c3cd2 | 131 | for (i=0; i<32; i++) |
amccartney | 1:f857c10c3cd2 | 132 | { |
amccartney | 1:f857c10c3cd2 | 133 | VsumSq = VsumSq + (Vhold[i] * Vhold[i]); |
amccartney | 1:f857c10c3cd2 | 134 | AsumSq = AsumSq + (Ahold[i] * Ahold[i]); |
amccartney | 1:f857c10c3cd2 | 135 | } |
amccartney | 1:f857c10c3cd2 | 136 | Vmean = VsumSq / 32; |
amccartney | 1:f857c10c3cd2 | 137 | Amean = AsumSq / 32; |
amccartney | 1:f857c10c3cd2 | 138 | Vroot = ( Vroot + sqrt(Vmean) ) / 2; |
amccartney | 1:f857c10c3cd2 | 139 | Aroot = ( Aroot + sqrt(Amean) ) / 2; |
amccartney | 1:f857c10c3cd2 | 140 | VA = Vroot * Aroot; |
amccartney | 1:f857c10c3cd2 | 141 | PercentLoad = (int)(100 * ( VA / NOMVA )); |
amccartney | 1:f857c10c3cd2 | 142 | |
amccartney | 1:f857c10c3cd2 | 143 | VsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 144 | AsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 145 | cycleFlag = 0; |
amccartney | 1:f857c10c3cd2 | 146 | } |
amccartney | 1:f857c10c3cd2 | 147 | if (strncmp (buffer,"PID.FORMAT",10) == 0) |
amccartney | 1:f857c10c3cd2 | 148 | { |
amccartney | 1:f857c10c3cd2 | 149 | pc.printf("PID.FORMAT=PROT;VER;UID;BAT;BTM;INP;OUT;ALM;TST;SET;PDU;SYS;OEM;BUZ\n"); |
amccartney | 1:f857c10c3cd2 | 150 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 151 | } else if (strncmp (buffer,"PID",3) == 0) |
amccartney | 1:f857c10c3cd2 | 152 | { |
amccartney | 1:f857c10c3cd2 | 153 | pc.printf("PID=CUSPP;1.13;1;0;0;0;1;0;0;0;0;1;0;0\n"); |
amccartney | 1:f857c10c3cd2 | 154 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 155 | } else if (strncmp (buffer,"UID",3) == 0) |
amccartney | 1:f857c10c3cd2 | 156 | { |
amccartney | 1:f857c10c3cd2 | 157 | pc.printf("UID=AMETEK-POWERVAR;%s;%s;ABC;;PowerCond;%s;20150715\n", &MODEL, &MODEL, &SERIALNO); |
amccartney | 1:f857c10c3cd2 | 158 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 159 | } else if (strncmp (buffer,"SYS.FORMAT",10) == 0) |
amccartney | 1:f857c10c3cd2 | 160 | { |
amccartney | 1:f857c10c3cd2 | 161 | pc.printf("SYS.FORMAT=TOPLGY.N;INVOLT.N;INFRQ.N;INPHS.N;OUTVLT.N;OUTFRQ.N;OUTVA.N;OUTPWR.N;OUTPHS.N;HITEMP.W;OUTQTY.N;OVRLOD.W\n"); |
amccartney | 1:f857c10c3cd2 | 162 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 163 | } else if (strncmp (buffer,"SYS",3) == 0) |
amccartney | 1:f857c10c3cd2 | 164 | { |
amccartney | 1:f857c10c3cd2 | 165 | pc.printf("SYS=0;%d;%d;1;%d;%d.%d;%d;1;35;1;100\n", NOMV, NOMF, NOMV, NOMF, NOMVA, NOMVA); |
amccartney | 1:f857c10c3cd2 | 166 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 167 | } else if (strncmp (buffer,"OUT.FORMAT",10) == 0) |
amccartney | 1:f857c10c3cd2 | 168 | { |
amccartney | 1:f857c10c3cd2 | 169 | pc.printf("OUT.FORMAT=SOURCE.N;FREQ.N;VOLT.N;AMP.N;PWR.N;PERCNT.N\n"); |
amccartney | 1:f857c10c3cd2 | 170 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 171 | } else if (strncmp (buffer,"OUT",3) == 0) |
amccartney | 1:f857c10c3cd2 | 172 | { |
amccartney | 1:f857c10c3cd2 | 173 | pc.printf("OUT=0;%3.1f;%3.1f;%3.1f:%.0f;%d\n", freq, Vroot, Aroot, VA, PercentLoad); |
amccartney | 1:f857c10c3cd2 | 174 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 175 | } else if ((buffer[0]) != 0) |
amccartney | 1:f857c10c3cd2 | 176 | { |
amccartney | 1:f857c10c3cd2 | 177 | pc.printf("?\n"); |
amccartney | 1:f857c10c3cd2 | 178 | memset(buffer,0,sizeof(buffer)); |
amccartney | 1:f857c10c3cd2 | 179 | } |
amccartney | 1:f857c10c3cd2 | 180 | wait(1.0); |
amccartney | 1:f857c10c3cd2 | 181 | } |
amccartney | 1:f857c10c3cd2 | 182 | } |
amccartney | 1:f857c10c3cd2 | 183 |