
Main code of our project.
Dependencies: TextLCD mbed PID
main.cpp@15:e1a76426fb6a, 2018-10-24 (annotated)
- Committer:
- nicovv44
- Date:
- Wed Oct 24 08:42:30 2018 +0000
- Revision:
- 15:e1a76426fb6a
- Parent:
- 14:3f7e54ee1211
Relay for DC is OK. Attempt to get the phase angle.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nicovv44 | 0:1f66eaf1013d | 1 | #include "mbed.h" |
nicovv44 | 0:1f66eaf1013d | 2 | #include "TextLCD.h" |
nicovv44 | 9:70bfbd406554 | 3 | #include "PID.h" |
nicovv44 | 9:70bfbd406554 | 4 | |
nicovv44 | 13:83cc9d66749d | 5 | #define PIDRATE 0.2 |
nicovv44 | 9:70bfbd406554 | 6 | |
nicovv44 | 9:70bfbd406554 | 7 | //Kc, Ti, Td, interval |
nicovv44 | 13:83cc9d66749d | 8 | PID PIDcontroller1(2.9, 1.0, 0.0, PIDRATE);//frequency PID |
nicovv44 | 15:e1a76426fb6a | 9 | PID PIDcontroller2(0.4, 1.0, 0.0, PIDRATE);//amplitude PID |
nicovv44 | 0:1f66eaf1013d | 10 | |
nicovv44 | 0:1f66eaf1013d | 11 | TextLCD lcd(D2, D3, D4, D5, D6, D7); // rs, e, d4-d7 |
nicovv44 | 0:1f66eaf1013d | 12 | Serial pc(USBTX, USBRX); // tx, rx |
nicovv44 | 5:e9766e0573d0 | 13 | PwmOut pwmDC(D9); |
nicovv44 | 5:e9766e0573d0 | 14 | PwmOut pwmSY(D13); |
nicovv44 | 5:e9766e0573d0 | 15 | DigitalOut relay1(D8); |
nicovv44 | 5:e9766e0573d0 | 16 | DigitalOut relay2(D14); |
nicovv44 | 5:e9766e0573d0 | 17 | DigitalOut relay3(D11); |
nicovv44 | 5:e9766e0573d0 | 18 | DigitalOut relay4(D12); |
nicovv44 | 0:1f66eaf1013d | 19 | |
nicovv44 | 14:3f7e54ee1211 | 20 | DigitalIn userButton(USER_BUTTON); |
nicovv44 | 14:3f7e54ee1211 | 21 | |
nicovv44 | 3:a1b11dfd26f3 | 22 | AnalogIn syncPin(A0); |
nicovv44 | 3:a1b11dfd26f3 | 23 | AnalogIn gridPin(A1); |
nicovv44 | 3:a1b11dfd26f3 | 24 | AnalogIn differentialPin(A2); |
nicovv44 | 5:e9766e0573d0 | 25 | AnalogIn potarDC(A3); |
nicovv44 | 5:e9766e0573d0 | 26 | AnalogIn potarSY(A4); |
nicovv44 | 15:e1a76426fb6a | 27 | AnalogIn currentPin(A5); |
nicovv44 | 0:1f66eaf1013d | 28 | |
nicovv44 | 0:1f66eaf1013d | 29 | const float sqrt2 = 1.414213562; |
nicovv44 | 0:1f66eaf1013d | 30 | |
nicovv44 | 0:1f66eaf1013d | 31 | Timeout timeout; |
nicovv44 | 5:e9766e0573d0 | 32 | Ticker tickerPWMDC; |
nicovv44 | 11:b6bee52941ea | 33 | Ticker tickerPID; |
nicovv44 | 0:1f66eaf1013d | 34 | volatile bool looping = false; |
nicovv44 | 4:886ce7eefa6e | 35 | volatile bool synchronized = false; |
nicovv44 | 4:886ce7eefa6e | 36 | volatile bool mainLoop = true; |
nicovv44 | 9:70bfbd406554 | 37 | volatile float PID1Output; |
nicovv44 | 13:83cc9d66749d | 38 | volatile float PID2Output; |
nicovv44 | 0:1f66eaf1013d | 39 | |
nicovv44 | 0:1f66eaf1013d | 40 | |
nicovv44 | 0:1f66eaf1013d | 41 | // ############################################## |
nicovv44 | 0:1f66eaf1013d | 42 | // ########## PROTOTYPES ######################## |
nicovv44 | 0:1f66eaf1013d | 43 | // ############################################################################# |
nicovv44 | 0:1f66eaf1013d | 44 | void stopLooping(void); |
nicovv44 | 0:1f66eaf1013d | 45 | float getVolageRMS(AnalogIn ana_pin); |
nicovv44 | 0:1f66eaf1013d | 46 | float getVolageReadedMax(AnalogIn ana_pin); |
nicovv44 | 0:1f66eaf1013d | 47 | float getFrequency(AnalogIn ana_pin); |
nicovv44 | 4:886ce7eefa6e | 48 | void displayLCD(float syncRMS, float gridRMS, float syncFreq, float gridFreq); |
nicovv44 | 5:e9766e0573d0 | 49 | void tickerPWMDCfunction(); |
nicovv44 | 9:70bfbd406554 | 50 | void initPID1(); |
nicovv44 | 13:83cc9d66749d | 51 | void initPID2(); |
nicovv44 | 9:70bfbd406554 | 52 | void tickerPIDfunction(); |
nicovv44 | 15:e1a76426fb6a | 53 | float getPhaseAngle(AnalogIn voltage_pin, AnalogIn current_pin); |
nicovv44 | 0:1f66eaf1013d | 54 | |
nicovv44 | 0:1f66eaf1013d | 55 | |
nicovv44 | 0:1f66eaf1013d | 56 | // ############################################## |
nicovv44 | 0:1f66eaf1013d | 57 | // ########## MAIN ############################## |
nicovv44 | 0:1f66eaf1013d | 58 | // ############################################################################# |
nicovv44 | 0:1f66eaf1013d | 59 | int main() { |
nicovv44 | 3:a1b11dfd26f3 | 60 | float syncRMS, gridRMS, syncFreq, gridFreq; |
nicovv44 | 0:1f66eaf1013d | 61 | |
nicovv44 | 5:e9766e0573d0 | 62 | relay1 = 1;//Relay off=1, on=0 |
nicovv44 | 5:e9766e0573d0 | 63 | relay2 = 1;//Relay off=1, on=0 |
nicovv44 | 5:e9766e0573d0 | 64 | relay3 = 1;//Relay off=1, on=0 |
nicovv44 | 8:a161b056971c | 65 | relay4 = 0;//Relay off=1, on=0 |
nicovv44 | 15:e1a76426fb6a | 66 | |
nicovv44 | 15:e1a76426fb6a | 67 | //initialise PIDcontrollers |
nicovv44 | 15:e1a76426fb6a | 68 | initPID1(); |
nicovv44 | 15:e1a76426fb6a | 69 | initPID2(); |
nicovv44 | 15:e1a76426fb6a | 70 | |
nicovv44 | 15:e1a76426fb6a | 71 | |
nicovv44 | 5:e9766e0573d0 | 72 | |
nicovv44 | 14:3f7e54ee1211 | 73 | |
nicovv44 | 4:886ce7eefa6e | 74 | while(mainLoop){ |
nicovv44 | 15:e1a76426fb6a | 75 | pwmDC.period(0.0002f); |
nicovv44 | 14:3f7e54ee1211 | 76 | pwmDC.write(1-0.00f); //(1-duty) |
nicovv44 | 15:e1a76426fb6a | 77 | pwmSY.period(0.0002f); |
nicovv44 | 14:3f7e54ee1211 | 78 | pwmSY.write(1-0.00f); //(1-duty) |
nicovv44 | 14:3f7e54ee1211 | 79 | |
nicovv44 | 14:3f7e54ee1211 | 80 | while(userButton==1){;} |
nicovv44 | 14:3f7e54ee1211 | 81 | |
nicovv44 | 15:e1a76426fb6a | 82 | pwmDC.write(1-0.900f); //(1-duty) |
nicovv44 | 15:e1a76426fb6a | 83 | pwmSY.write(1-0.80f); //(1-duty) |
nicovv44 | 8:a161b056971c | 84 | //tickerPWMDC.attach(&tickerPWMDCfunction, 0.1); |
nicovv44 | 3:a1b11dfd26f3 | 85 | |
nicovv44 | 12:ed2a94c17109 | 86 | //pc.printf("\n\nAccelerating\r\n"); |
nicovv44 | 12:ed2a94c17109 | 87 | lcd.printf("ACCELERATING"); |
nicovv44 | 9:70bfbd406554 | 88 | wait(5);//wait so the motor get steady state |
nicovv44 | 11:b6bee52941ea | 89 | //pwmDC.write(1-0.00f); //(1-duty) |
nicovv44 | 9:70bfbd406554 | 90 | |
nicovv44 | 4:886ce7eefa6e | 91 | //manual synchronisation |
nicovv44 | 4:886ce7eefa6e | 92 | while(!synchronized){ |
nicovv44 | 4:886ce7eefa6e | 93 | //measure and calculate desired value |
nicovv44 | 4:886ce7eefa6e | 94 | syncRMS = getVolageRMS(syncPin); |
nicovv44 | 4:886ce7eefa6e | 95 | gridRMS = getVolageRMS(gridPin); |
nicovv44 | 4:886ce7eefa6e | 96 | syncFreq = getFrequency(syncPin); |
nicovv44 | 4:886ce7eefa6e | 97 | gridFreq = getFrequency(gridPin); |
nicovv44 | 9:70bfbd406554 | 98 | //Update the PID process variable. |
nicovv44 | 11:b6bee52941ea | 99 | PIDcontroller1.setProcessValue(syncFreq); |
nicovv44 | 13:83cc9d66749d | 100 | PIDcontroller2.setProcessValue(syncRMS); |
nicovv44 | 9:70bfbd406554 | 101 | //Interrupt for a correct PID rate |
nicovv44 | 13:83cc9d66749d | 102 | //tickerPID.attach(&tickerPIDfunction, PIDRATE); |
nicovv44 | 4:886ce7eefa6e | 103 | //display values on LCD |
nicovv44 | 4:886ce7eefa6e | 104 | displayLCD(syncRMS, gridRMS, syncFreq, gridFreq); |
nicovv44 | 13:83cc9d66749d | 105 | //update PID values |
nicovv44 | 11:b6bee52941ea | 106 | PID1Output = PIDcontroller1.compute(); |
nicovv44 | 13:83cc9d66749d | 107 | PID2Output = PIDcontroller2.compute(); |
nicovv44 | 13:83cc9d66749d | 108 | //drive PWMs with PID values |
nicovv44 | 11:b6bee52941ea | 109 | pwmDC.write(1-PID1Output); //(1-duty) |
nicovv44 | 13:83cc9d66749d | 110 | pwmSY.write(1-PID2Output); //(1-duty) |
nicovv44 | 13:83cc9d66749d | 111 | pc.printf("PID1:%f \t syncFreq:%f \r\n", PID1Output, syncFreq); |
nicovv44 | 13:83cc9d66749d | 112 | pc.printf("PID2:%f \t syncRMS:%f \r\n\n", PID2Output, syncRMS); |
nicovv44 | 11:b6bee52941ea | 113 | wait(PIDRATE); |
nicovv44 | 4:886ce7eefa6e | 114 | //voltage and frequency matching |
nicovv44 | 4:886ce7eefa6e | 115 | if(abs(syncRMS-gridRMS)<0.5 && abs(syncFreq-gridFreq)<0.1){ |
nicovv44 | 12:ed2a94c17109 | 116 | //pc.printf("voltage and freqency OK\r\n"); |
nicovv44 | 12:ed2a94c17109 | 117 | lcd.locate(11,0);//(col,row) |
nicovv44 | 12:ed2a94c17109 | 118 | lcd.printf("V&fOK"); |
nicovv44 | 4:886ce7eefa6e | 119 | while(!synchronized){//phase matching loop |
nicovv44 | 12:ed2a94c17109 | 120 | //measure and calculate desired value |
nicovv44 | 12:ed2a94c17109 | 121 | syncRMS = getVolageRMS(syncPin); |
nicovv44 | 12:ed2a94c17109 | 122 | gridRMS = getVolageRMS(gridPin); |
nicovv44 | 12:ed2a94c17109 | 123 | syncFreq = getFrequency(syncPin); |
nicovv44 | 12:ed2a94c17109 | 124 | gridFreq = getFrequency(gridPin); |
nicovv44 | 12:ed2a94c17109 | 125 | //display values on LCD |
nicovv44 | 12:ed2a94c17109 | 126 | displayLCD(syncRMS, gridRMS, syncFreq, gridFreq); |
nicovv44 | 4:886ce7eefa6e | 127 | //phase matching |
nicovv44 | 7:1f7d87007512 | 128 | if(getVolageReadedMax(differentialPin) < 0.050){ |
nicovv44 | 12:ed2a94c17109 | 129 | //pc.printf("SYNCHONIZATION OK\r\n\n"); |
nicovv44 | 12:ed2a94c17109 | 130 | lcd.locate(12,1);//(col,row) |
nicovv44 | 12:ed2a94c17109 | 131 | lcd.printf("SYNC"); |
nicovv44 | 5:e9766e0573d0 | 132 | relay1 = 0;//Relay off=1, on=0 // to hear the noise |
nicovv44 | 5:e9766e0573d0 | 133 | relay2 = 0;//Relay off=1, on=0 // to hear the noise |
nicovv44 | 5:e9766e0573d0 | 134 | relay3 = 0;//Relay off=1, on=0 // to hear the noise |
nicovv44 | 8:a161b056971c | 135 | relay4 = 1;//Relay off=1, on=0 // to hear the noise |
nicovv44 | 15:e1a76426fb6a | 136 | pwmDC.write(1-0.00f); //(1-duty) |
nicovv44 | 15:e1a76426fb6a | 137 | pwmSY.write(1-0.00f); //(1-duty) |
nicovv44 | 4:886ce7eefa6e | 138 | synchronized = true; |
nicovv44 | 4:886ce7eefa6e | 139 | mainLoop = false; |
nicovv44 | 4:886ce7eefa6e | 140 | } |
nicovv44 | 4:886ce7eefa6e | 141 | } |
nicovv44 | 4:886ce7eefa6e | 142 | } |
nicovv44 | 4:886ce7eefa6e | 143 | } |
nicovv44 | 15:e1a76426fb6a | 144 | while(true) |
nicovv44 | 15:e1a76426fb6a | 145 | getPhaseAngle(currentPin, gridPin); |
nicovv44 | 1:f31a46c62d10 | 146 | } |
nicovv44 | 0:1f66eaf1013d | 147 | } |
nicovv44 | 0:1f66eaf1013d | 148 | |
nicovv44 | 0:1f66eaf1013d | 149 | |
nicovv44 | 0:1f66eaf1013d | 150 | |
nicovv44 | 0:1f66eaf1013d | 151 | |
nicovv44 | 0:1f66eaf1013d | 152 | |
nicovv44 | 0:1f66eaf1013d | 153 | |
nicovv44 | 0:1f66eaf1013d | 154 | |
nicovv44 | 0:1f66eaf1013d | 155 | // ############################################## |
nicovv44 | 0:1f66eaf1013d | 156 | // ########## FUNCTIONS ######################### |
nicovv44 | 0:1f66eaf1013d | 157 | // ############################################################################# |
nicovv44 | 0:1f66eaf1013d | 158 | // ISR to stop loping |
nicovv44 | 0:1f66eaf1013d | 159 | void stopLooping(void) { |
nicovv44 | 0:1f66eaf1013d | 160 | looping = false;//looping is volatile bool |
nicovv44 | 0:1f66eaf1013d | 161 | } |
nicovv44 | 0:1f66eaf1013d | 162 | |
nicovv44 | 0:1f66eaf1013d | 163 | // ############################################################################# |
nicovv44 | 5:e9766e0573d0 | 164 | // ISR to update pwmDC with potarDC |
nicovv44 | 5:e9766e0573d0 | 165 | void tickerPWMDCfunction(){ |
nicovv44 | 5:e9766e0573d0 | 166 | float valuePotar1; |
nicovv44 | 5:e9766e0573d0 | 167 | float valuePotar2; |
nicovv44 | 5:e9766e0573d0 | 168 | valuePotar1 = potarDC.read(); |
nicovv44 | 7:1f7d87007512 | 169 | pwmDC.write(1-valuePotar1); |
nicovv44 | 5:e9766e0573d0 | 170 | valuePotar2 = potarSY.read(); |
nicovv44 | 7:1f7d87007512 | 171 | pwmSY.write(1-valuePotar2); |
nicovv44 | 5:e9766e0573d0 | 172 | //lcd.locate(12,0);//(col,row) |
nicovv44 | 5:e9766e0573d0 | 173 | //lcd.printf("%f",valuePotar); |
nicovv44 | 5:e9766e0573d0 | 174 | } |
nicovv44 | 5:e9766e0573d0 | 175 | |
nicovv44 | 9:70bfbd406554 | 176 | |
nicovv44 | 9:70bfbd406554 | 177 | // ############################################################################# |
nicovv44 | 9:70bfbd406554 | 178 | // ISR to update PID |
nicovv44 | 9:70bfbd406554 | 179 | void tickerPIDfunction(){ |
nicovv44 | 9:70bfbd406554 | 180 | PID1Output = PIDcontroller1.compute(); |
nicovv44 | 9:70bfbd406554 | 181 | pwmDC.write(1-PID1Output); //(1-duty) |
nicovv44 | 9:70bfbd406554 | 182 | pc.printf("PID1:%f\r\n\n", PID1Output); |
nicovv44 | 9:70bfbd406554 | 183 | } |
nicovv44 | 9:70bfbd406554 | 184 | |
nicovv44 | 9:70bfbd406554 | 185 | |
nicovv44 | 9:70bfbd406554 | 186 | // ############################################################################# |
nicovv44 | 9:70bfbd406554 | 187 | void initPID1(){ |
nicovv44 | 13:83cc9d66749d | 188 | //Input |
nicovv44 | 13:83cc9d66749d | 189 | PIDcontroller1.setInputLimits(0.0, 100.0); |
nicovv44 | 9:70bfbd406554 | 190 | //Pwm output from 0.0 to 1.0 |
nicovv44 | 9:70bfbd406554 | 191 | PIDcontroller1.setOutputLimits(0.0, 1.0); |
nicovv44 | 9:70bfbd406554 | 192 | //If there's a bias. |
nicovv44 | 11:b6bee52941ea | 193 | PIDcontroller1.setBias(0.70); |
nicovv44 | 9:70bfbd406554 | 194 | PIDcontroller1.setMode(true); |
nicovv44 | 9:70bfbd406554 | 195 | //We want the process variable to be 50Hz |
nicovv44 | 9:70bfbd406554 | 196 | PIDcontroller1.setSetPoint(50);//50Hz |
nicovv44 | 9:70bfbd406554 | 197 | } |
nicovv44 | 9:70bfbd406554 | 198 | |
nicovv44 | 5:e9766e0573d0 | 199 | // ############################################################################# |
nicovv44 | 13:83cc9d66749d | 200 | void initPID2(){ |
nicovv44 | 13:83cc9d66749d | 201 | //Input |
nicovv44 | 13:83cc9d66749d | 202 | PIDcontroller2.setInputLimits(0.0, 25.0); |
nicovv44 | 13:83cc9d66749d | 203 | //Pwm output from 0.0 to 1.0 |
nicovv44 | 13:83cc9d66749d | 204 | PIDcontroller2.setOutputLimits(0.0, 1.0); |
nicovv44 | 13:83cc9d66749d | 205 | //If there's a bias. |
nicovv44 | 13:83cc9d66749d | 206 | PIDcontroller2.setBias(0.70); |
nicovv44 | 13:83cc9d66749d | 207 | PIDcontroller2.setMode(true); |
nicovv44 | 13:83cc9d66749d | 208 | //We want the process variable to be 50Hz |
nicovv44 | 13:83cc9d66749d | 209 | PIDcontroller2.setSetPoint(getVolageRMS(gridPin)); |
nicovv44 | 13:83cc9d66749d | 210 | } |
nicovv44 | 13:83cc9d66749d | 211 | |
nicovv44 | 13:83cc9d66749d | 212 | // ############################################################################# |
nicovv44 | 0:1f66eaf1013d | 213 | float getVolageRMS(AnalogIn ana_pin){ |
nicovv44 | 0:1f66eaf1013d | 214 | float v1;//readed voltage |
nicovv44 | 0:1f66eaf1013d | 215 | float v1Max = 0;//max readed voltage |
nicovv44 | 0:1f66eaf1013d | 216 | float VRMS; //RMS voltage |
nicovv44 | 0:1f66eaf1013d | 217 | looping = true; |
nicovv44 | 1:f31a46c62d10 | 218 | timeout.attach(callback(&stopLooping), 0.020);//T=20ms because f=50Hz |
nicovv44 | 0:1f66eaf1013d | 219 | while(looping){ |
nicovv44 | 0:1f66eaf1013d | 220 | v1 = ana_pin.read()*3.3; |
nicovv44 | 0:1f66eaf1013d | 221 | if(v1 > v1Max){ |
nicovv44 | 0:1f66eaf1013d | 222 | v1Max = v1; |
nicovv44 | 0:1f66eaf1013d | 223 | } |
nicovv44 | 0:1f66eaf1013d | 224 | } |
nicovv44 | 3:a1b11dfd26f3 | 225 | VRMS = (v1Max+0.685)*9.32/sqrt2; |
nicovv44 | 4:886ce7eefa6e | 226 | //pc.printf("VRMS: %f\r\n",VRMS); |
nicovv44 | 0:1f66eaf1013d | 227 | return VRMS; |
nicovv44 | 0:1f66eaf1013d | 228 | } |
nicovv44 | 0:1f66eaf1013d | 229 | |
nicovv44 | 0:1f66eaf1013d | 230 | |
nicovv44 | 0:1f66eaf1013d | 231 | // ############################################################################# |
nicovv44 | 0:1f66eaf1013d | 232 | float getVolageReadedMax(AnalogIn ana_pin){ |
nicovv44 | 0:1f66eaf1013d | 233 | float v1;//readed voltage |
nicovv44 | 0:1f66eaf1013d | 234 | float v1Max = 0;//max readed voltage |
nicovv44 | 0:1f66eaf1013d | 235 | looping = true; |
nicovv44 | 1:f31a46c62d10 | 236 | timeout.attach(callback(&stopLooping), 0.025);//T=25>20ms because f=50Hz |
nicovv44 | 0:1f66eaf1013d | 237 | while(looping){ |
nicovv44 | 0:1f66eaf1013d | 238 | v1 = ana_pin.read()*3.3; |
nicovv44 | 0:1f66eaf1013d | 239 | if(v1 > v1Max){ |
nicovv44 | 0:1f66eaf1013d | 240 | v1Max = v1; |
nicovv44 | 0:1f66eaf1013d | 241 | } |
nicovv44 | 0:1f66eaf1013d | 242 | } |
nicovv44 | 0:1f66eaf1013d | 243 | return v1Max; |
nicovv44 | 0:1f66eaf1013d | 244 | } |
nicovv44 | 0:1f66eaf1013d | 245 | |
nicovv44 | 1:f31a46c62d10 | 246 | |
nicovv44 | 0:1f66eaf1013d | 247 | // ############################################################################# |
nicovv44 | 0:1f66eaf1013d | 248 | float getFrequency(AnalogIn ana_pin){ |
nicovv44 | 0:1f66eaf1013d | 249 | float freq; //frequency |
nicovv44 | 0:1f66eaf1013d | 250 | float maxReadedVoltage;//maximum voltage readed by the ADC |
nicovv44 | 0:1f66eaf1013d | 251 | float readedVoltage;//readed voltage |
nicovv44 | 0:1f66eaf1013d | 252 | int nbrRisingEdge=0;// number of rising edge detected |
nicovv44 | 0:1f66eaf1013d | 253 | float T;//Periode |
nicovv44 | 0:1f66eaf1013d | 254 | Timer timer; |
nicovv44 | 0:1f66eaf1013d | 255 | maxReadedVoltage = getVolageReadedMax(ana_pin); |
nicovv44 | 11:b6bee52941ea | 256 | //pc.printf("maxReadedVoltage: %f\r\n",maxReadedVoltage); |
nicovv44 | 0:1f66eaf1013d | 257 | bool aboveLine = true; |
nicovv44 | 11:b6bee52941ea | 258 | bool allowedClicTimer = false; |
nicovv44 | 1:f31a46c62d10 | 259 | looping = true; |
nicovv44 | 1:f31a46c62d10 | 260 | timeout.attach(callback(&stopLooping), 1);//try to find rising edges during 1sec max |
nicovv44 | 1:f31a46c62d10 | 261 | while(nbrRisingEdge<2 and looping){ |
nicovv44 | 0:1f66eaf1013d | 262 | readedVoltage = ana_pin.read()*3.3; |
nicovv44 | 0:1f66eaf1013d | 263 | if(readedVoltage<(maxReadedVoltage/2)){//rising edge detection ready |
nicovv44 | 0:1f66eaf1013d | 264 | aboveLine = false; |
nicovv44 | 0:1f66eaf1013d | 265 | } |
nicovv44 | 0:1f66eaf1013d | 266 | if((maxReadedVoltage/2)<readedVoltage && aboveLine==false){//rising edge detected |
nicovv44 | 11:b6bee52941ea | 267 | allowedClicTimer = true; |
nicovv44 | 0:1f66eaf1013d | 268 | aboveLine = true; |
nicovv44 | 11:b6bee52941ea | 269 | } |
nicovv44 | 11:b6bee52941ea | 270 | if((maxReadedVoltage*2/3)<readedVoltage && allowedClicTimer==true){//rising edge detected |
nicovv44 | 11:b6bee52941ea | 271 | allowedClicTimer = false; |
nicovv44 | 0:1f66eaf1013d | 272 | if(nbrRisingEdge==0) |
nicovv44 | 0:1f66eaf1013d | 273 | timer.start(); |
nicovv44 | 0:1f66eaf1013d | 274 | if(nbrRisingEdge==1) |
nicovv44 | 0:1f66eaf1013d | 275 | timer.stop(); |
nicovv44 | 0:1f66eaf1013d | 276 | nbrRisingEdge++; |
nicovv44 | 0:1f66eaf1013d | 277 | } |
nicovv44 | 11:b6bee52941ea | 278 | |
nicovv44 | 0:1f66eaf1013d | 279 | } |
nicovv44 | 1:f31a46c62d10 | 280 | if(nbrRisingEdge!=2){ |
nicovv44 | 1:f31a46c62d10 | 281 | lcd.locate(13,1); |
nicovv44 | 1:f31a46c62d10 | 282 | lcd.printf("f!%d",nbrRisingEdge); |
nicovv44 | 1:f31a46c62d10 | 283 | } |
nicovv44 | 0:1f66eaf1013d | 284 | T = timer.read(); |
nicovv44 | 0:1f66eaf1013d | 285 | freq = 1/T; |
nicovv44 | 4:886ce7eefa6e | 286 | //pc.printf("T: %f\r\n",T); |
nicovv44 | 4:886ce7eefa6e | 287 | //pc.printf("freq: %f\r\n\n",freq); |
nicovv44 | 11:b6bee52941ea | 288 | if(looping==false) |
nicovv44 | 11:b6bee52941ea | 289 | freq = 0; |
nicovv44 | 0:1f66eaf1013d | 290 | return freq; |
nicovv44 | 4:886ce7eefa6e | 291 | } |
nicovv44 | 4:886ce7eefa6e | 292 | |
nicovv44 | 4:886ce7eefa6e | 293 | |
nicovv44 | 4:886ce7eefa6e | 294 | // ############################################################################# |
nicovv44 | 4:886ce7eefa6e | 295 | void displayLCD(float syncRMS, float gridRMS, float syncFreq, float gridFreq){ |
nicovv44 | 12:ed2a94c17109 | 296 | lcd.locate(0,0);//(col,row) |
nicovv44 | 12:ed2a94c17109 | 297 | lcd.printf(" "); |
nicovv44 | 9:70bfbd406554 | 298 | lcd.locate(0,1);//(col,row) |
nicovv44 | 9:70bfbd406554 | 299 | lcd.printf(" "); |
nicovv44 | 12:ed2a94c17109 | 300 | lcd.locate(0,0);//(col,row) |
nicovv44 | 12:ed2a94c17109 | 301 | lcd.printf("G:%3.1f@%3.1f", gridRMS, gridFreq); |
nicovv44 | 9:70bfbd406554 | 302 | lcd.locate(0,1);//(col,row) |
nicovv44 | 9:70bfbd406554 | 303 | lcd.printf("S:%3.1f@%3.1f", syncRMS, syncFreq); |
nicovv44 | 9:70bfbd406554 | 304 | |
nicovv44 | 15:e1a76426fb6a | 305 | } |
nicovv44 | 15:e1a76426fb6a | 306 | |
nicovv44 | 15:e1a76426fb6a | 307 | |
nicovv44 | 15:e1a76426fb6a | 308 | // ############################################################################# |
nicovv44 | 15:e1a76426fb6a | 309 | float getPhaseAngle(AnalogIn voltage_pin, AnalogIn current_pin){ |
nicovv44 | 15:e1a76426fb6a | 310 | bool searchingInstant = true; |
nicovv44 | 15:e1a76426fb6a | 311 | Timer timer1; |
nicovv44 | 15:e1a76426fb6a | 312 | float voltageValue; |
nicovv44 | 15:e1a76426fb6a | 313 | //float maxReadedVoltageVoltage, maxReadedVoltageCurrent;//maximum voltage readed by the ADC |
nicovv44 | 15:e1a76426fb6a | 314 | //maxReadedVoltageVoltage = getVolageReadedMax(voltage_pin); |
nicovv44 | 15:e1a76426fb6a | 315 | //maxReadedVoltageCurrent= getVolageReadedMax(current_pin); |
nicovv44 | 15:e1a76426fb6a | 316 | //pc.printf("maxReadedVoltageVoltage: %f \t maxReadedVoltageCurrent: %f\r\n", maxReadedVoltageVoltage, maxReadedVoltageCurrent); |
nicovv44 | 15:e1a76426fb6a | 317 | while(searchingInstant){ |
nicovv44 | 15:e1a76426fb6a | 318 | voltageValue = voltage_pin.read(); |
nicovv44 | 15:e1a76426fb6a | 319 | //pc.printf("voltageValue voltage:%f\n\r",voltageValue); |
nicovv44 | 15:e1a76426fb6a | 320 | if(voltageValue < 0.50){ |
nicovv44 | 15:e1a76426fb6a | 321 | timer1.start(); |
nicovv44 | 15:e1a76426fb6a | 322 | searchingInstant = false; |
nicovv44 | 15:e1a76426fb6a | 323 | } |
nicovv44 | 15:e1a76426fb6a | 324 | } |
nicovv44 | 15:e1a76426fb6a | 325 | searchingInstant = true; |
nicovv44 | 15:e1a76426fb6a | 326 | while(searchingInstant){ |
nicovv44 | 15:e1a76426fb6a | 327 | voltageValue = current_pin.read(); |
nicovv44 | 15:e1a76426fb6a | 328 | //pc.printf("voltageValue current:%f\n\r",voltageValue); |
nicovv44 | 15:e1a76426fb6a | 329 | if(voltageValue < 0.050){ |
nicovv44 | 15:e1a76426fb6a | 330 | timer1.stop(); |
nicovv44 | 15:e1a76426fb6a | 331 | searchingInstant = false; |
nicovv44 | 15:e1a76426fb6a | 332 | } |
nicovv44 | 15:e1a76426fb6a | 333 | } |
nicovv44 | 15:e1a76426fb6a | 334 | pc.printf("phaseAngle:%f\n\r",timer1.read()*180/0.020); |
nicovv44 | 15:e1a76426fb6a | 335 | return 0; |
nicovv44 | 1:f31a46c62d10 | 336 | } |