ediff iitb / Mbed 2 deprecated HIL_FMEA_oursteering

Dependencies:   mbed

Committer:
ediff_iitbracing
Date:
Wed Mar 06 19:20:02 2013 +0000
Revision:
2:eb4101b574bc
Parent:
1:fec1d091fa34
Test publish

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