Betterfrost / Mbed 2 deprecated timer_based_1kHz_ramp

Dependencies:   mbed

Fork of BoxBrovoEcho_OCt3 by Betterfrost

Committer:
rafael210
Date:
Mon Oct 22 20:05:00 2018 +0000
Revision:
8:da7fc0c1a28a
Parent:
7:11433074d022
1000Hz firmware changed to 200Hz (ramp up fixed)

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 8:da7fc0c1a28a 33 float freq = 200; //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 7:11433074d022 57 float N = 100; // 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);
rafael210 7:11433074d022 160 THY_S= 0;
rafael210 7:11433074d022 161 wait_us(ton);
hsarfraz 2:98bc0c7668e3 162 IGBT_G.write(0);
rafael210 7:11433074d022 163 wait_us(toff);
hsarfraz 2:98bc0c7668e3 164 }
hsarfraz 2:98bc0c7668e3 165
hsarfraz 2:98bc0c7668e3 166 // ------------------------------- MAIN ------------------------------------- //
hsarfraz 2:98bc0c7668e3 167 int main()
hsarfraz 2:98bc0c7668e3 168 {
hsarfraz 2:98bc0c7668e3 169 pc.baud (115200);
hsarfraz 2:98bc0c7668e3 170 NVIC_SetPriority(TIMER3_IRQn, 0);
hsarfraz 2:98bc0c7668e3 171 // set mbed tickers to higher priority than other things
hsarfraz 2:98bc0c7668e3 172
hsarfraz 2:98bc0c7668e3 173 task_1_pin = 0;
hsarfraz 2:98bc0c7668e3 174 task_2_pin = 0;
hsarfraz 2:98bc0c7668e3 175 task_2_pin = 0;
hsarfraz 2:98bc0c7668e3 176 THY_S = 0;
hsarfraz 2:98bc0c7668e3 177 IGBT_G = 0;
hsarfraz 2:98bc0c7668e3 178 led1 = 0;
hsarfraz 2:98bc0c7668e3 179 led2 = 0;
hsarfraz 2:98bc0c7668e3 180 led3 = 0;
rafael210 3:d56766563719 181 led4 = 0;
hsarfraz 2:98bc0c7668e3 182
hsarfraz 2:98bc0c7668e3 183 scheduler1.attach(&task1, 0.0001); // R check
hsarfraz 2:98bc0c7668e3 184 scheduler2.attach(&task2, 0.2); // Reading Hall Sensor
hsarfraz 2:98bc0c7668e3 185 scheduler3.attach(&task3, 0.5); // Turn OFF Power
rafael210 7:11433074d022 186
hsarfraz 2:98bc0c7668e3 187
hsarfraz 2:98bc0c7668e3 188 /* Remote Start Prompt */
rafael210 3:d56766563719 189
hsarfraz 2:98bc0c7668e3 190 while(1) {
hsarfraz 2:98bc0c7668e3 191 if(led1==1) {
hsarfraz 2:98bc0c7668e3 192 break; // Waiting for start Button (pin21)
hsarfraz 2:98bc0c7668e3 193 }
hsarfraz 2:98bc0c7668e3 194 }
hsarfraz 2:98bc0c7668e3 195 led1 = 0;
rafael210 3:d56766563719 196 led2 = 0;
rafael210 3:d56766563719 197 wait_ms(1);
hsarfraz 2:98bc0c7668e3 198
hsarfraz 2:98bc0c7668e3 199
rafael210 3:d56766563719 200 //--------Ramp up Start ----------//
hsarfraz 5:0d28bca5dd26 201 TIMER.start();
hsarfraz 2:98bc0c7668e3 202 d_sat = resistance*I_out/V_batt;
hsarfraz 2:98bc0c7668e3 203
hsarfraz 2:98bc0c7668e3 204 if (d_sat > 0.99) {
hsarfraz 2:98bc0c7668e3 205 d_sat = 0.99; // duty cycle maximum value
rafael210 7:11433074d022 206 }
rafael210 7:11433074d022 207 ton_sat = (float)((d_sat/freq)*1000000);
rafael210 7:11433074d022 208 toff_sat = (float)((1/freq)*1000000 - ton_sat);
hsarfraz 2:98bc0c7668e3 209
hsarfraz 2:98bc0c7668e3 210 d = 0;
hsarfraz 2:98bc0c7668e3 211 c = 0;
rafael210 7:11433074d022 212 tstep = tramp*1000/N; //step time calculation in us
hsarfraz 2:98bc0c7668e3 213 while(c < (int)N) {
hsarfraz 2:98bc0c7668e3 214
rafael210 3:d56766563719 215 d = d + (d_sat/N); //duty cycle increment
hsarfraz 2:98bc0c7668e3 216 if (d>d_sat){d=d_sat;}
rafael210 7:11433074d022 217 ton = (float)((d/freq)*1000000); //in us
rafael210 7:11433074d022 218 toff = (float)((1/freq)*1000000 - ton); //in us
hsarfraz 2:98bc0c7668e3 219 Ncycles = (int)(tstep/(ton+toff)); //calculation of the number of cycles
hsarfraz 2:98bc0c7668e3 220 i = 0;
hsarfraz 2:98bc0c7668e3 221 while(i < Ncycles) {
hsarfraz 2:98bc0c7668e3 222 pw();
hsarfraz 2:98bc0c7668e3 223 i++;
hsarfraz 2:98bc0c7668e3 224 }
hsarfraz 2:98bc0c7668e3 225 c++;
hsarfraz 2:98bc0c7668e3 226 }
rafael210 3:d56766563719 227 //led3 = 0;
rafael210 3:d56766563719 228 led4 = 1; //indicates the ramp up is done
rafael210 3:d56766563719 229 //--------Ramp up End ----------//
rafael210 1:fa78d980522c 230
hsarfraz 2:98bc0c7668e3 231 while(1) {
rafael210 0:b265ed6faf6c 232
rafael210 7:11433074d022 233 d = d_sat; // 0>d<1 duty cycle
rafael210 7:11433074d022 234 //d = 0.3;
rafael210 7:11433074d022 235 ton = (float)((d/freq)*1000000);
rafael210 7:11433074d022 236 toff = (float)((1/freq)*1000000 - ton);
rafael210 3:d56766563719 237
hsarfraz 6:c905afa84d8a 238 if((led1 == 1)||(led2 == 1)||(led3 == 1)||(TIMER.read()>=RunTime)) //test conditions for break
rafael210 3:d56766563719 239 {
rafael210 1:fa78d980522c 240 break;
rafael210 3:d56766563719 241 }
rafael210 3:d56766563719 242
hsarfraz 2:98bc0c7668e3 243 pw();
rafael210 3:d56766563719 244 if(once==0)
rafael210 3:d56766563719 245 {
rafael210 3:d56766563719 246 once = 1;
rafael210 3:d56766563719 247 i_loadpre = i_load_avg; //acquire reference value
rafael210 3:d56766563719 248 }
rafael210 0:b265ed6faf6c 249 }
rafael210 3:d56766563719 250
rafael210 3:d56766563719 251 while(1) // wait for the remote signal before resetting
rafael210 3:d56766563719 252 {
rafael210 3:d56766563719 253 if(led1 == 1)
rafael210 3:d56766563719 254 {
rafael210 3:d56766563719 255 break;
rafael210 3:d56766563719 256 }
rafael210 3:d56766563719 257 }
rafael210 3:d56766563719 258
hsarfraz 5:0d28bca5dd26 259 TIMER.reset();
rafael210 3:d56766563719 260 NVIC_SystemReset();
rafael210 3:d56766563719 261
rafael210 0:b265ed6faf6c 262 }