K22F Power Conditioner

Dependencies:   NetworkServices W5500Interface

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?

UserRevisionLine numberNew 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