Betterfrost / Mbed 2 deprecated timer_based_1kHz_ramp

Dependencies:   mbed

Fork of BoxBrovoEcho_OCt3 by Betterfrost

Committer:
hsarfraz
Date:
Wed Sep 05 21:06:19 2018 +0000
Revision:
2:98bc0c7668e3
Parent:
1:fa78d980522c
Child:
3:d56766563719
Code Timer Based ; Remote Control added; Current Limit + R_chk added; RampUp added

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