Hochschule München
/
PowerDriverforH2m
Mosfet Driver
main.cpp@5:d814001b8aae, 2013-05-14 (annotated)
- Committer:
- HMFK03LST1
- Date:
- Tue May 14 23:10:35 2013 +0000
- Revision:
- 5:d814001b8aae
- Parent:
- 4:8c89e422bed7
- Child:
- 6:4af29761b1f0
RTM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
HMFK03LST1 | 0:4f562ff70d13 | 1 | #include "mbed.h" |
HMFK03LST1 | 0:4f562ff70d13 | 2 | |
HMFK03LST1 | 2:bdd944abaf86 | 3 | LocalFileSystem local("local"); //init Flashdrive for reading config file |
HMFK03LST1 | 2:bdd944abaf86 | 4 | FILE *fp; //Pointer to local Config File |
HMFK03LST1 | 0:4f562ff70d13 | 5 | |
HMFK03LST1 | 0:4f562ff70d13 | 6 | #define USR_POWERDOWN (0x104) //Power Down Mbed Interface (save 50% or 45 mA) |
HMFK03LST1 | 0:4f562ff70d13 | 7 | |
HMFK03LST1 | 5:d814001b8aae | 8 | float version = 0.9; //Program Version |
HMFK03LST1 | 2:bdd944abaf86 | 9 | |
HMFK03LST1 | 5:d814001b8aae | 10 | bool mosfet_open = true ; //Mosfet1 geschlossen |
HMFK03LST1 | 5:d814001b8aae | 11 | bool mosfet_close = false; //Mosfet1 offen |
HMFK03LST1 | 5:d814001b8aae | 12 | |
HMFK03LST1 | 1:19d350e383e6 | 13 | |
HMFK03LST1 | 0:4f562ff70d13 | 14 | DigitalOut myled (LED1); |
HMFK03LST1 | 0:4f562ff70d13 | 15 | DigitalOut myled1 (LED2); |
HMFK03LST1 | 0:4f562ff70d13 | 16 | DigitalOut myled2 (LED3); |
HMFK03LST1 | 1:19d350e383e6 | 17 | DigitalOut myled3 (LED4); |
HMFK03LST1 | 0:4f562ff70d13 | 18 | |
HMFK03LST1 | 5:d814001b8aae | 19 | DigitalOut pump (p36); |
HMFK03LST1 | 5:d814001b8aae | 20 | DigitalOut purge (p35); |
HMFK03LST1 | 5:d814001b8aae | 21 | DigitalOut h2_blow(p34); |
HMFK03LST1 | 5:d814001b8aae | 22 | DigitalOut waterp (p33); |
HMFK03LST1 | 5:d814001b8aae | 23 | DigitalOut mosfet (p21); |
HMFK03LST1 | 5:d814001b8aae | 24 | |
HMFK03LST1 | 5:d814001b8aae | 25 | DigitalIn In1 (p22); // Caps Down |
HMFK03LST1 | 5:d814001b8aae | 26 | DigitalIn In2 (p23); // Power UP |
HMFK03LST1 | 5:d814001b8aae | 27 | DigitalIn In3 (p24); |
HMFK03LST1 | 5:d814001b8aae | 28 | DigitalIn In4 (p25); |
HMFK03LST1 | 5:d814001b8aae | 29 | DigitalIn In5 (p29); |
HMFK03LST1 | 5:d814001b8aae | 30 | DigitalIn In6 (p30); |
HMFK03LST1 | 5:d814001b8aae | 31 | |
HMFK03LST1 | 5:d814001b8aae | 32 | AnalogIn cap_in (p15); // AI 1 Faktor /14.8 |
HMFK03LST1 | 5:d814001b8aae | 33 | AnalogIn bz_in (p16); // AI 2 Faktor /14.8 |
HMFK03LST1 | 5:d814001b8aae | 34 | AnalogIn mos_in (p17); // AI 3 Faktor /1.5 |
HMFK03LST1 | 5:d814001b8aae | 35 | AnalogIn temp_in(p18); // AI 4 Faktor /1.5 |
HMFK03LST1 | 5:d814001b8aae | 36 | AnalogIn AI_5 (p19); // AI 5 Faktor * 2 |
HMFK03LST1 | 5:d814001b8aae | 37 | AnalogIn cur_in (p20); // AI 6 Faktor * 2 zum Strommesser |
HMFK03LST1 | 0:4f562ff70d13 | 38 | |
HMFK03LST1 | 0:4f562ff70d13 | 39 | Serial pc(USBTX, USBRX); |
HMFK03LST1 | 2:bdd944abaf86 | 40 | Ticker PC_OUT_timer; // Output Monitoring to Serial |
HMFK03LST1 | 2:bdd944abaf86 | 41 | Ticker LED_timer; // Set Status LED´s |
HMFK03LST1 | 1:19d350e383e6 | 42 | |
HMFK03LST1 | 0:4f562ff70d13 | 43 | Timer t; |
HMFK03LST1 | 0:4f562ff70d13 | 44 | |
HMFK03LST1 | 2:bdd944abaf86 | 45 | // Brennstoffzellen Parameter |
HMFK03LST1 | 2:bdd944abaf86 | 46 | float bz_max = 30.5; //Brennstoffzelle Spannung Abs. max. |
HMFK03LST1 | 3:af6a6f498276 | 47 | float bz_p_oben = 15.0; //Brennstoffzelle Prozent Load bei bz_max |
HMFK03LST1 | 2:bdd944abaf86 | 48 | float bz_on = 29.0; //Brennstoffzelle Spannung für Ladefreigabe) |
HMFK03LST1 | 2:bdd944abaf86 | 49 | float bz_min = 26.0; //Brennstoffzelle Spannung min. Laden beenden |
HMFK03LST1 | 2:bdd944abaf86 | 50 | float bz_p_unten = -20.0; //Brennstoffzelle Prozent Load bei bz_min |
HMFK03LST1 | 2:bdd944abaf86 | 51 | float bz_current = 1.5; //Brennstoffzellen Strom nominal |
HMFK03LST1 | 3:af6a6f498276 | 52 | float bz_cur_add = 2.0; //Brennstoffzellen Strom max |
HMFK03LST1 | 3:af6a6f498276 | 53 | float bz_c_i_max = 20.0; //Strom Integrale Reglung Max % |
HMFK03LST1 | 3:af6a6f498276 | 54 | float bz_c_i_min = -10.0; //Strom Integrale Reglung Min % |
HMFK03LST1 | 5:d814001b8aae | 55 | float bz_temp_max = 55.0; //Maximale Wassertemperatur °C |
HMFK03LST1 | 5:d814001b8aae | 56 | int load_fail = 0; //Kein Strom trotz Imax |
HMFK03LST1 | 2:bdd944abaf86 | 57 | |
HMFK03LST1 | 2:bdd944abaf86 | 58 | // SuperCap Parameter |
HMFK03LST1 | 2:bdd944abaf86 | 59 | float cap_max = 25.0; //CAP Spannung max. (Abschaltung) |
HMFK03LST1 | 3:af6a6f498276 | 60 | float cap_p_max = 90.0; //CAP Prozent Load bei 0V |
HMFK03LST1 | 2:bdd944abaf86 | 61 | float cap_min = 20.0; //CAP Spannung min. (Zelle an) |
HMFK03LST1 | 3:af6a6f498276 | 62 | float cap_p_min = 5.0; //CAP Prozent Load bei 0V |
HMFK03LST1 | 2:bdd944abaf86 | 63 | float cap_delta = 1.5; //Absenkung der Spannung mit Din |
HMFK03LST1 | 0:4f562ff70d13 | 64 | |
HMFK03LST1 | 2:bdd944abaf86 | 65 | // Pump & Purge Parameter |
HMFK03LST1 | 2:bdd944abaf86 | 66 | float purge_start = 3.0; //s before starting purch |
HMFK03LST1 | 2:bdd944abaf86 | 67 | float purge_end = 3.2; //s after finishing purch |
HMFK03LST1 | 2:bdd944abaf86 | 68 | float boost_time = 0.2; //s Pump runup with 100% Duty Cycle |
HMFK03LST1 | 5:d814001b8aae | 69 | float pump_red = 30.0; //% Pumpen PWM red. zwischen BZ_on und BZ_max linear |
HMFK03LST1 | 5:d814001b8aae | 70 | float pwm_cycle = 20.0; //ms für PWM Period |
HMFK03LST1 | 5:d814001b8aae | 71 | float pwm_on = 12.0; //ms für PWM high |
HMFK03LST1 | 5:d814001b8aae | 72 | float pwm_pro = 0; //PWM Taktung |
HMFK03LST1 | 2:bdd944abaf86 | 73 | |
HMFK03LST1 | 2:bdd944abaf86 | 74 | // Monitoring Parameter |
HMFK03LST1 | 2:bdd944abaf86 | 75 | int debug = 1; //Serial Output on (1) |
HMFK03LST1 | 2:bdd944abaf86 | 76 | float sample = 5; //Serial Output Samples per Second |
HMFK03LST1 | 5:d814001b8aae | 77 | char com_in[8] ; //Serial input |
HMFK03LST1 | 5:d814001b8aae | 78 | |
HMFK03LST1 | 5:d814001b8aae | 79 | |
HMFK03LST1 | 5:d814001b8aae | 80 | // Mosfet Parameter |
HMFK03LST1 | 5:d814001b8aae | 81 | int Cel_Level = 0; //% Load aus Bz Spannung |
HMFK03LST1 | 5:d814001b8aae | 82 | int Cap_Level = 0; //% Load aus Cap Spannung |
HMFK03LST1 | 5:d814001b8aae | 83 | int Cur_Level = 0; |
HMFK03LST1 | 5:d814001b8aae | 84 | int Load_Level = 0; //% Load aus Bz und Cap |
HMFK03LST1 | 5:d814001b8aae | 85 | float mos_temp = 0; //°C Mosfet |
HMFK03LST1 | 0:4f562ff70d13 | 86 | |
HMFK03LST1 | 2:bdd944abaf86 | 87 | // Temp Variable |
HMFK03LST1 | 2:bdd944abaf86 | 88 | bool Load = false; //Laderegler aktiv |
HMFK03LST1 | 2:bdd944abaf86 | 89 | bool pump_on = false; //Pumpenzustand |
HMFK03LST1 | 2:bdd944abaf86 | 90 | int boost = 0; //Number of PWM-Cycles for Pump runup boost calc in load_cfg |
HMFK03LST1 | 5:d814001b8aae | 91 | char input_c = 0; //Serial comand input |
HMFK03LST1 | 5:d814001b8aae | 92 | |
HMFK03LST1 | 2:bdd944abaf86 | 93 | float bz = 0; //Spannung Brennstoffzelle |
HMFK03LST1 | 2:bdd944abaf86 | 94 | float cap = 0; //Spannung SuperCap |
HMFK03LST1 | 2:bdd944abaf86 | 95 | float current = 0; //Strom in den Mosfet |
HMFK03LST1 | 5:d814001b8aae | 96 | float bz_temp = 0; //BZ Temperatur |
HMFK03LST1 | 5:d814001b8aae | 97 | bool temp_1_2 = false; //Auswahl Temperaturkanal |
HMFK03LST1 | 5:d814001b8aae | 98 | int pump_block = 2; |
HMFK03LST1 | 5:d814001b8aae | 99 | |
HMFK03LST1 | 5:d814001b8aae | 100 | unsigned int counter_cycle = 0; //Counter PWM-Cycles for Pump-Purge |
HMFK03LST1 | 5:d814001b8aae | 101 | unsigned int counter_takt = 0; //Counter for PWM Pump |
HMFK03LST1 | 0:4f562ff70d13 | 102 | |
HMFK03LST1 | 5:d814001b8aae | 103 | |
HMFK03LST1 | 5:d814001b8aae | 104 | float Regler_Hz = 1000.0; |
HMFK03LST1 | 5:d814001b8aae | 105 | |
HMFK03LST1 | 5:d814001b8aae | 106 | |
HMFK03LST1 | 5:d814001b8aae | 107 | |
HMFK03LST1 | 5:d814001b8aae | 108 | |
HMFK03LST1 | 0:4f562ff70d13 | 109 | void load_cfg() |
HMFK03LST1 | 0:4f562ff70d13 | 110 | { |
HMFK03LST1 | 5:d814001b8aae | 111 | char read[25][5]; |
HMFK03LST1 | 0:4f562ff70d13 | 112 | |
HMFK03LST1 | 0:4f562ff70d13 | 113 | char i = 0; |
HMFK03LST1 | 0:4f562ff70d13 | 114 | char j = 0; |
HMFK03LST1 | 0:4f562ff70d13 | 115 | int c = 0; |
HMFK03LST1 | 0:4f562ff70d13 | 116 | float temp; |
HMFK03LST1 | 0:4f562ff70d13 | 117 | |
HMFK03LST1 | 5:d814001b8aae | 118 | for (j = 0; j<26; j++) |
HMFK03LST1 | 0:4f562ff70d13 | 119 | { |
HMFK03LST1 | 5:d814001b8aae | 120 | for (i = 0; i<6; i++) |
HMFK03LST1 | 0:4f562ff70d13 | 121 | { |
HMFK03LST1 | 0:4f562ff70d13 | 122 | read[j][i] = '\0'; |
HMFK03LST1 | 0:4f562ff70d13 | 123 | } |
HMFK03LST1 | 0:4f562ff70d13 | 124 | } |
HMFK03LST1 | 0:4f562ff70d13 | 125 | |
HMFK03LST1 | 0:4f562ff70d13 | 126 | i=0; |
HMFK03LST1 | 0:4f562ff70d13 | 127 | j=0; |
HMFK03LST1 | 0:4f562ff70d13 | 128 | |
HMFK03LST1 | 0:4f562ff70d13 | 129 | fp = fopen("/local/power.cfg", "r"); |
HMFK03LST1 | 0:4f562ff70d13 | 130 | if ( fp != NULL ) |
HMFK03LST1 | 0:4f562ff70d13 | 131 | { |
HMFK03LST1 | 0:4f562ff70d13 | 132 | while((c != EOF) && (c !=10)) |
HMFK03LST1 | 0:4f562ff70d13 | 133 | { |
HMFK03LST1 | 0:4f562ff70d13 | 134 | c = fgetc(fp); |
HMFK03LST1 | 0:4f562ff70d13 | 135 | if (c == ';'){read[j][0] = i; i = 0; j++;} |
HMFK03LST1 | 0:4f562ff70d13 | 136 | else {i++; read[j][i] = c;} |
HMFK03LST1 | 0:4f562ff70d13 | 137 | } |
HMFK03LST1 | 5:d814001b8aae | 138 | fclose(fp); |
HMFK03LST1 | 0:4f562ff70d13 | 139 | |
HMFK03LST1 | 0:4f562ff70d13 | 140 | |
HMFK03LST1 | 2:bdd944abaf86 | 141 | sscanf(&read[ 0][1], "%f", &temp); bz_max = temp; |
HMFK03LST1 | 2:bdd944abaf86 | 142 | sscanf(&read[ 1][1], "%f", &temp); bz_p_oben = temp; |
HMFK03LST1 | 2:bdd944abaf86 | 143 | sscanf(&read[ 2][1], "%f", &temp); bz_on = temp; |
HMFK03LST1 | 2:bdd944abaf86 | 144 | sscanf(&read[ 3][1], "%f", &temp); bz_min = temp; |
HMFK03LST1 | 2:bdd944abaf86 | 145 | sscanf(&read[ 4][1], "%f", &temp); bz_p_unten = temp; |
HMFK03LST1 | 3:af6a6f498276 | 146 | sscanf(&read[ 5][1], "%f", &temp); bz_current = temp; |
HMFK03LST1 | 3:af6a6f498276 | 147 | sscanf(&read[ 6][1], "%f", &temp); bz_cur_add = temp; |
HMFK03LST1 | 3:af6a6f498276 | 148 | sscanf(&read[ 7][1], "%f", &temp); bz_c_i_max = temp; |
HMFK03LST1 | 3:af6a6f498276 | 149 | sscanf(&read[ 8][1], "%f", &temp); bz_c_i_min = temp; |
HMFK03LST1 | 5:d814001b8aae | 150 | sscanf(&read[ 9][1], "%f", &temp); bz_temp_max = temp; |
HMFK03LST1 | 5:d814001b8aae | 151 | |
HMFK03LST1 | 5:d814001b8aae | 152 | sscanf(&read[10][1], "%f", &temp); cap_max = temp; |
HMFK03LST1 | 5:d814001b8aae | 153 | sscanf(&read[11][1], "%f", &temp); cap_p_max = temp; |
HMFK03LST1 | 5:d814001b8aae | 154 | sscanf(&read[12][1], "%f", &temp); cap_min = temp; |
HMFK03LST1 | 5:d814001b8aae | 155 | sscanf(&read[13][1], "%f", &temp); cap_p_min = temp; |
HMFK03LST1 | 5:d814001b8aae | 156 | sscanf(&read[14][1], "%f", &temp); cap_delta = temp; |
HMFK03LST1 | 3:af6a6f498276 | 157 | |
HMFK03LST1 | 5:d814001b8aae | 158 | sscanf(&read[15][1], "%f", &temp); purge_start = temp; |
HMFK03LST1 | 5:d814001b8aae | 159 | sscanf(&read[16][1], "%f", &temp); purge_end = temp; |
HMFK03LST1 | 5:d814001b8aae | 160 | sscanf(&read[17][1], "%f", &temp); boost_time = temp; |
HMFK03LST1 | 5:d814001b8aae | 161 | sscanf(&read[18][1], "%f", &temp); pump_red = temp; |
HMFK03LST1 | 5:d814001b8aae | 162 | sscanf(&read[19][1], "%f", &temp); pwm_cycle = temp; |
HMFK03LST1 | 5:d814001b8aae | 163 | sscanf(&read[20][1], "%f", &temp); pwm_on = temp; |
HMFK03LST1 | 3:af6a6f498276 | 164 | |
HMFK03LST1 | 5:d814001b8aae | 165 | sscanf(&read[21][1], "%f", &temp); Regler_Hz = temp; |
HMFK03LST1 | 5:d814001b8aae | 166 | sscanf(&read[22][1], "%f", &temp); debug = temp; |
HMFK03LST1 | 5:d814001b8aae | 167 | sscanf(&read[23][1], "%f", &temp); sample = temp; |
HMFK03LST1 | 0:4f562ff70d13 | 168 | |
HMFK03LST1 | 5:d814001b8aae | 169 | boost = boost_time * 1000 / pwm_cycle; |
HMFK03LST1 | 5:d814001b8aae | 170 | pump_block = 5 / purge_end; |
HMFK03LST1 | 2:bdd944abaf86 | 171 | } |
HMFK03LST1 | 0:4f562ff70d13 | 172 | |
HMFK03LST1 | 5:d814001b8aae | 173 | pc.printf("\n\r" ); |
HMFK03LST1 | 3:af6a6f498276 | 174 | pc.printf("******************************** \n\r" ); |
HMFK03LST1 | 2:bdd944abaf86 | 175 | pc.printf("* Brennstoffzellenregler V%03.1f * \n\r",version); |
HMFK03LST1 | 3:af6a6f498276 | 176 | pc.printf("******************************** \n\r" ); |
HMFK03LST1 | 3:af6a6f498276 | 177 | pc.printf("--------------BZ---------------- \n\r" ); |
HMFK03LST1 | 4:8c89e422bed7 | 178 | pc.printf(" BZ max [V] : %5.1f \n\r",bz_max ); |
HMFK03LST1 | 4:8c89e422bed7 | 179 | pc.printf(" BZ max [%c] : %5.1f \n\r",37,bz_p_oben ); |
HMFK03LST1 | 4:8c89e422bed7 | 180 | pc.printf(" BZ Laden on [V] : %5.1f \n\r",bz_on ); |
HMFK03LST1 | 4:8c89e422bed7 | 181 | pc.printf(" BZ Laden off [V] : %5.1f \n\r",bz_min ); |
HMFK03LST1 | 4:8c89e422bed7 | 182 | pc.printf(" BZ Laden off [%c] : %5.1f \n\r",37,bz_p_unten ); |
HMFK03LST1 | 4:8c89e422bed7 | 183 | pc.printf(" BZ Strom norm [A] : %5.1f \n\r",bz_current ); |
HMFK03LST1 | 4:8c89e422bed7 | 184 | pc.printf(" BZ Strom max. [A] : %5.1f \n\r",bz_cur_add ); |
HMFK03LST1 | 4:8c89e422bed7 | 185 | pc.printf(" BZ Strom I max.[%c] : %5.1f \n\r",37,bz_c_i_max ); |
HMFK03LST1 | 4:8c89e422bed7 | 186 | pc.printf(" BZ Strom I min.[%c] : %5.1f \n\r",37,bz_c_i_min ); |
HMFK03LST1 | 5:d814001b8aae | 187 | pc.printf(" BZ Temp max. [%cC]: %5.1f \n\r",176,bz_temp_max); |
HMFK03LST1 | 3:af6a6f498276 | 188 | pc.printf("-------------CAP---------------- \n\r" ); |
HMFK03LST1 | 4:8c89e422bed7 | 189 | pc.printf(" CAP max [V] : %5.1f \n\r",cap_max ); |
HMFK03LST1 | 4:8c89e422bed7 | 190 | pc.printf(" CAP max [%c] : %5.1f \n\r",37,cap_p_max ); |
HMFK03LST1 | 4:8c89e422bed7 | 191 | pc.printf(" CAP min [V] : %5.1f \n\r",cap_min ); |
HMFK03LST1 | 4:8c89e422bed7 | 192 | pc.printf(" CAP min [%c] : %5.1f \n\r",37,cap_p_min ); |
HMFK03LST1 | 4:8c89e422bed7 | 193 | pc.printf(" CAP lo on Din [-V]: %5.1f \n\r",cap_delta ); |
HMFK03LST1 | 3:af6a6f498276 | 194 | pc.printf("----------Pump & Purge---------- \n\r" ); |
HMFK03LST1 | 4:8c89e422bed7 | 195 | pc.printf(" Purge on [s] : %5.1f \n\r",purge_start ); |
HMFK03LST1 | 4:8c89e422bed7 | 196 | pc.printf(" Purge off [s] : %5.1f \n\r",purge_end ); |
HMFK03LST1 | 4:8c89e422bed7 | 197 | pc.printf(" Boost [s] : %5.1f \n\r",boost_time ); |
HMFK03LST1 | 5:d814001b8aae | 198 | pc.printf(" Pumpe abregeln [%c] : %5.1f \n\r",37,pump_red ); |
HMFK03LST1 | 5:d814001b8aae | 199 | pc.printf(" PWM cycle [ms]: %5.0f \n\r" ,pwm_cycle ); |
HMFK03LST1 | 5:d814001b8aae | 200 | pc.printf(" PWM on [ms]: %5.0f \n\r" ,pwm_on ); |
HMFK03LST1 | 3:af6a6f498276 | 201 | pc.printf("------------Monitor------------- \n\r" ); |
HMFK03LST1 | 5:d814001b8aae | 202 | pc.printf(" Regler Frequenz[Hz] :%4.0f \n\r" ,Regler_Hz ); |
HMFK03LST1 | 5:d814001b8aae | 203 | pc.printf(" Serial output [bool]: %3d \n\r" ,debug ); |
HMFK03LST1 | 5:d814001b8aae | 204 | pc.printf(" Samplerate [Hz] : %3.0f \n\r",sample ); |
HMFK03LST1 | 3:af6a6f498276 | 205 | pc.printf("******************************** \n\r" ); |
HMFK03LST1 | 3:af6a6f498276 | 206 | pc.printf("\n\r" ); |
HMFK03LST1 | 0:4f562ff70d13 | 207 | } |
HMFK03LST1 | 0:4f562ff70d13 | 208 | |
HMFK03LST1 | 5:d814001b8aae | 209 | void LED() |
HMFK03LST1 | 5:d814001b8aae | 210 | { |
HMFK03LST1 | 5:d814001b8aae | 211 | if (bz < bz_min ) myled = 1; else myled = 0; //LED = Spannung an der BZ IO |
HMFK03LST1 | 5:d814001b8aae | 212 | if (cap > cap_min) myled1 = 1; else myled1 = 0; //LED = Spannung an den Cap´s IO |
HMFK03LST1 | 5:d814001b8aae | 213 | if ((mosfet == mosfet_close) |
HMFK03LST1 | 5:d814001b8aae | 214 | &&(Load == true)) myled2 = 1; else myled2 = 0; //LED = Gate Zustand Mosfet 1 |
HMFK03LST1 | 5:d814001b8aae | 215 | if (pump_on == 1) myled3 = 1; else myled3 = 0; //LED = Pumpe an |
HMFK03LST1 | 5:d814001b8aae | 216 | } |
HMFK03LST1 | 5:d814001b8aae | 217 | |
HMFK03LST1 | 5:d814001b8aae | 218 | void led_beep() |
HMFK03LST1 | 5:d814001b8aae | 219 | { |
HMFK03LST1 | 5:d814001b8aae | 220 | LED_timer.detach(); |
HMFK03LST1 | 5:d814001b8aae | 221 | mosfet = mosfet_open; |
HMFK03LST1 | 5:d814001b8aae | 222 | myled = 0; myled1 = 0; myled2 = 0; myled3 = 0; |
HMFK03LST1 | 5:d814001b8aae | 223 | wait(0.1); |
HMFK03LST1 | 5:d814001b8aae | 224 | myled = 1; |
HMFK03LST1 | 5:d814001b8aae | 225 | wait(0.1); |
HMFK03LST1 | 5:d814001b8aae | 226 | myled1 = 1; |
HMFK03LST1 | 5:d814001b8aae | 227 | wait(0.1); |
HMFK03LST1 | 5:d814001b8aae | 228 | myled2 = 1; |
HMFK03LST1 | 5:d814001b8aae | 229 | wait(0.1); |
HMFK03LST1 | 5:d814001b8aae | 230 | myled3 = 1; |
HMFK03LST1 | 5:d814001b8aae | 231 | wait(0.1); |
HMFK03LST1 | 5:d814001b8aae | 232 | LED_timer.attach (&LED , 0.200); |
HMFK03LST1 | 5:d814001b8aae | 233 | myled3 = 1; |
HMFK03LST1 | 5:d814001b8aae | 234 | } |
HMFK03LST1 | 5:d814001b8aae | 235 | |
HMFK03LST1 | 5:d814001b8aae | 236 | |
HMFK03LST1 | 5:d814001b8aae | 237 | void do_command() |
HMFK03LST1 | 5:d814001b8aae | 238 | { |
HMFK03LST1 | 5:d814001b8aae | 239 | switch(com_in[0]) |
HMFK03LST1 | 5:d814001b8aae | 240 | { |
HMFK03LST1 | 5:d814001b8aae | 241 | case 'r': load_cfg(); |
HMFK03LST1 | 5:d814001b8aae | 242 | led_beep(); |
HMFK03LST1 | 5:d814001b8aae | 243 | break; |
HMFK03LST1 | 5:d814001b8aae | 244 | } |
HMFK03LST1 | 5:d814001b8aae | 245 | } |
HMFK03LST1 | 5:d814001b8aae | 246 | |
HMFK03LST1 | 5:d814001b8aae | 247 | |
HMFK03LST1 | 5:d814001b8aae | 248 | void get_input() |
HMFK03LST1 | 5:d814001b8aae | 249 | { |
HMFK03LST1 | 5:d814001b8aae | 250 | char wert; |
HMFK03LST1 | 5:d814001b8aae | 251 | |
HMFK03LST1 | 5:d814001b8aae | 252 | while (pc.readable() == true) |
HMFK03LST1 | 5:d814001b8aae | 253 | { |
HMFK03LST1 | 5:d814001b8aae | 254 | wert = pc.getc(); //Char lesen |
HMFK03LST1 | 5:d814001b8aae | 255 | if ((wert == 'c') && ((input_c == 0))) {input_c = 1;} //Command Char 1 prüfen |
HMFK03LST1 | 5:d814001b8aae | 256 | if ( wert == 10) {input_c = 0; do_command(); com_in[0] =' ';} //Command End prüfen |
HMFK03LST1 | 5:d814001b8aae | 257 | |
HMFK03LST1 | 5:d814001b8aae | 258 | if (input_c == 2) |
HMFK03LST1 | 5:d814001b8aae | 259 | { |
HMFK03LST1 | 5:d814001b8aae | 260 | com_in[0] = wert; |
HMFK03LST1 | 5:d814001b8aae | 261 | } |
HMFK03LST1 | 5:d814001b8aae | 262 | |
HMFK03LST1 | 5:d814001b8aae | 263 | if ((input_c == 1) && (wert == '_')){input_c = 2;} //Command Char 2 prüfen |
HMFK03LST1 | 5:d814001b8aae | 264 | } |
HMFK03LST1 | 5:d814001b8aae | 265 | } |
HMFK03LST1 | 5:d814001b8aae | 266 | |
HMFK03LST1 | 5:d814001b8aae | 267 | |
HMFK03LST1 | 5:d814001b8aae | 268 | |
HMFK03LST1 | 5:d814001b8aae | 269 | |
HMFK03LST1 | 2:bdd944abaf86 | 270 | |
HMFK03LST1 | 1:19d350e383e6 | 271 | int semihost_powerdown() |
HMFK03LST1 | 1:19d350e383e6 | 272 | { |
HMFK03LST1 | 1:19d350e383e6 | 273 | uint32_t arg; |
HMFK03LST1 | 1:19d350e383e6 | 274 | return __semihost(USR_POWERDOWN, &arg); |
HMFK03LST1 | 1:19d350e383e6 | 275 | } |
HMFK03LST1 | 1:19d350e383e6 | 276 | |
HMFK03LST1 | 2:bdd944abaf86 | 277 | |
HMFK03LST1 | 5:d814001b8aae | 278 | int port(int number) |
HMFK03LST1 | 5:d814001b8aae | 279 | { |
HMFK03LST1 | 5:d814001b8aae | 280 | if (number == 1) {if (In1 == 1) return 1; else return 0;} |
HMFK03LST1 | 5:d814001b8aae | 281 | if (number == 2) {if (In2 == 1) return 1; else return 0;} |
HMFK03LST1 | 5:d814001b8aae | 282 | if (number == 3) {if (In3 == 1) return 1; else return 0;} |
HMFK03LST1 | 5:d814001b8aae | 283 | if (number == 4) {if (In4 == 1) return 1; else return 0;} |
HMFK03LST1 | 5:d814001b8aae | 284 | if (number == 5) {if (In5 == 1) return 1; else return 0;} |
HMFK03LST1 | 5:d814001b8aae | 285 | if (number == 6) {if (In6 == 1) return 1; else return 0;} |
HMFK03LST1 | 5:d814001b8aae | 286 | return 2; |
HMFK03LST1 | 5:d814001b8aae | 287 | } |
HMFK03LST1 | 5:d814001b8aae | 288 | |
HMFK03LST1 | 1:19d350e383e6 | 289 | void SEND() |
HMFK03LST1 | 1:19d350e383e6 | 290 | { |
HMFK03LST1 | 5:d814001b8aae | 291 | float temp1 = 0; |
HMFK03LST1 | 5:d814001b8aae | 292 | float temp2 = 0; |
HMFK03LST1 | 5:d814001b8aae | 293 | float temp3 = 0; |
HMFK03LST1 | 5:d814001b8aae | 294 | float temp4 = 0; |
HMFK03LST1 | 5:d814001b8aae | 295 | float temp5 = 0; |
HMFK03LST1 | 5:d814001b8aae | 296 | char temp6 = 0; |
HMFK03LST1 | 5:d814001b8aae | 297 | |
HMFK03LST1 | 3:af6a6f498276 | 298 | bool status= false; |
HMFK03LST1 | 5:d814001b8aae | 299 | |
HMFK03LST1 | 5:d814001b8aae | 300 | switch (debug) |
HMFK03LST1 | 5:d814001b8aae | 301 | { |
HMFK03LST1 | 5:d814001b8aae | 302 | case 1: |
HMFK03LST1 | 5:d814001b8aae | 303 | if (mosfet == mosfet_close) status = true; |
HMFK03LST1 | 5:d814001b8aae | 304 | if (Load == true) mosfet = mosfet_open; |
HMFK03LST1 | 5:d814001b8aae | 305 | pc.printf("BZ: %4.1f/%4.1f-%4.1f+%4.1f CAP: %4.1f/%4.1f-%4.1f Pump : %2d Purge: %3.1f/%3.1f-%3.1f Load: %02d/%02d-%02d Current: %4.2f Temp BZ: %3.1f Temp Mos: %3.1f\n\r" |
HMFK03LST1 | 5:d814001b8aae | 306 | ,bz,bz_min,bz_on,bz_max,cap,cap_min,cap_max,int(pwm_pro*100),float(counter_cycle*pwm_cycle/1000), |
HMFK03LST1 | 5:d814001b8aae | 307 | purge_start,purge_end,int(Load_Level),int((Cap_Level + Cel_Level) + bz_c_i_min), |
HMFK03LST1 | 5:d814001b8aae | 308 | int((Cap_Level + Cel_Level) + bz_c_i_max), current, bz_temp, mos_temp); |
HMFK03LST1 | 5:d814001b8aae | 309 | if (status == true) mosfet = mosfet_close; |
HMFK03LST1 | 5:d814001b8aae | 310 | break; |
HMFK03LST1 | 5:d814001b8aae | 311 | |
HMFK03LST1 | 5:d814001b8aae | 312 | case 2: |
HMFK03LST1 | 5:d814001b8aae | 313 | if (mosfet == mosfet_close) status = true; |
HMFK03LST1 | 5:d814001b8aae | 314 | if (Load == true) mosfet = mosfet_open; |
HMFK03LST1 | 5:d814001b8aae | 315 | pc.printf("In1: %2d In2: %2d In3: %2d In4: %2d In5: %2d In6: %2d \n\r",port(1),port(2),port(3),port(4),port(5),port(6)); |
HMFK03LST1 | 5:d814001b8aae | 316 | if (status == true) mosfet = mosfet_close; |
HMFK03LST1 | 5:d814001b8aae | 317 | break; |
HMFK03LST1 | 5:d814001b8aae | 318 | |
HMFK03LST1 | 5:d814001b8aae | 319 | case 3: |
HMFK03LST1 | 5:d814001b8aae | 320 | if (mosfet == mosfet_close) status = true; |
HMFK03LST1 | 5:d814001b8aae | 321 | if (Load == true) mosfet = mosfet_open; |
HMFK03LST1 | 5:d814001b8aae | 322 | pc.printf("AI1: %3.2f AI2: %3.2f AI3: %3.2f AI4: %3.2f AI5: %3.2f AI6: %3.2f \n\r",cap_in.read(),bz_in.read(),mos_in.read(),temp_in.read(),AI_5.read(),cur_in.read()); |
HMFK03LST1 | 5:d814001b8aae | 323 | if (status == true) mosfet = mosfet_close; |
HMFK03LST1 | 5:d814001b8aae | 324 | break; |
HMFK03LST1 | 5:d814001b8aae | 325 | |
HMFK03LST1 | 5:d814001b8aae | 326 | case 4: |
HMFK03LST1 | 5:d814001b8aae | 327 | pc.printf("Change \n\r"); |
HMFK03LST1 | 5:d814001b8aae | 328 | pump = !pump ; |
HMFK03LST1 | 5:d814001b8aae | 329 | purge = !purge; |
HMFK03LST1 | 5:d814001b8aae | 330 | h2_blow = !h2_blow; |
HMFK03LST1 | 5:d814001b8aae | 331 | waterp = !waterp; |
HMFK03LST1 | 5:d814001b8aae | 332 | mosfet = !mosfet; |
HMFK03LST1 | 5:d814001b8aae | 333 | break; |
HMFK03LST1 | 5:d814001b8aae | 334 | |
HMFK03LST1 | 5:d814001b8aae | 335 | |
HMFK03LST1 | 5:d814001b8aae | 336 | |
HMFK03LST1 | 5:d814001b8aae | 337 | case 5: |
HMFK03LST1 | 5:d814001b8aae | 338 | |
HMFK03LST1 | 5:d814001b8aae | 339 | if (((Cap_Level + Cel_Level) + bz_c_i_min) > 0) {temp1 = ((Cap_Level + Cel_Level) + bz_c_i_min);} |
HMFK03LST1 | 5:d814001b8aae | 340 | else temp1 = 0; |
HMFK03LST1 | 5:d814001b8aae | 341 | |
HMFK03LST1 | 5:d814001b8aae | 342 | if (((Cap_Level + Cel_Level) + bz_c_i_max) > 0) {temp2 = ((Cap_Level + Cel_Level) + bz_c_i_max);} |
HMFK03LST1 | 5:d814001b8aae | 343 | else temp2 = 0; |
HMFK03LST1 | 5:d814001b8aae | 344 | |
HMFK03LST1 | 5:d814001b8aae | 345 | if (current > 0) {temp3 = current;} |
HMFK03LST1 | 5:d814001b8aae | 346 | else temp3 = 0; |
HMFK03LST1 | 5:d814001b8aae | 347 | |
HMFK03LST1 | 5:d814001b8aae | 348 | if (bz_temp > 0) {temp4 = bz_temp;} |
HMFK03LST1 | 5:d814001b8aae | 349 | else temp4 = 0; |
HMFK03LST1 | 5:d814001b8aae | 350 | |
HMFK03LST1 | 5:d814001b8aae | 351 | if (mos_temp > 0) {temp5 = mos_temp;} |
HMFK03LST1 | 5:d814001b8aae | 352 | else temp5 = 0; |
HMFK03LST1 | 5:d814001b8aae | 353 | |
HMFK03LST1 | 5:d814001b8aae | 354 | temp6 = (purge<<7)+(pump_on<<6)+(In1<<5) + (In2<<4) + (In3<<3) + (In4<<2) + (In5<<1) + In6; |
HMFK03LST1 | 5:d814001b8aae | 355 | |
HMFK03LST1 | 5:d814001b8aae | 356 | pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c",255,128, //0,1 |
HMFK03LST1 | 5:d814001b8aae | 357 | char(int(bz*6)), //0-35 zu 0-250 2 0 |
HMFK03LST1 | 5:d814001b8aae | 358 | char(int(cap*7)), //0-38 zu 0-250 3 1 |
HMFK03LST1 | 5:d814001b8aae | 359 | char(int(Load_Level * 2.5)), //0-100 zu 0-250 4 2 |
HMFK03LST1 | 5:d814001b8aae | 360 | char(int(temp1 * 2.5)), //0-100 zu 0-250 5 3 |
HMFK03LST1 | 5:d814001b8aae | 361 | char(int(temp2 * 2.5)), //0-100 zu 0-250 6 4 |
HMFK03LST1 | 5:d814001b8aae | 362 | char(int(temp3 * 25 )), //0-10 zu 0-250 7 5 |
HMFK03LST1 | 5:d814001b8aae | 363 | char(int(temp4 * 2.5)), //0-100 zu 0-250 8 6 |
HMFK03LST1 | 5:d814001b8aae | 364 | char(int(temp5 * 2.5)), //0-100 zu 0-250 9 7 |
HMFK03LST1 | 5:d814001b8aae | 365 | char(int(pwm_pro * 250)), //0-100 zu 0-250 10 8 |
HMFK03LST1 | 5:d814001b8aae | 366 | temp6 //Statusbits Din/Pump/Purge |
HMFK03LST1 | 5:d814001b8aae | 367 | ); |
HMFK03LST1 | 5:d814001b8aae | 368 | break; |
HMFK03LST1 | 2:bdd944abaf86 | 369 | } |
HMFK03LST1 | 5:d814001b8aae | 370 | |
HMFK03LST1 | 1:19d350e383e6 | 371 | } |
HMFK03LST1 | 1:19d350e383e6 | 372 | |
HMFK03LST1 | 1:19d350e383e6 | 373 | |
HMFK03LST1 | 5:d814001b8aae | 374 | |
HMFK03LST1 | 5:d814001b8aae | 375 | |
HMFK03LST1 | 5:d814001b8aae | 376 | |
HMFK03LST1 | 5:d814001b8aae | 377 | |
HMFK03LST1 | 5:d814001b8aae | 378 | void TEMP() |
HMFK03LST1 | 1:19d350e383e6 | 379 | { |
HMFK03LST1 | 5:d814001b8aae | 380 | if (temp_1_2 == true) bz_temp = (temp_in.read()/0.00407)- 48.3; |
HMFK03LST1 | 5:d814001b8aae | 381 | else mos_temp = ( mos_in.read()/0.00407)- 50.3; |
HMFK03LST1 | 5:d814001b8aae | 382 | temp_1_2 = !temp_1_2; |
HMFK03LST1 | 1:19d350e383e6 | 383 | } |
HMFK03LST1 | 0:4f562ff70d13 | 384 | |
HMFK03LST1 | 0:4f562ff70d13 | 385 | |
HMFK03LST1 | 5:d814001b8aae | 386 | |
HMFK03LST1 | 1:19d350e383e6 | 387 | void PUMPE() |
HMFK03LST1 | 1:19d350e383e6 | 388 | { |
HMFK03LST1 | 5:d814001b8aae | 389 | float regler = 1; |
HMFK03LST1 | 5:d814001b8aae | 390 | |
HMFK03LST1 | 5:d814001b8aae | 391 | counter_takt++; //Aufrufzähler |
HMFK03LST1 | 3:af6a6f498276 | 392 | |
HMFK03LST1 | 5:d814001b8aae | 393 | |
HMFK03LST1 | 5:d814001b8aae | 394 | |
HMFK03LST1 | 5:d814001b8aae | 395 | if (cap > (cap_max - (!In1 * cap_delta))) |
HMFK03LST1 | 3:af6a6f498276 | 396 | { |
HMFK03LST1 | 3:af6a6f498276 | 397 | pump_on = false; |
HMFK03LST1 | 5:d814001b8aae | 398 | pwm_pro = 0; |
HMFK03LST1 | 3:af6a6f498276 | 399 | } |
HMFK03LST1 | 3:af6a6f498276 | 400 | |
HMFK03LST1 | 3:af6a6f498276 | 401 | |
HMFK03LST1 | 3:af6a6f498276 | 402 | if ((cap <= cap_min) || (pump_on == true)) //Pumpe Einschaltbedingung |
HMFK03LST1 | 2:bdd944abaf86 | 403 | { |
HMFK03LST1 | 1:19d350e383e6 | 404 | pump_on = true; |
HMFK03LST1 | 5:d814001b8aae | 405 | |
HMFK03LST1 | 5:d814001b8aae | 406 | if (bz > bz_on) {1 - ((pump_red / ((bz_max-(!In1 * cap_delta)) - bz_on) * (bz - bz_on)) / 1000);} //Luftreduzierung wenn Spannung über BZ_on (lineare Reduzierung bis BZ_max um pump_red(%)) |
HMFK03LST1 | 5:d814001b8aae | 407 | |
HMFK03LST1 | 5:d814001b8aae | 408 | pwm_pro = ((float(pwm_on) * regler) / pwm_cycle ); //PWM Prozent für Monitoring |
HMFK03LST1 | 5:d814001b8aae | 409 | |
HMFK03LST1 | 5:d814001b8aae | 410 | |
HMFK03LST1 | 5:d814001b8aae | 411 | if ((pump_block == 0) && (counter_takt > (pwm_cycle - pwm_on) * Regler_Hz / 1000.0)) {pump = 1 ;} //Set PWM from low to high |
HMFK03LST1 | 5:d814001b8aae | 412 | |
HMFK03LST1 | 5:d814001b8aae | 413 | |
HMFK03LST1 | 5:d814001b8aae | 414 | if (counter_takt > (pwm_cycle * Regler_Hz / 1000)) //End PWM cycle |
HMFK03LST1 | 1:19d350e383e6 | 415 | { |
HMFK03LST1 | 5:d814001b8aae | 416 | if (counter_cycle == (50)) TEMP(); //Temperatur messen |
HMFK03LST1 | 5:d814001b8aae | 417 | counter_takt = 0; |
HMFK03LST1 | 2:bdd944abaf86 | 418 | counter_cycle++; |
HMFK03LST1 | 2:bdd944abaf86 | 419 | |
HMFK03LST1 | 5:d814001b8aae | 420 | if ((boost > 0) && (pump_block == 0)) {boost--;} |
HMFK03LST1 | 1:19d350e383e6 | 421 | |
HMFK03LST1 | 5:d814001b8aae | 422 | if (counter_cycle >= ((purge_start - boost_time) * 1000 / pwm_cycle)) //Vorgezogener Anlauf Purgepumpe |
HMFK03LST1 | 5:d814001b8aae | 423 | { |
HMFK03LST1 | 5:d814001b8aae | 424 | if (pump = 1) purge = 1; |
HMFK03LST1 | 5:d814001b8aae | 425 | } |
HMFK03LST1 | 5:d814001b8aae | 426 | |
HMFK03LST1 | 5:d814001b8aae | 427 | if (counter_cycle < ((purge_start - boost_time) * 1000 / pwm_cycle)) |
HMFK03LST1 | 5:d814001b8aae | 428 | { |
HMFK03LST1 | 5:d814001b8aae | 429 | if (boost == 0) pump = 0; //PWM Betrieb |
HMFK03LST1 | 1:19d350e383e6 | 430 | purge = 0; |
HMFK03LST1 | 1:19d350e383e6 | 431 | } |
HMFK03LST1 | 1:19d350e383e6 | 432 | else |
HMFK03LST1 | 1:19d350e383e6 | 433 | { |
HMFK03LST1 | 5:d814001b8aae | 434 | pump = 0; |
HMFK03LST1 | 1:19d350e383e6 | 435 | } |
HMFK03LST1 | 1:19d350e383e6 | 436 | |
HMFK03LST1 | 5:d814001b8aae | 437 | if (counter_cycle >= (purge_end * (1000 / pwm_cycle ))) //Purge Ende counter_cycle = 1 pro Mosfet (PWM 1000/Regler_Hz in [ms]) |
HMFK03LST1 | 1:19d350e383e6 | 438 | { |
HMFK03LST1 | 2:bdd944abaf86 | 439 | counter_cycle = 0; |
HMFK03LST1 | 1:19d350e383e6 | 440 | purge = 0; |
HMFK03LST1 | 1:19d350e383e6 | 441 | pump = 0; |
HMFK03LST1 | 5:d814001b8aae | 442 | if (pump_block > 0) pump_block--; |
HMFK03LST1 | 1:19d350e383e6 | 443 | } |
HMFK03LST1 | 1:19d350e383e6 | 444 | } |
HMFK03LST1 | 1:19d350e383e6 | 445 | } |
HMFK03LST1 | 1:19d350e383e6 | 446 | else |
HMFK03LST1 | 1:19d350e383e6 | 447 | { |
HMFK03LST1 | 1:19d350e383e6 | 448 | pump_on = 0; pump = 0; purge = 0; //Pumpe aus |
HMFK03LST1 | 5:d814001b8aae | 449 | boost = (boost_time * 1000 / pwm_cycle); // Boost für nächsten Start setzen |
HMFK03LST1 | 1:19d350e383e6 | 450 | } |
HMFK03LST1 | 0:4f562ff70d13 | 451 | |
HMFK03LST1 | 1:19d350e383e6 | 452 | } |
HMFK03LST1 | 1:19d350e383e6 | 453 | |
HMFK03LST1 | 1:19d350e383e6 | 454 | int main() |
HMFK03LST1 | 2:bdd944abaf86 | 455 | { |
HMFK03LST1 | 5:d814001b8aae | 456 | mosfet = mosfet_open; //Mosfet schließen |
HMFK03LST1 | 0:4f562ff70d13 | 457 | pc.baud(115200); //config Serial Port |
HMFK03LST1 | 0:4f562ff70d13 | 458 | load_cfg(); //init config File |
HMFK03LST1 | 5:d814001b8aae | 459 | //semihost_powerdown(); //Mbed Interface powerdown |
HMFK03LST1 | 1:19d350e383e6 | 460 | PC_OUT_timer.attach(&SEND , (1/sample)); //Serial output Timer |
HMFK03LST1 | 5:d814001b8aae | 461 | LED_timer.attach (&LED , 0.200 ); //LED Status Timer |
HMFK03LST1 | 5:d814001b8aae | 462 | |
HMFK03LST1 | 0:4f562ff70d13 | 463 | t.start(); //Timer für PWM starten |
HMFK03LST1 | 2:bdd944abaf86 | 464 | float bz_faktor; //Temp Variable |
HMFK03LST1 | 5:d814001b8aae | 465 | unsigned int pwm_cycle_count; |
HMFK03LST1 | 5:d814001b8aae | 466 | bool power_up = 0; |
HMFK03LST1 | 5:d814001b8aae | 467 | |
HMFK03LST1 | 5:d814001b8aae | 468 | pwm_cycle_count = ((1000000/Regler_Hz)); |
HMFK03LST1 | 2:bdd944abaf86 | 469 | bz_faktor = ((bz_p_oben - bz_p_unten)/(bz_max - bz_min)); //Prozent Umrechnung BZ |
HMFK03LST1 | 2:bdd944abaf86 | 470 | |
HMFK03LST1 | 2:bdd944abaf86 | 471 | |
HMFK03LST1 | 0:4f562ff70d13 | 472 | |
HMFK03LST1 | 0:4f562ff70d13 | 473 | while(1) |
HMFK03LST1 | 0:4f562ff70d13 | 474 | { |
HMFK03LST1 | 5:d814001b8aae | 475 | while (t.read_us() <= pwm_cycle_count){}; |
HMFK03LST1 | 5:d814001b8aae | 476 | |
HMFK03LST1 | 5:d814001b8aae | 477 | get_input(); //µs Timer für Mosfet PWM starten |
HMFK03LST1 | 5:d814001b8aae | 478 | PUMPE(); //Pumpen PWM aufrufen |
HMFK03LST1 | 5:d814001b8aae | 479 | |
HMFK03LST1 | 5:d814001b8aae | 480 | bz = (((24.54 * bz_in * bz_in)+(31.812 * bz_in)+0.04)*2 + bz )/3; //BZ RAW in Spannung umrechnen (2*neu zu 1*alt Glättung) (immer) |
HMFK03LST1 | 5:d814001b8aae | 481 | if (counter_takt%2 == 0){cap = (((24.54 * cap_in * cap_in)+(31.812 * cap_in + 0.04))*2 + cap_in )/3;} //CAP RAW in Spannung umrechnen (2*neu zu 1*alt Glättung) (jedes 2.mal) |
HMFK03LST1 | 5:d814001b8aae | 482 | else {current = (cur_in - 0.32) * 12.568;} //Current RAW in Spannung umrechnen (ohne Glättung) (jedes 2.mal) |
HMFK03LST1 | 5:d814001b8aae | 483 | |
HMFK03LST1 | 5:d814001b8aae | 484 | |
HMFK03LST1 | 5:d814001b8aae | 485 | |
HMFK03LST1 | 3:af6a6f498276 | 486 | //***Regulate Cell Level*** |
HMFK03LST1 | 5:d814001b8aae | 487 | Cel_Level = (bz_faktor * (bz - bz_min) + bz_p_unten); //%Load aus Zellenspannung berechnen |
HMFK03LST1 | 3:af6a6f498276 | 488 | |
HMFK03LST1 | 3:af6a6f498276 | 489 | //***Regulate Cap´s Level*** |
HMFK03LST1 | 5:d814001b8aae | 490 | Cap_Level = (((cap / cap_max) * (cap_p_max - cap_p_min)) + cap_p_min); //%Load aus Cap Level |
HMFK03LST1 | 3:af6a6f498276 | 491 | |
HMFK03LST1 | 3:af6a6f498276 | 492 | //***Regulate Current Level*** |
HMFK03LST1 | 5:d814001b8aae | 493 | if (cap < cap_min) {power_up = 1;}; |
HMFK03LST1 | 5:d814001b8aae | 494 | if (cap > 0.9*cap_max){power_up = 0;}; |
HMFK03LST1 | 5:d814001b8aae | 495 | if ((current-(bz_current + (power_up * bz_cur_add))) > 0) |
HMFK03LST1 | 5:d814001b8aae | 496 | {if (Cur_Level > (bz_c_i_min)) Cur_Level--;} //to much Load |
HMFK03LST1 | 3:af6a6f498276 | 497 | else |
HMFK03LST1 | 5:d814001b8aae | 498 | {if (Cur_Level < (bz_c_i_max)) Cur_Level++;} //less Load |
HMFK03LST1 | 3:af6a6f498276 | 499 | |
HMFK03LST1 | 3:af6a6f498276 | 500 | //*** Sum all Regulators |
HMFK03LST1 | 3:af6a6f498276 | 501 | |
HMFK03LST1 | 4:8c89e422bed7 | 502 | Load_Level = Cur_Level; |
HMFK03LST1 | 4:8c89e422bed7 | 503 | Load_Level = Load_Level + Cap_Level; |
HMFK03LST1 | 4:8c89e422bed7 | 504 | Load_Level = Load_Level + Cel_Level; |
HMFK03LST1 | 5:d814001b8aae | 505 | if (Load_Level > 100) Load_Level = 100; |
HMFK03LST1 | 5:d814001b8aae | 506 | if (Load_Level < 0) Load_Level = 0; |
HMFK03LST1 | 2:bdd944abaf86 | 507 | |
HMFK03LST1 | 5:d814001b8aae | 508 | t.reset(); |
HMFK03LST1 | 5:d814001b8aae | 509 | |
HMFK03LST1 | 5:d814001b8aae | 510 | if (Load == true) // Laden aktiv |
HMFK03LST1 | 2:bdd944abaf86 | 511 | { |
HMFK03LST1 | 3:af6a6f498276 | 512 | |
HMFK03LST1 | 5:d814001b8aae | 513 | if (bz > bz_min || bz > bz_max) // Zelle über min. Spannung oder über max Spannung zum Entladen |
HMFK03LST1 | 2:bdd944abaf86 | 514 | { |
HMFK03LST1 | 5:d814001b8aae | 515 | while (t.read_us() <= pwm_cycle_count) // während der PWM (1khz Periode) |
HMFK03LST1 | 2:bdd944abaf86 | 516 | { |
HMFK03LST1 | 5:d814001b8aae | 517 | if (t.read_us() < Load_Level * 10000 / Regler_Hz) // %Load PWM zu Timer vergleich |
HMFK03LST1 | 5:d814001b8aae | 518 | {mosfet = mosfet_close;} // %Load PWM nicht erreicht Mosfet an |
HMFK03LST1 | 2:bdd944abaf86 | 519 | else |
HMFK03LST1 | 5:d814001b8aae | 520 | {mosfet = mosfet_open;} // %Load PWM erreicht Mosfet aus |
HMFK03LST1 | 2:bdd944abaf86 | 521 | } |
HMFK03LST1 | 2:bdd944abaf86 | 522 | } |
HMFK03LST1 | 2:bdd944abaf86 | 523 | else |
HMFK03LST1 | 2:bdd944abaf86 | 524 | { |
HMFK03LST1 | 5:d814001b8aae | 525 | mosfet = mosfet_open ; // Mosfet wegen Unterspannung BZ auskoppeln |
HMFK03LST1 | 5:d814001b8aae | 526 | Load = false; // Laden beenden bis BZ > BZ on (Sicherungsschaltung) |
HMFK03LST1 | 2:bdd944abaf86 | 527 | } |
HMFK03LST1 | 2:bdd944abaf86 | 528 | } |
HMFK03LST1 | 2:bdd944abaf86 | 529 | else |
HMFK03LST1 | 2:bdd944abaf86 | 530 | { |
HMFK03LST1 | 5:d814001b8aae | 531 | if (bz > cap + 0.5){mosfet = mosfet_open ;} // Mosfet im nicht Ladebetrieb auskoppeln |
HMFK03LST1 | 5:d814001b8aae | 532 | else {mosfet = mosfet_close;} // Mosfet im nicht Ladebetrieb einkoppeln (Treiber stromfrei = Stromsparen) |
HMFK03LST1 | 0:4f562ff70d13 | 533 | } |
HMFK03LST1 | 5:d814001b8aae | 534 | |
HMFK03LST1 | 5:d814001b8aae | 535 | |
HMFK03LST1 | 0:4f562ff70d13 | 536 | |
HMFK03LST1 | 5:d814001b8aae | 537 | if ((current < 0.2) && (Cur_Level > (0.9 * bz_c_i_max)) && (Load == true)){Load = false; load_fail = 100;} |
HMFK03LST1 | 5:d814001b8aae | 538 | |
HMFK03LST1 | 5:d814001b8aae | 539 | if (( cap < cap_min) && (bz > bz_on) && (Load == false)) |
HMFK03LST1 | 5:d814001b8aae | 540 | { |
HMFK03LST1 | 5:d814001b8aae | 541 | Load = true; |
HMFK03LST1 | 5:d814001b8aae | 542 | if (bz_c_i_min < 0) {Cur_Level = 2 * bz_c_i_min;}else {Cur_Level = -100;} // Cap unter Minimum oder BZ über Maximum = Laden beginnen / PWM vom Minimum Starten |
HMFK03LST1 | 5:d814001b8aae | 543 | } |
HMFK03LST1 | 5:d814001b8aae | 544 | |
HMFK03LST1 | 5:d814001b8aae | 545 | if ( bz > bz_max && load_fail == 0) Load = true; // Überladung abführen |
HMFK03LST1 | 5:d814001b8aae | 546 | |
HMFK03LST1 | 5:d814001b8aae | 547 | if (load_fail > 0){load_fail--;pump_on = false;} |
HMFK03LST1 | 5:d814001b8aae | 548 | |
HMFK03LST1 | 0:4f562ff70d13 | 549 | } |
HMFK03LST1 | 5:d814001b8aae | 550 | |
HMFK03LST1 | 0:4f562ff70d13 | 551 | } |