Betterfrost / Mbed 2 deprecated timer_based_1kHz_ramp

Dependencies:   mbed

Fork of BoxBrovoEcho_OCt3 by Betterfrost

Committer:
rafael210
Date:
Tue Sep 11 17:18:10 2018 +0000
Revision:
3:d56766563719
Parent:
2:98bc0c7668e3
Child:
4:2c5dbea00157
Task-based code; Overcurrent protection; Fixed ramp up; Average-based resistance checking

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