Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
fmea.cpp@1:fec1d091fa34, 2013-03-06 (annotated)
- Committer:
- ediff_iitbracing
- Date:
- Wed Mar 06 13:58:03 2013 +0000
- Revision:
- 1:fec1d091fa34
- Parent:
- 0:30ff725706d2
- Child:
- 2:eb4101b574bc
06-03-2013, 19:29 BackUp
Who changed what in which revision?
User | Revision | Line number | New 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 | 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 | bool flag_steering_use = false; |
ediff_iitbracing | 0:30ff725706d2 | 28 | |
ediff_iitbracing | 0:30ff725706d2 | 29 | //Ticker for each FMEA function. |
ediff_iitbracing | 0:30ff725706d2 | 30 | Ticker for_rpm_Left_pulldown_fmea; |
ediff_iitbracing | 0:30ff725706d2 | 31 | Ticker for_rpm_Right_pulldown_fmea; |
ediff_iitbracing | 0:30ff725706d2 | 32 | Ticker for_throttle_Left_pulldown_fmea; |
ediff_iitbracing | 0:30ff725706d2 | 33 | Ticker for_throttle_Right_pulldown_fmea; |
ediff_iitbracing | 0:30ff725706d2 | 34 | Ticker for_steering2_pulldown_fmea; |
ediff_iitbracing | 1:fec1d091fa34 | 35 | Ticker for_steering_comparison_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 | } |
ediff_iitbracing | 0:30ff725706d2 | 115 | } |
ediff_iitbracing | 0:30ff725706d2 | 116 | |
ediff_iitbracing | 0:30ff725706d2 | 117 | //Steering Sensor 2 (Potentiometer) fails. Sensor output is pulled down to zero. |
ediff_iitbracing | 0:30ff725706d2 | 118 | void steering2_pulldown_fmea() |
ediff_iitbracing | 0:30ff725706d2 | 119 | { |
ediff_iitbracing | 0:30ff725706d2 | 120 | for_steering2_pulldown_fmea.detach(); |
ediff_iitbracing | 0:30ff725706d2 | 121 | if (steering2 < 0.1) |
ediff_iitbracing | 0:30ff725706d2 | 122 | { |
ediff_iitbracing | 0:30ff725706d2 | 123 | flag_steering2_pulldown++; |
ediff_iitbracing | 0:30ff725706d2 | 124 | if (flag_steering2_pulldown >= fmea_recheck_iteration) |
ediff_iitbracing | 0:30ff725706d2 | 125 | { |
ediff_iitbracing | 0:30ff725706d2 | 126 | flag_use_steering = true; |
ediff_iitbracing | 0:30ff725706d2 | 127 | return; |
ediff_iitbracing | 0:30ff725706d2 | 128 | } |
ediff_iitbracing | 0:30ff725706d2 | 129 | for_steering2_pulldown_fmea.attach(&steering2_pulldown_fmea,fmea_recheck_time); |
ediff_iitbracing | 0:30ff725706d2 | 130 | } |
ediff_iitbracing | 0:30ff725706d2 | 131 | else |
ediff_iitbracing | 0:30ff725706d2 | 132 | { |
ediff_iitbracing | 0:30ff725706d2 | 133 | shutdown = true; |
ediff_iitbracing | 0:30ff725706d2 | 134 | } |
ediff_iitbracing | 0:30ff725706d2 | 135 | } |
ediff_iitbracing | 0:30ff725706d2 | 136 | |
ediff_iitbracing | 0:30ff725706d2 | 137 | //Check for consistency of the two differently obtained steering values. |
ediff_iitbracing | 0:30ff725706d2 | 138 | void steering_comparison_fmea() |
ediff_iitbracing | 0:30ff725706d2 | 139 | { |
ediff_iitbracing | 0:30ff725706d2 | 140 | if (!flag_use_steering) |
ediff_iitbracing | 0:30ff725706d2 | 141 | { |
ediff_iitbracing | 1:fec1d091fa34 | 142 | for_steering_comparison_fmea.detach(); |
ediff_iitbracing | 0:30ff725706d2 | 143 | if (abs(steering2-steering) > steering_diff_limit) |
ediff_iitbracing | 0:30ff725706d2 | 144 | { |
ediff_iitbracing | 0:30ff725706d2 | 145 | flag_steering_comparison++; |
ediff_iitbracing | 0:30ff725706d2 | 146 | if (flag_steering_comparison >= fmea_recheck_iteration) |
ediff_iitbracing | 0:30ff725706d2 | 147 | { |
ediff_iitbracing | 0:30ff725706d2 | 148 | steering2_pulldown_fmea(); |
ediff_iitbracing | 1:fec1d091fa34 | 149 | return; |
ediff_iitbracing | 0:30ff725706d2 | 150 | } |
ediff_iitbracing | 1:fec1d091fa34 | 151 | for_steering_comparison_fmea.attach(&steering_comparison_fmea,fmea_recheck_time); |
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 | } |