Betterfrost / Mbed 2 deprecated timer_based_1kHz_ramp

Dependencies:   mbed

Fork of BoxBrovoEcho_OCt3 by Betterfrost

Committer:
hsarfraz
Date:
Wed Oct 03 13:51:07 2018 +0000
Revision:
6:c905afa84d8a
Parent:
5:0d28bca5dd26
Child:
7:11433074d022
Oct 3 2018 Box B and E

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