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@2:eb4101b574bc, 2013-03-06 (annotated)
- 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?
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 | 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 | } |