Vorlage für Projekt

Dependencies:   CD4052 COUNTER RC_PWM Telemetrie_eth_h2m1 mbed

Committer:
HMFK03LST1
Date:
Thu Nov 09 14:03:05 2017 +0000
Revision:
2:c2193c6cdf53
Parent:
0:d621f13db8c0
Vorlage f?r Projekt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HMFK03LST1 0:d621f13db8c0 1 #include "mbed.h"
HMFK03LST1 0:d621f13db8c0 2 #include "components.h"
HMFK03LST1 0:d621f13db8c0 3 #include "CD4052.h"
HMFK03LST1 0:d621f13db8c0 4 #include "Telemetry.h"
HMFK03LST1 0:d621f13db8c0 5 #include "counter.h"
HMFK03LST1 0:d621f13db8c0 6 #include "rc_pwm.h"
HMFK03LST1 0:d621f13db8c0 7
HMFK03LST1 0:d621f13db8c0 8 #define M_PI 3.1415926
HMFK03LST1 0:d621f13db8c0 9
HMFK03LST1 0:d621f13db8c0 10 DigitalOut myled(LED1);
HMFK03LST1 0:d621f13db8c0 11 CD4052 mp(p22, p21, p19, p20);
HMFK03LST1 0:d621f13db8c0 12 Serial debug(USBTX, USBRX);
HMFK03LST1 0:d621f13db8c0 13 Telemetry Network(p29,p30);
HMFK03LST1 0:d621f13db8c0 14 Ticker data_out;
HMFK03LST1 0:d621f13db8c0 15 Ticker slow_timer;
HMFK03LST1 0:d621f13db8c0 16 Ticker fast_timer;
HMFK03LST1 0:d621f13db8c0 17 Counter rpm_c(p23);
HMFK03LST1 0:d621f13db8c0 18 RC_PWM emc(p21);
HMFK03LST1 0:d621f13db8c0 19
HMFK03LST1 0:d621f13db8c0 20
HMFK03LST1 0:d621f13db8c0 21
HMFK03LST1 0:d621f13db8c0 22 char CTL_SRV[] = "192.168.0.15";
HMFK03LST1 0:d621f13db8c0 23 int CTL_PORT = 42042;
HMFK03LST1 0:d621f13db8c0 24 char DB_SERVER[] = "141.39.249.90";
HMFK03LST1 0:d621f13db8c0 25 int DB_PORT = 8887;
HMFK03LST1 0:d621f13db8c0 26
HMFK03LST1 0:d621f13db8c0 27 Endpoint CTL_Server;
HMFK03LST1 0:d621f13db8c0 28 Endpoint DB_Server;
HMFK03LST1 0:d621f13db8c0 29
HMFK03LST1 0:d621f13db8c0 30
HMFK03LST1 0:d621f13db8c0 31 int count;
HMFK03LST1 0:d621f13db8c0 32
HMFK03LST1 0:d621f13db8c0 33
HMFK03LST1 0:d621f13db8c0 34
HMFK03LST1 0:d621f13db8c0 35 void set_sys(void)
HMFK03LST1 0:d621f13db8c0 36 {
HMFK03LST1 0:d621f13db8c0 37 sys.version = 10;
HMFK03LST1 0:d621f13db8c0 38 sys.blade = 2;
HMFK03LST1 0:d621f13db8c0 39 sys.Amax = 25;
HMFK03LST1 0:d621f13db8c0 40 sys.RPMmax = 2000;
HMFK03LST1 0:d621f13db8c0 41 sys.PWMmax = 1900;
HMFK03LST1 0:d621f13db8c0 42 sys.PWMmin = 900;
HMFK03LST1 0:d621f13db8c0 43 sys.t_eng_max = 68;
HMFK03LST1 0:d621f13db8c0 44 sys.air_ro = 1.185 * 10000;
HMFK03LST1 0:d621f13db8c0 45 sys.pwm = 0;
HMFK03LST1 0:d621f13db8c0 46
HMFK03LST1 0:d621f13db8c0 47 emc.min = sys.PWMmin;
HMFK03LST1 0:d621f13db8c0 48 emc.max = sys.PWMmax;
HMFK03LST1 0:d621f13db8c0 49 }
HMFK03LST1 0:d621f13db8c0 50
HMFK03LST1 0:d621f13db8c0 51 void set_cal(void)
HMFK03LST1 0:d621f13db8c0 52 {
HMFK03LST1 0:d621f13db8c0 53 cal.thrust_o = -4 ;
HMFK03LST1 0:d621f13db8c0 54 cal.thrust_s = 0.080 ;
HMFK03LST1 0:d621f13db8c0 55 cal.torque_o = -4 ;
HMFK03LST1 0:d621f13db8c0 56 cal.torque_s = 0.080 ;
HMFK03LST1 0:d621f13db8c0 57 cal.voltage_o = -52 ;
HMFK03LST1 0:d621f13db8c0 58 cal.voltage_s = 0.4290 ;
HMFK03LST1 0:d621f13db8c0 59 cal.current_o = -10650 ;
HMFK03LST1 0:d621f13db8c0 60 cal.current_s = 1.352 ;
HMFK03LST1 0:d621f13db8c0 61 cal.p_prop_o = -8700 ;
HMFK03LST1 0:d621f13db8c0 62 cal.p_prop_s = 0.263 ;
HMFK03LST1 0:d621f13db8c0 63 cal.p_tunnel_o = -8690 ;
HMFK03LST1 0:d621f13db8c0 64 cal.p_tunnel_s = 0.263 ;
HMFK03LST1 0:d621f13db8c0 65 cal.temp_eng_o = -3435 ;
HMFK03LST1 0:d621f13db8c0 66 cal.temp_eng_s = 0.081 ;
HMFK03LST1 0:d621f13db8c0 67 cal.temp_air_o = -3490 ;
HMFK03LST1 0:d621f13db8c0 68 cal.temp_air_s = 0.081 ;
HMFK03LST1 0:d621f13db8c0 69 }
HMFK03LST1 0:d621f13db8c0 70
HMFK03LST1 0:d621f13db8c0 71
HMFK03LST1 0:d621f13db8c0 72
HMFK03LST1 0:d621f13db8c0 73
HMFK03LST1 0:d621f13db8c0 74
HMFK03LST1 0:d621f13db8c0 75 //Helpscreen output
HMFK03LST1 0:d621f13db8c0 76 void help()
HMFK03LST1 0:d621f13db8c0 77 {
HMFK03LST1 0:d621f13db8c0 78 debug.printf("\n*** V %.1f ***\r\n",(float)sys.version/10);
HMFK03LST1 0:d621f13db8c0 79 debug.printf("*** Motor Test command***\r\n\n");
HMFK03LST1 0:d621f13db8c0 80 debug.printf("M = Messure ON\r\n");
HMFK03LST1 0:d621f13db8c0 81 debug.printf("A = Messure OFF\r\n");
HMFK03LST1 0:d621f13db8c0 82 debug.printf("R = Run\r\n");
HMFK03LST1 0:d621f13db8c0 83 debug.printf("S = Stop\r\n");
HMFK03LST1 0:d621f13db8c0 84 }
HMFK03LST1 0:d621f13db8c0 85
HMFK03LST1 0:d621f13db8c0 86
HMFK03LST1 0:d621f13db8c0 87 void get_input()
HMFK03LST1 0:d621f13db8c0 88 {
HMFK03LST1 0:d621f13db8c0 89 char wert;
HMFK03LST1 0:d621f13db8c0 90
HMFK03LST1 0:d621f13db8c0 91 while (debug.readable() == true)
HMFK03LST1 0:d621f13db8c0 92 {
HMFK03LST1 0:d621f13db8c0 93 wert = debug.getc();
HMFK03LST1 0:d621f13db8c0 94 switch(wert)
HMFK03LST1 0:d621f13db8c0 95 {
HMFK03LST1 0:d621f13db8c0 96 case 'M': sys.do_measure = true;
HMFK03LST1 0:d621f13db8c0 97 break;
HMFK03LST1 0:d621f13db8c0 98 case 'A': sys.do_measure = false;
HMFK03LST1 0:d621f13db8c0 99 break;
HMFK03LST1 0:d621f13db8c0 100 case 'R': sys.run = true;
HMFK03LST1 0:d621f13db8c0 101 break;
HMFK03LST1 0:d621f13db8c0 102 case 'S': sys.run = false;
HMFK03LST1 0:d621f13db8c0 103 sys.pwm = 0;
HMFK03LST1 0:d621f13db8c0 104 break;
HMFK03LST1 0:d621f13db8c0 105 case '0': cal.thrust_o = cal.thrust_o - raw.thrust;
HMFK03LST1 0:d621f13db8c0 106 break;
HMFK03LST1 0:d621f13db8c0 107 case '9': cal.thrust_s = cal.thrust_s * (850 / raw.thrust);
HMFK03LST1 0:d621f13db8c0 108 break;
HMFK03LST1 0:d621f13db8c0 109 case 'c': //save sys
HMFK03LST1 0:d621f13db8c0 110 break;
HMFK03LST1 0:d621f13db8c0 111 default : help();
HMFK03LST1 0:d621f13db8c0 112
HMFK03LST1 0:d621f13db8c0 113 }
HMFK03LST1 0:d621f13db8c0 114 }
HMFK03LST1 0:d621f13db8c0 115 }
HMFK03LST1 0:d621f13db8c0 116
HMFK03LST1 0:d621f13db8c0 117
HMFK03LST1 0:d621f13db8c0 118 void read_values(void)
HMFK03LST1 0:d621f13db8c0 119 {
HMFK03LST1 0:d621f13db8c0 120 mp.channel(0);
HMFK03LST1 0:d621f13db8c0 121 raw.thrust = (mp.x_i() * cal.thrust_s ) + cal.thrust_o ;
HMFK03LST1 0:d621f13db8c0 122 raw.p_prop = (mp.y_i() * cal.p_prop_s ) + cal.p_prop_o ;
HMFK03LST1 0:d621f13db8c0 123 wait_us(50);
HMFK03LST1 0:d621f13db8c0 124 mp.channel(1);
HMFK03LST1 0:d621f13db8c0 125 raw.torque = (mp.x_i() * cal.torque_s ) + cal.torque_o ;
HMFK03LST1 0:d621f13db8c0 126 raw.p_tunnel = (mp.y_i() * cal.p_tunnel_s) + cal.p_tunnel_o;
HMFK03LST1 0:d621f13db8c0 127 wait_us(50);
HMFK03LST1 0:d621f13db8c0 128 mp.channel(2);
HMFK03LST1 0:d621f13db8c0 129 raw.current = (mp.x_i() * cal.current_s ) + cal.current_o ;
HMFK03LST1 0:d621f13db8c0 130 raw.temp_air = (mp.y_i() * cal.temp_air_s) + cal.temp_air_o ;
HMFK03LST1 0:d621f13db8c0 131 wait_us(50);
HMFK03LST1 0:d621f13db8c0 132 mp.channel(3);
HMFK03LST1 0:d621f13db8c0 133 raw.voltage = (mp.x_i() * cal.voltage_s ) + cal.voltage_o ;
HMFK03LST1 0:d621f13db8c0 134 raw.temp_eng = (mp.y_i() * cal.temp_eng_s) + cal.temp_eng_o ;
HMFK03LST1 0:d621f13db8c0 135
HMFK03LST1 0:d621f13db8c0 136 }
HMFK03LST1 0:d621f13db8c0 137
HMFK03LST1 0:d621f13db8c0 138 void calc_values(void)
HMFK03LST1 0:d621f13db8c0 139 {
HMFK03LST1 0:d621f13db8c0 140 raw.power_in = (float)raw.voltage / 100 * (float)raw.current / 100 ;
HMFK03LST1 0:d621f13db8c0 141 if (raw.power_in == 0) raw.power_in = 1;
HMFK03LST1 0:d621f13db8c0 142 raw.power_out = (float)raw.torque / 500 * (float)raw.rpm / 60 * M_PI ; // P = 2*Pi* RPS * M
HMFK03LST1 0:d621f13db8c0 143 raw.eta = (float)raw.power_out / (float)raw.power_in * 1000 ;
HMFK03LST1 0:d621f13db8c0 144 raw.thrust_eff= (float)raw.thrust / (float)raw.power_in * 100 ;
HMFK03LST1 0:d621f13db8c0 145 raw.air_ro = sys.air_ro ;
HMFK03LST1 0:d621f13db8c0 146 raw.v_prop = sqrt((float)raw.p_prop) * 20000 / raw.air_ro ;
HMFK03LST1 0:d621f13db8c0 147 raw.v_tunnel = sqrt((float)raw.p_tunnel) * 20000 / raw.air_ro ;
HMFK03LST1 0:d621f13db8c0 148 }
HMFK03LST1 0:d621f13db8c0 149
HMFK03LST1 0:d621f13db8c0 150 void midd_values(void)
HMFK03LST1 0:d621f13db8c0 151 {
HMFK03LST1 0:d621f13db8c0 152 values.thrust = values.thrust + ((float)raw.thrust / 100 - values.thrust ) / 100;
HMFK03LST1 0:d621f13db8c0 153 values.torque = values.torque + ((float)raw.torque / 1000 - values.torque ) / 100;
HMFK03LST1 0:d621f13db8c0 154 values.voltage = values.voltage + ((float)raw.voltage / 1000 - values.voltage ) / 100;
HMFK03LST1 0:d621f13db8c0 155 values.current = values.current + ((float)raw.current / 1000 - values.current ) / 100;
HMFK03LST1 0:d621f13db8c0 156 values.power_in = values.power_in + ((float)raw.power_in / 100 - values.power_in ) / 100;
HMFK03LST1 0:d621f13db8c0 157 values.power_out = values.power_out + ((float)raw.power_out / 100 - values.power_out ) / 100;
HMFK03LST1 0:d621f13db8c0 158 values.eta = values.eta + ((float)raw.eta / 10 - values.eta ) / 100;
HMFK03LST1 0:d621f13db8c0 159 values.thrust_eff = values.thrust_eff + ((float)raw.thrust_eff / 100 - values.thrust_eff) / 100;
HMFK03LST1 0:d621f13db8c0 160 values.p_prop = values.p_prop + ((float)raw.p_prop - values.p_prop ) / 100;
HMFK03LST1 0:d621f13db8c0 161 values.p_tunnel = values.p_tunnel + ((float)raw.p_tunnel - values.p_tunnel ) / 100;
HMFK03LST1 0:d621f13db8c0 162 values.v_prop = values.v_prop + ((float)raw.v_prop / 10 - values.v_prop ) / 100;
HMFK03LST1 0:d621f13db8c0 163 values.v_tunnel = values.v_tunnel + ((float)raw.v_tunnel / 10 - values.v_tunnel ) / 100;
HMFK03LST1 0:d621f13db8c0 164 values.temp_eng = values.temp_eng + ((float)raw.temp_eng / 10 - values.temp_eng ) / 100;
HMFK03LST1 0:d621f13db8c0 165 values.temp_air = values.temp_air + ((float)raw.temp_air / 10 - values.temp_air ) / 100;
HMFK03LST1 0:d621f13db8c0 166 values.rpm = values.rpm + ((float)raw.rpm - values.rpm ) / 8;
HMFK03LST1 0:d621f13db8c0 167 }
HMFK03LST1 0:d621f13db8c0 168
HMFK03LST1 0:d621f13db8c0 169
HMFK03LST1 0:d621f13db8c0 170 void tick_fast(void){
HMFK03LST1 0:d621f13db8c0 171 sys.do_time = true;
HMFK03LST1 0:d621f13db8c0 172 }
HMFK03LST1 0:d621f13db8c0 173
HMFK03LST1 0:d621f13db8c0 174
HMFK03LST1 0:d621f13db8c0 175 void get_data(void){
HMFK03LST1 0:d621f13db8c0 176 if (sys.do_measure == 1)
HMFK03LST1 0:d621f13db8c0 177 {
HMFK03LST1 0:d621f13db8c0 178 sys.measure++;
HMFK03LST1 0:d621f13db8c0 179 switch(sys.measure%4){
HMFK03LST1 0:d621f13db8c0 180 case 0: break;
HMFK03LST1 0:d621f13db8c0 181 case 1: break; //stabilize
HMFK03LST1 0:d621f13db8c0 182 case 2: break; //stabilize
HMFK03LST1 0:d621f13db8c0 183 case 3: sys.measure = 0;
HMFK03LST1 0:d621f13db8c0 184 sys.pwm = sys.pwm + 1;
HMFK03LST1 0:d621f13db8c0 185 break;
HMFK03LST1 0:d621f13db8c0 186 }
HMFK03LST1 0:d621f13db8c0 187 }
HMFK03LST1 0:d621f13db8c0 188 else {sys.measure = 0;}
HMFK03LST1 0:d621f13db8c0 189 }
HMFK03LST1 0:d621f13db8c0 190
HMFK03LST1 0:d621f13db8c0 191
HMFK03LST1 0:d621f13db8c0 192 void do_limit(void){
HMFK03LST1 0:d621f13db8c0 193
HMFK03LST1 0:d621f13db8c0 194 if (values.current > sys.Amax){ //Limit current
HMFK03LST1 0:d621f13db8c0 195 if (sys.C_limit == 1){
HMFK03LST1 0:d621f13db8c0 196 sys.do_measure = 0;
HMFK03LST1 0:d621f13db8c0 197 sys.pwm = 16;
HMFK03LST1 0:d621f13db8c0 198 debug.printf("\n\r!!Overcurrent Shutdown!!\n\r");
HMFK03LST1 0:d621f13db8c0 199 }
HMFK03LST1 0:d621f13db8c0 200 sys.C_limit = 1;
HMFK03LST1 0:d621f13db8c0 201 }
HMFK03LST1 0:d621f13db8c0 202 else
HMFK03LST1 0:d621f13db8c0 203 {sys.C_limit = 0;}
HMFK03LST1 0:d621f13db8c0 204
HMFK03LST1 0:d621f13db8c0 205
HMFK03LST1 0:d621f13db8c0 206 if (values.rpm > sys.RPMmax){ //Limit RPM
HMFK03LST1 0:d621f13db8c0 207 if (sys.RPM_limit == 1){
HMFK03LST1 0:d621f13db8c0 208 sys.do_measure = 0;
HMFK03LST1 0:d621f13db8c0 209 sys.pwm = 16;
HMFK03LST1 0:d621f13db8c0 210 debug.printf("\n\r!!Overrun Shutdown!!\n\r");
HMFK03LST1 0:d621f13db8c0 211 }
HMFK03LST1 0:d621f13db8c0 212 sys.RPM_limit = 1;
HMFK03LST1 0:d621f13db8c0 213 }
HMFK03LST1 0:d621f13db8c0 214 else
HMFK03LST1 0:d621f13db8c0 215 {sys.RPM_limit = 0;}
HMFK03LST1 0:d621f13db8c0 216
HMFK03LST1 0:d621f13db8c0 217
HMFK03LST1 0:d621f13db8c0 218 if (values.temp_eng > sys.t_eng_max){ //Limit Temp
HMFK03LST1 0:d621f13db8c0 219 if (sys.T_limit == 1){
HMFK03LST1 0:d621f13db8c0 220 sys.do_measure = 0;
HMFK03LST1 0:d621f13db8c0 221 sys.pwm = 16;
HMFK03LST1 0:d621f13db8c0 222 debug.printf("\n\r!!Overtemp Shutdown!!\n\r");
HMFK03LST1 0:d621f13db8c0 223 }
HMFK03LST1 0:d621f13db8c0 224 sys.T_limit = 1;
HMFK03LST1 0:d621f13db8c0 225 }
HMFK03LST1 0:d621f13db8c0 226 else
HMFK03LST1 0:d621f13db8c0 227 {sys.T_limit = 0;}
HMFK03LST1 0:d621f13db8c0 228
HMFK03LST1 0:d621f13db8c0 229 }
HMFK03LST1 0:d621f13db8c0 230
HMFK03LST1 0:d621f13db8c0 231
HMFK03LST1 0:d621f13db8c0 232
HMFK03LST1 0:d621f13db8c0 233 void timetable(void){
HMFK03LST1 0:d621f13db8c0 234 sys.fast++;
HMFK03LST1 0:d621f13db8c0 235 switch(sys.fast%4){ // every 1 ms
HMFK03LST1 0:d621f13db8c0 236 case 1: read_values();
HMFK03LST1 0:d621f13db8c0 237 break;
HMFK03LST1 0:d621f13db8c0 238 case 2: calc_values();
HMFK03LST1 0:d621f13db8c0 239 break;
HMFK03LST1 0:d621f13db8c0 240 case 3: midd_values();
HMFK03LST1 0:d621f13db8c0 241 break;
HMFK03LST1 0:d621f13db8c0 242 }
HMFK03LST1 0:d621f13db8c0 243
HMFK03LST1 0:d621f13db8c0 244 if (0 == sys.fast%100){ // every 100 ms
HMFK03LST1 0:d621f13db8c0 245 sys.slow++;
HMFK03LST1 0:d621f13db8c0 246
HMFK03LST1 0:d621f13db8c0 247 do_limit(); //Limit RPM and Current on every slow loop
HMFK03LST1 0:d621f13db8c0 248
HMFK03LST1 0:d621f13db8c0 249 switch(sys.slow%10){
HMFK03LST1 0:d621f13db8c0 250 case 0: emc.set(sys.pwm);
HMFK03LST1 0:d621f13db8c0 251 break;
HMFK03LST1 0:d621f13db8c0 252 case 1: raw.rpm = rpm_c.cps * 60 / sys.blade ;
HMFK03LST1 0:d621f13db8c0 253 break;
HMFK03LST1 0:d621f13db8c0 254 case 2: debug.printf("RPM: %05d mid: %05d\n\r",raw.rpm,values.rpm);
HMFK03LST1 0:d621f13db8c0 255 break;
HMFK03LST1 0:d621f13db8c0 256 case 3: if ( sys.run == true){if ((values.rpm < 200) && (sys.pwm < 16)) sys.pwm++;} //
HMFK03LST1 0:d621f13db8c0 257 if ((sys.run == true) && (sys.do_measure == false)){if (values.rpm > 240) sys.pwm--;}
HMFK03LST1 0:d621f13db8c0 258 break;
HMFK03LST1 0:d621f13db8c0 259 case 9: get_data();
HMFK03LST1 0:d621f13db8c0 260 break;
HMFK03LST1 0:d621f13db8c0 261
HMFK03LST1 0:d621f13db8c0 262 }
HMFK03LST1 0:d621f13db8c0 263 }
HMFK03LST1 0:d621f13db8c0 264 }
HMFK03LST1 0:d621f13db8c0 265
HMFK03LST1 0:d621f13db8c0 266
HMFK03LST1 0:d621f13db8c0 267 int main() {
HMFK03LST1 0:d621f13db8c0 268 debug.baud(115200);
HMFK03LST1 0:d621f13db8c0 269 //Network.InitEthernetConnection();
HMFK03LST1 0:d621f13db8c0 270 //Network.ConnectSocket_UDP_Client();
HMFK03LST1 0:d621f13db8c0 271 CTL_Server.set_address(CTL_SRV, CTL_PORT);
HMFK03LST1 0:d621f13db8c0 272 DB_Server.set_address(DB_SERVER, DB_PORT);
HMFK03LST1 0:d621f13db8c0 273 fast_timer.attach(&tick_fast,0.001);
HMFK03LST1 0:d621f13db8c0 274 set_sys();
HMFK03LST1 0:d621f13db8c0 275 set_cal();
HMFK03LST1 0:d621f13db8c0 276
HMFK03LST1 0:d621f13db8c0 277 while(1) {
HMFK03LST1 0:d621f13db8c0 278
HMFK03LST1 0:d621f13db8c0 279 if(sys.do_time){
HMFK03LST1 0:d621f13db8c0 280 timetable();
HMFK03LST1 0:d621f13db8c0 281 sys.do_time = false;
HMFK03LST1 0:d621f13db8c0 282 }
HMFK03LST1 0:d621f13db8c0 283 }
HMFK03LST1 0:d621f13db8c0 284 }