ediff iitb / Mbed 2 deprecated HIL_FMEA_oursteering

Dependencies:   mbed

Committer:
ediff_iitbracing
Date:
Tue Mar 05 01:19:30 2013 +0000
Revision:
0:30ff725706d2
Child:
1:fec1d091fa34
05-03-2013, 06:51 - Cleaned up code a little. Added some comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ediff_iitbracing 0:30ff725706d2 1 #include "fmea.h"
ediff_iitbracing 0:30ff725706d2 2
ediff_iitbracing 0:30ff725706d2 3 //FMEA - Failure Mode Error Analysis codes.
ediff_iitbracing 0:30ff725706d2 4 //Checks involve the following sensors:
ediff_iitbracing 0:30ff725706d2 5 //LEFT THROTTLE, RIGHT THROTTLE,
ediff_iitbracing 0:30ff725706d2 6 //STEERING 1 (CAN Steering Sensor), STEERING 2 (Rotary Potentiometer),
ediff_iitbracing 0:30ff725706d2 7 //LEFT WHEEL RPM and RIGHT WHEEL RPM.
ediff_iitbracing 0:30ff725706d2 8
ediff_iitbracing 0:30ff725706d2 9 //FMEA parameters
ediff_iitbracing 0:30ff725706d2 10 const float steering_diff_limit = 7;
ediff_iitbracing 0:30ff725706d2 11 const float throttle_diff_limit = 0.5;
ediff_iitbracing 0:30ff725706d2 12 int fmea_recheck_iteration = 3;
ediff_iitbracing 0:30ff725706d2 13 float fmea_recheck_time = 0.3;
ediff_iitbracing 0:30ff725706d2 14
ediff_iitbracing 0:30ff725706d2 15 //FMEA counters/trackers
ediff_iitbracing 0:30ff725706d2 16 int flag_steering_comparison = 0;
ediff_iitbracing 0:30ff725706d2 17 int flag_throttle_comparison = 0;
ediff_iitbracing 0:30ff725706d2 18 int flag_steering2_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 19 int flag_rpm_Left_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 20 int flag_rpm_Right_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 21 int flag_throttle_Left_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 22 int flag_throttle_Right_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 23
ediff_iitbracing 0:30ff725706d2 24
ediff_iitbracing 0:30ff725706d2 25 //FMEA Flags
ediff_iitbracing 0:30ff725706d2 26 bool flag_use_openloop = false;
ediff_iitbracing 0:30ff725706d2 27 bool flag_use_steering = false;
ediff_iitbracing 0:30ff725706d2 28 bool flag_steering_use = false;
ediff_iitbracing 0:30ff725706d2 29
ediff_iitbracing 0:30ff725706d2 30 //Ticker for each FMEA function.
ediff_iitbracing 0:30ff725706d2 31 Ticker for_rpm_Left_pulldown_fmea;
ediff_iitbracing 0:30ff725706d2 32 Ticker for_rpm_Right_pulldown_fmea;
ediff_iitbracing 0:30ff725706d2 33 Ticker for_throttle_Left_pulldown_fmea;
ediff_iitbracing 0:30ff725706d2 34 Ticker for_throttle_Right_pulldown_fmea;
ediff_iitbracing 0:30ff725706d2 35 Ticker for_steering2_pulldown_fmea;
ediff_iitbracing 0:30ff725706d2 36
ediff_iitbracing 0:30ff725706d2 37 //Left RPM sensor fails. Sensor output is pulled down to zero.
ediff_iitbracing 0:30ff725706d2 38 void rpm_Left_pulldown_fmea()
ediff_iitbracing 0:30ff725706d2 39 {
ediff_iitbracing 0:30ff725706d2 40 for_rpm_Left_pulldown_fmea.detach();
ediff_iitbracing 0:30ff725706d2 41 if (rpm_Left <= dead_rpm)
ediff_iitbracing 0:30ff725706d2 42 {
ediff_iitbracing 0:30ff725706d2 43 flag_rpm_Left_pulldown++;
ediff_iitbracing 0:30ff725706d2 44 if (flag_rpm_Left_pulldown >= fmea_recheck_iteration)
ediff_iitbracing 0:30ff725706d2 45 {
ediff_iitbracing 0:30ff725706d2 46 flag_use_openloop = true;
ediff_iitbracing 0:30ff725706d2 47 return;
ediff_iitbracing 0:30ff725706d2 48 }
ediff_iitbracing 0:30ff725706d2 49 for_rpm_Left_pulldown_fmea.attach(&rpm_Left_pulldown_fmea,fmea_recheck_time);
ediff_iitbracing 0:30ff725706d2 50 }
ediff_iitbracing 0:30ff725706d2 51 else
ediff_iitbracing 0:30ff725706d2 52 {
ediff_iitbracing 0:30ff725706d2 53 flag_rpm_Left_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 54 }
ediff_iitbracing 0:30ff725706d2 55 }
ediff_iitbracing 0:30ff725706d2 56
ediff_iitbracing 0:30ff725706d2 57 //Right RPM sensor fails. Sensor output is pulled down to zero.
ediff_iitbracing 0:30ff725706d2 58 void rpm_Right_pulldown_fmea()
ediff_iitbracing 0:30ff725706d2 59 {
ediff_iitbracing 0:30ff725706d2 60 for_rpm_Right_pulldown_fmea.detach();
ediff_iitbracing 0:30ff725706d2 61 if (rpm_Right <= dead_rpm)
ediff_iitbracing 0:30ff725706d2 62 {
ediff_iitbracing 0:30ff725706d2 63 flag_rpm_Right_pulldown++;
ediff_iitbracing 0:30ff725706d2 64 if (flag_rpm_Right_pulldown >= fmea_recheck_iteration)
ediff_iitbracing 0:30ff725706d2 65 {
ediff_iitbracing 0:30ff725706d2 66 flag_use_openloop = true;
ediff_iitbracing 0:30ff725706d2 67 return;
ediff_iitbracing 0:30ff725706d2 68 }
ediff_iitbracing 0:30ff725706d2 69 for_rpm_Right_pulldown_fmea.attach(&rpm_Right_pulldown_fmea,fmea_recheck_time);
ediff_iitbracing 0:30ff725706d2 70 }
ediff_iitbracing 0:30ff725706d2 71 else
ediff_iitbracing 0:30ff725706d2 72 {
ediff_iitbracing 0:30ff725706d2 73 flag_rpm_Right_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 74 }
ediff_iitbracing 0:30ff725706d2 75 }
ediff_iitbracing 0:30ff725706d2 76
ediff_iitbracing 0:30ff725706d2 77 //Left Throttle sensor fails. Sensor output is pulled down to zero.
ediff_iitbracing 0:30ff725706d2 78 void throttle_Left_pulldown_fmea()
ediff_iitbracing 0:30ff725706d2 79 {
ediff_iitbracing 0:30ff725706d2 80 for_throttle_Left_pulldown_fmea.detach();
ediff_iitbracing 0:30ff725706d2 81 if (throttle_Left < 0.1)
ediff_iitbracing 0:30ff725706d2 82 {
ediff_iitbracing 0:30ff725706d2 83 flag_throttle_Left_pulldown++;
ediff_iitbracing 0:30ff725706d2 84 if (flag_throttle_Left_pulldown >= fmea_recheck_iteration)
ediff_iitbracing 0:30ff725706d2 85 {
ediff_iitbracing 0:30ff725706d2 86 shutdown = true;
ediff_iitbracing 0:30ff725706d2 87 return;
ediff_iitbracing 0:30ff725706d2 88 }
ediff_iitbracing 0:30ff725706d2 89 for_throttle_Left_pulldown_fmea.attach(&rpm_Left_pulldown_fmea,fmea_recheck_time);
ediff_iitbracing 0:30ff725706d2 90 }
ediff_iitbracing 0:30ff725706d2 91 else
ediff_iitbracing 0:30ff725706d2 92 {
ediff_iitbracing 0:30ff725706d2 93 flag_throttle_Left_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 94 }
ediff_iitbracing 0:30ff725706d2 95 }
ediff_iitbracing 0:30ff725706d2 96
ediff_iitbracing 0:30ff725706d2 97 //Right Throttle sensor fails. Sensor output is pulled down to zero.
ediff_iitbracing 0:30ff725706d2 98 void throttle_Right_pulldown_fmea()
ediff_iitbracing 0:30ff725706d2 99 {
ediff_iitbracing 0:30ff725706d2 100 for_throttle_Right_pulldown_fmea.detach();
ediff_iitbracing 0:30ff725706d2 101 if (throttle_Right < 0.1)
ediff_iitbracing 0:30ff725706d2 102 {
ediff_iitbracing 0:30ff725706d2 103 flag_throttle_Right_pulldown++;
ediff_iitbracing 0:30ff725706d2 104 if (flag_throttle_Right_pulldown >= fmea_recheck_iteration)
ediff_iitbracing 0:30ff725706d2 105 {
ediff_iitbracing 0:30ff725706d2 106 shutdown = true;
ediff_iitbracing 0:30ff725706d2 107 return;
ediff_iitbracing 0:30ff725706d2 108 }
ediff_iitbracing 0:30ff725706d2 109 for_throttle_Right_pulldown_fmea.attach(&rpm_Right_pulldown_fmea,fmea_recheck_time);
ediff_iitbracing 0:30ff725706d2 110 }
ediff_iitbracing 0:30ff725706d2 111 else
ediff_iitbracing 0:30ff725706d2 112 {
ediff_iitbracing 0:30ff725706d2 113 flag_throttle_Right_pulldown = 0;
ediff_iitbracing 0:30ff725706d2 114 return;
ediff_iitbracing 0:30ff725706d2 115 }
ediff_iitbracing 0:30ff725706d2 116 }
ediff_iitbracing 0:30ff725706d2 117
ediff_iitbracing 0:30ff725706d2 118 //Steering Sensor 2 (Potentiometer) fails. Sensor output is pulled down to zero.
ediff_iitbracing 0:30ff725706d2 119 void steering2_pulldown_fmea()
ediff_iitbracing 0:30ff725706d2 120 {
ediff_iitbracing 0:30ff725706d2 121 for_steering2_pulldown_fmea.detach();
ediff_iitbracing 0:30ff725706d2 122 if (steering2 < 0.1)
ediff_iitbracing 0:30ff725706d2 123 {
ediff_iitbracing 0:30ff725706d2 124 flag_steering2_pulldown++;
ediff_iitbracing 0:30ff725706d2 125 if (flag_steering2_pulldown >= fmea_recheck_iteration)
ediff_iitbracing 0:30ff725706d2 126 {
ediff_iitbracing 0:30ff725706d2 127 flag_use_steering = true;
ediff_iitbracing 0:30ff725706d2 128 return;
ediff_iitbracing 0:30ff725706d2 129 }
ediff_iitbracing 0:30ff725706d2 130 for_steering2_pulldown_fmea.attach(&steering2_pulldown_fmea,fmea_recheck_time);
ediff_iitbracing 0:30ff725706d2 131 }
ediff_iitbracing 0:30ff725706d2 132 else
ediff_iitbracing 0:30ff725706d2 133 {
ediff_iitbracing 0:30ff725706d2 134 shutdown = true;
ediff_iitbracing 0:30ff725706d2 135 return;
ediff_iitbracing 0:30ff725706d2 136 }
ediff_iitbracing 0:30ff725706d2 137 }
ediff_iitbracing 0:30ff725706d2 138
ediff_iitbracing 0:30ff725706d2 139 //Check for consistency of the two differently obtained steering values.
ediff_iitbracing 0:30ff725706d2 140 void steering_comparison_fmea()
ediff_iitbracing 0:30ff725706d2 141 {
ediff_iitbracing 0:30ff725706d2 142 if (!flag_use_steering)
ediff_iitbracing 0:30ff725706d2 143 {
ediff_iitbracing 0:30ff725706d2 144 if (abs(steering2-steering) > steering_diff_limit)
ediff_iitbracing 0:30ff725706d2 145 {
ediff_iitbracing 0:30ff725706d2 146 flag_steering_comparison++;
ediff_iitbracing 0:30ff725706d2 147 if (flag_steering_comparison >= fmea_recheck_iteration)
ediff_iitbracing 0:30ff725706d2 148 {
ediff_iitbracing 0:30ff725706d2 149 steering2_pulldown_fmea();
ediff_iitbracing 0:30ff725706d2 150 }
ediff_iitbracing 0:30ff725706d2 151 steering_comparison_fmea();
ediff_iitbracing 0:30ff725706d2 152 }
ediff_iitbracing 0:30ff725706d2 153 else
ediff_iitbracing 0:30ff725706d2 154 {
ediff_iitbracing 0:30ff725706d2 155 flag_steering_comparison = 0;
ediff_iitbracing 0:30ff725706d2 156 }
ediff_iitbracing 0:30ff725706d2 157 }
ediff_iitbracing 0:30ff725706d2 158 }
ediff_iitbracing 0:30ff725706d2 159
ediff_iitbracing 0:30ff725706d2 160 //Check for consistency of the two differently obtained throttle values.
ediff_iitbracing 0:30ff725706d2 161 void throttle_comparison_fmea()
ediff_iitbracing 0:30ff725706d2 162 {
ediff_iitbracing 0:30ff725706d2 163 if (abs(throttle2-throttle) > throttle_diff_limit)
ediff_iitbracing 0:30ff725706d2 164 {
ediff_iitbracing 0:30ff725706d2 165 shutdown = true;
ediff_iitbracing 0:30ff725706d2 166 }
ediff_iitbracing 0:30ff725706d2 167 }