Betterfrost / Mbed 2 deprecated timer_based_1kHz_ramp

Dependencies:   mbed

Fork of BoxBrovoEcho_OCt3 by Betterfrost

Committer:
hsarfraz
Date:
Fri Sep 21 17:29:36 2018 +0000
Revision:
5:0d28bca5dd26
Parent:
4:2c5dbea00157
Child:
6:c905afa84d8a
Sept 21, 2018 - Box Bravo Code ; R_chk disconneted (but able to see the LED2 lightup if detected)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rafael210 0:b265ed6faf6c 1 #include "mbed.h"
rafael210 1:fa78d980522c 2 #include "math.h"
hsarfraz 2:98bc0c7668e3 3
rafael210 0:b265ed6faf6c 4 Ticker scheduler1;
rafael210 0:b265ed6faf6c 5 Ticker scheduler2;
rafael210 0:b265ed6faf6c 6 Ticker scheduler3;
rafael210 0:b265ed6faf6c 7 Ticker scheduler4;
rafael210 0:b265ed6faf6c 8
rafael210 1:fa78d980522c 9 Serial pc(USBTX, USBRX); // tx, rx
rafael210 1:fa78d980522c 10
rafael210 1:fa78d980522c 11 DigitalOut task_1_pin(p8, 0);
rafael210 1:fa78d980522c 12 DigitalOut task_2_pin(p9, 0);
hsarfraz 2:98bc0c7668e3 13 DigitalOut task_3_pin(p10, 0);
rafael210 1:fa78d980522c 14
hsarfraz 2:98bc0c7668e3 15 DigitalOut THY_S(p5, 0);
hsarfraz 2:98bc0c7668e3 16 DigitalOut IGBT_G(p6, 0);
hsarfraz 2:98bc0c7668e3 17
rafael210 0:b265ed6faf6c 18 DigitalOut led1(LED1, 0);
rafael210 0:b265ed6faf6c 19 DigitalOut led2(LED2, 0);
rafael210 1:fa78d980522c 20 DigitalOut led3(LED3, 0);
rafael210 3:d56766563719 21 DigitalOut led4(LED4, 0);
rafael210 0:b265ed6faf6c 22
hsarfraz 2:98bc0c7668e3 23 InterruptIn ButtonPress(p21);
rafael210 1:fa78d980522c 24
rafael210 1:fa78d980522c 25 AnalogIn current(p15);
rafael210 3:d56766563719 26 AnalogIn voltage(p16);
rafael210 1:fa78d980522c 27
hsarfraz 2:98bc0c7668e3 28 // ------------------------- Main Parameters ------------------------------- //
hsarfraz 5:0d28bca5dd26 29 float resistance = 9.6;
hsarfraz 5:0d28bca5dd26 30 float V_batt = 400.0;
hsarfraz 5:0d28bca5dd26 31 float I_out = 20.0;
hsarfraz 2:98bc0c7668e3 32 float V_out = 0.0;
rafael210 4:2c5dbea00157 33 float freq = 30; //switching frequency in Hz
hsarfraz 5:0d28bca5dd26 34 Timer TIMER;
hsarfraz 5:0d28bca5dd26 35 float RunTime = 20; // in seconds
rafael210 1:fa78d980522c 36
hsarfraz 2:98bc0c7668e3 37 // -------------------- Current Sensor Parameters --------------------------- //
rafael210 3:d56766563719 38 float HSens_gain = 31;
hsarfraz 5:0d28bca5dd26 39 float I_LIMIT = 30.0;
rafael210 3:d56766563719 40 float i_offset = 0.58;
rafael210 1:fa78d980522c 41 float i_load = 0;
rafael210 3:d56766563719 42 float i_load_sum = 0;
rafael210 3:d56766563719 43 float i_load_avg = 0;
hsarfraz 2:98bc0c7668e3 44 float i_loadpre = 0;
hsarfraz 2:98bc0c7668e3 45 float i_avg = 0;
hsarfraz 2:98bc0c7668e3 46 float i_sum = 0;
hsarfraz 2:98bc0c7668e3 47 int NUM_SAMPLES = 5;
hsarfraz 2:98bc0c7668e3 48 int count = 0;
rafael210 1:fa78d980522c 49 int c_i = 0;
hsarfraz 2:98bc0c7668e3 50 int a = 0;
rafael210 3:d56766563719 51 int avg_c = 0;
rafael210 3:d56766563719 52 float v_in = 0;
rafael210 3:d56766563719 53 int once = 0;
rafael210 1:fa78d980522c 54
rafael210 1:fa78d980522c 55 // ------------------------- Ramp up parameters ----------------------------- //
rafael210 3:d56766563719 56 float N = 20; // number of steps
hsarfraz 5:0d28bca5dd26 57 float tramp = 10000; // ramp time in ms
rafael210 1:fa78d980522c 58 float tstep = 0; // step time
hsarfraz 2:98bc0c7668e3 59 float toff = 1; // cycle off time
hsarfraz 2:98bc0c7668e3 60 float ton_sat = 0; // ON time saturation value
hsarfraz 2:98bc0c7668e3 61 float toff_sat = 0; // OFF time saturation value - determines the final duty cycle
hsarfraz 2:98bc0c7668e3 62 float ton = 1; // on time
rafael210 1:fa78d980522c 63 float d = 0; // duty cycle starting point
hsarfraz 2:98bc0c7668e3 64 float d_sat = 0.0; // determines the final duty cycle
rafael210 1:fa78d980522c 65 int c = 0; // step counter
rafael210 1:fa78d980522c 66 int i = 0; // cycle counter
rafael210 1:fa78d980522c 67 int Ncycles = 0; // Number of cycles
rafael210 1:fa78d980522c 68
rafael210 1:fa78d980522c 69
hsarfraz 2:98bc0c7668e3 70
hsarfraz 2:98bc0c7668e3 71 // ----------------------------- Task 1 ------------------------------------- //
hsarfraz 2:98bc0c7668e3 72 // ----------------Current reading and limit testing---------------------------
hsarfraz 2:98bc0c7668e3 73 void task1()
hsarfraz 2:98bc0c7668e3 74 {
rafael210 3:d56766563719 75 task_1_pin = !task_1_pin;
rafael210 3:d56766563719 76 i_load = HSens_gain *3.3*(v_in/3)*( (1.0-current.read())- (1-(v_in*0.5/3)));
rafael210 4:2c5dbea00157 77
rafael210 4:2c5dbea00157 78
rafael210 3:d56766563719 79 if(i_load_avg > I_LIMIT) //Overcurrrent
rafael210 3:d56766563719 80 {
hsarfraz 2:98bc0c7668e3 81 c_i++;
rafael210 3:d56766563719 82 if(c_i == 5)
rafael210 3:d56766563719 83 {
rafael210 3:d56766563719 84
rafael210 3:d56766563719 85 led3 = 1;
hsarfraz 2:98bc0c7668e3 86 c_i = 0;
hsarfraz 2:98bc0c7668e3 87 }
hsarfraz 2:98bc0c7668e3 88 }
rafael210 3:d56766563719 89
rafael210 3:d56766563719 90 if((abs(i_load_avg-i_loadpre) > 1)&&(i_loadpre != 0)) // resistance checking
rafael210 3:d56766563719 91 {
rafael210 3:d56766563719 92 led2 = 1;
rafael210 3:d56766563719 93 }
rafael210 3:d56766563719 94
rafael210 3:d56766563719 95
rafael210 3:d56766563719 96
rafael210 3:d56766563719 97
rafael210 3:d56766563719 98
rafael210 3:d56766563719 99 avg_c++;
rafael210 3:d56766563719 100 i_load_sum = i_load_sum + i_load; //integration
rafael210 4:2c5dbea00157 101 if(avg_c == (int)(1/freq/0.0001))
rafael210 3:d56766563719 102 {
rafael210 3:d56766563719 103 avg_c = 0;
rafael210 4:2c5dbea00157 104 i_load_avg = (i_load_sum/(1/freq/0.0001));
rafael210 3:d56766563719 105 i_load_sum = 0;
rafael210 3:d56766563719 106 }
rafael210 3:d56766563719 107
hsarfraz 2:98bc0c7668e3 108 }
hsarfraz 2:98bc0c7668e3 109
rafael210 1:fa78d980522c 110
hsarfraz 2:98bc0c7668e3 111 // ----------------------------- Task 2 ------------------------------------- //
hsarfraz 2:98bc0c7668e3 112 //------------------------Serial communication----------------------------------
hsarfraz 2:98bc0c7668e3 113 void task2()
hsarfraz 2:98bc0c7668e3 114 {
hsarfraz 2:98bc0c7668e3 115 task_2_pin = !task_2_pin;
rafael210 3:d56766563719 116 pc.printf("\r %f", i_load_avg );
rafael210 3:d56766563719 117 //pc.printf("\r %f", v_in);
rafael210 3:d56766563719 118 //pc.printf("\r %f", i_loadpre );
hsarfraz 2:98bc0c7668e3 119 }
hsarfraz 2:98bc0c7668e3 120
hsarfraz 2:98bc0c7668e3 121
hsarfraz 2:98bc0c7668e3 122 // ------------------------------ Task 3 ------------------------------------- //
hsarfraz 2:98bc0c7668e3 123 //----------------------------Remote Control----------------------------------
hsarfraz 2:98bc0c7668e3 124 void button()
hsarfraz 2:98bc0c7668e3 125 {
rafael210 3:d56766563719 126 led1 = !led1;
hsarfraz 2:98bc0c7668e3 127 }
hsarfraz 2:98bc0c7668e3 128 void task3()
hsarfraz 2:98bc0c7668e3 129 {
hsarfraz 2:98bc0c7668e3 130 task_3_pin = !task_3_pin;
rafael210 3:d56766563719 131 ButtonPress.rise(&button);
rafael210 3:d56766563719 132 v_in = 3.3*(voltage.read());
hsarfraz 2:98bc0c7668e3 133 }
rafael210 1:fa78d980522c 134
rafael210 1:fa78d980522c 135
hsarfraz 2:98bc0c7668e3 136 // ------------------------------ Task 4 ------------------------------------- //
hsarfraz 2:98bc0c7668e3 137 //----------------------------XXXXXXXXXXXXXXX----------------------------------
hsarfraz 2:98bc0c7668e3 138 void task4()
hsarfraz 2:98bc0c7668e3 139 {
rafael210 3:d56766563719 140 //led2 = !led2;
hsarfraz 2:98bc0c7668e3 141 }
rafael210 1:fa78d980522c 142
hsarfraz 2:98bc0c7668e3 143 // -------------------------- Power Convertor ------------------------------- //
hsarfraz 2:98bc0c7668e3 144 void pw()
hsarfraz 2:98bc0c7668e3 145 {
hsarfraz 2:98bc0c7668e3 146 IGBT_G= 1; // set IGBT Ground side pin to high
hsarfraz 2:98bc0c7668e3 147 wait_us(50);
hsarfraz 2:98bc0c7668e3 148 THY_S= 1;
hsarfraz 2:98bc0c7668e3 149 wait_us(10);
hsarfraz 2:98bc0c7668e3 150 THY_S= 0;
hsarfraz 2:98bc0c7668e3 151 wait_us(200);
hsarfraz 2:98bc0c7668e3 152 wait_ms(ton);
hsarfraz 2:98bc0c7668e3 153 IGBT_G.write(0);
hsarfraz 2:98bc0c7668e3 154 wait_ms(toff);
hsarfraz 2:98bc0c7668e3 155 }
hsarfraz 2:98bc0c7668e3 156
hsarfraz 2:98bc0c7668e3 157 // ------------------------------- MAIN ------------------------------------- //
hsarfraz 2:98bc0c7668e3 158 int main()
hsarfraz 2:98bc0c7668e3 159 {
hsarfraz 2:98bc0c7668e3 160 pc.baud (115200);
hsarfraz 2:98bc0c7668e3 161 NVIC_SetPriority(TIMER3_IRQn, 0);
hsarfraz 2:98bc0c7668e3 162 // set mbed tickers to higher priority than other things
hsarfraz 2:98bc0c7668e3 163
hsarfraz 2:98bc0c7668e3 164 task_1_pin = 0;
hsarfraz 2:98bc0c7668e3 165 task_2_pin = 0;
hsarfraz 2:98bc0c7668e3 166 task_2_pin = 0;
hsarfraz 2:98bc0c7668e3 167 THY_S = 0;
hsarfraz 2:98bc0c7668e3 168 IGBT_G = 0;
hsarfraz 2:98bc0c7668e3 169 led1 = 0;
hsarfraz 2:98bc0c7668e3 170 led2 = 0;
hsarfraz 2:98bc0c7668e3 171 led3 = 0;
rafael210 3:d56766563719 172 led4 = 0;
hsarfraz 2:98bc0c7668e3 173
hsarfraz 2:98bc0c7668e3 174 scheduler1.attach(&task1, 0.0001); // R check
hsarfraz 2:98bc0c7668e3 175 scheduler2.attach(&task2, 0.2); // Reading Hall Sensor
hsarfraz 2:98bc0c7668e3 176 scheduler3.attach(&task3, 0.5); // Turn OFF Power
hsarfraz 2:98bc0c7668e3 177 //scheduler4.attach(&task4, 0.01); //
hsarfraz 2:98bc0c7668e3 178
hsarfraz 2:98bc0c7668e3 179
hsarfraz 2:98bc0c7668e3 180 /* Remote Start Prompt */
rafael210 3:d56766563719 181
hsarfraz 2:98bc0c7668e3 182 while(1) {
hsarfraz 2:98bc0c7668e3 183 if(led1==1) {
hsarfraz 2:98bc0c7668e3 184 break; // Waiting for start Button (pin21)
hsarfraz 2:98bc0c7668e3 185 }
hsarfraz 2:98bc0c7668e3 186 }
hsarfraz 2:98bc0c7668e3 187 led1 = 0;
rafael210 3:d56766563719 188 led2 = 0;
rafael210 3:d56766563719 189 wait_ms(1);
hsarfraz 2:98bc0c7668e3 190
hsarfraz 2:98bc0c7668e3 191
rafael210 3:d56766563719 192 //--------Ramp up Start ----------//
hsarfraz 5:0d28bca5dd26 193 TIMER.start();
hsarfraz 2:98bc0c7668e3 194 d_sat = resistance*I_out/V_batt;
hsarfraz 2:98bc0c7668e3 195
hsarfraz 2:98bc0c7668e3 196 if (d_sat > 0.99) {
hsarfraz 2:98bc0c7668e3 197 d_sat = 0.99; // duty cycle maximum value
hsarfraz 2:98bc0c7668e3 198 }
hsarfraz 2:98bc0c7668e3 199 ton_sat = d_sat/freq;
hsarfraz 2:98bc0c7668e3 200 toff_sat = (1/freq)-ton_sat;
hsarfraz 2:98bc0c7668e3 201 ton_sat = ton_sat*1000;
hsarfraz 2:98bc0c7668e3 202 toff_sat = toff_sat*1000;
hsarfraz 2:98bc0c7668e3 203
hsarfraz 2:98bc0c7668e3 204 d = 0;
hsarfraz 2:98bc0c7668e3 205 c = 0;
hsarfraz 2:98bc0c7668e3 206 tstep = tramp/N; //step time calculation
hsarfraz 2:98bc0c7668e3 207 while(c < (int)N) {
hsarfraz 2:98bc0c7668e3 208
rafael210 3:d56766563719 209 //d = d + (d_sat/(tramp/1000)); //duty cycle increment
rafael210 3:d56766563719 210 d = d + (d_sat/N); //duty cycle increment
hsarfraz 2:98bc0c7668e3 211 if (d>d_sat){d=d_sat;}
hsarfraz 2:98bc0c7668e3 212 ton = d/freq;
hsarfraz 2:98bc0c7668e3 213 toff = (1/freq)-ton; //calculation of time off
hsarfraz 2:98bc0c7668e3 214 ton = ton*1000;
rafael210 3:d56766563719 215 toff = toff*1000;
hsarfraz 2:98bc0c7668e3 216 Ncycles = (int)(tstep/(ton+toff)); //calculation of the number of cycles
hsarfraz 2:98bc0c7668e3 217 i = 0;
hsarfraz 2:98bc0c7668e3 218 while(i < Ncycles) {
hsarfraz 2:98bc0c7668e3 219 pw();
hsarfraz 2:98bc0c7668e3 220 i++;
hsarfraz 2:98bc0c7668e3 221 }
hsarfraz 2:98bc0c7668e3 222 c++;
hsarfraz 2:98bc0c7668e3 223 }
rafael210 3:d56766563719 224 //led3 = 0;
rafael210 3:d56766563719 225 led4 = 1; //indicates the ramp up is done
rafael210 3:d56766563719 226 //--------Ramp up End ----------//
rafael210 1:fa78d980522c 227
hsarfraz 2:98bc0c7668e3 228 while(1) {
rafael210 0:b265ed6faf6c 229
hsarfraz 2:98bc0c7668e3 230 d = d_sat; // 0>d<1 duty cycle
rafael210 1:fa78d980522c 231 ton = d/freq;
rafael210 1:fa78d980522c 232 toff = (1/freq)-ton;
rafael210 1:fa78d980522c 233 ton = ton*1000;
rafael210 1:fa78d980522c 234 toff = toff*1000;
rafael210 3:d56766563719 235
hsarfraz 5:0d28bca5dd26 236 //if((led1 == 1)||(led2 == 1)||(led3 == 1)) //test conditions for break
hsarfraz 5:0d28bca5dd26 237 if((led1 == 1)||(led3 == 1)||(TIMER.read()>=RunTime)) //test conditions for break
rafael210 3:d56766563719 238 {
rafael210 1:fa78d980522c 239 break;
rafael210 3:d56766563719 240 }
rafael210 3:d56766563719 241
hsarfraz 2:98bc0c7668e3 242 pw();
rafael210 3:d56766563719 243 if(once==0)
rafael210 3:d56766563719 244 {
rafael210 3:d56766563719 245 once = 1;
rafael210 3:d56766563719 246 i_loadpre = i_load_avg; //acquire reference value
rafael210 3:d56766563719 247 }
rafael210 0:b265ed6faf6c 248 }
rafael210 3:d56766563719 249
rafael210 3:d56766563719 250 while(1) // wait for the remote signal before resetting
rafael210 3:d56766563719 251 {
rafael210 3:d56766563719 252 if(led1 == 1)
rafael210 3:d56766563719 253 {
rafael210 3:d56766563719 254 break;
rafael210 3:d56766563719 255 }
rafael210 3:d56766563719 256 }
rafael210 3:d56766563719 257
hsarfraz 5:0d28bca5dd26 258 TIMER.reset();
rafael210 3:d56766563719 259 NVIC_SystemReset();
rafael210 3:d56766563719 260
rafael210 0:b265ed6faf6c 261 }