@@ -43,9 +43,11 @@ static bool launch_control_enabled = false;
4343#define MAX_VOLTS_UNSCALED 5.0
4444
4545#define PEDAL_DIFF_THRESH 0.20 /* percentage */
46- #define PEDAL_FAULT_TIME 90 /* ms */
46+ #define PEDAL_FAULT_TIME 95 /* ms */
47+ #define BRAKE_FAULT_TIME 300 /* ms */
4748
48- #define APPS_THRESHOLD_BUF 0.45
49+ #define APPS_THRESHOLD_BUF 0.45
50+ #define BRAKE_THRESHOLD_BUF 0.25
4951enum { ACCELPIN_1 , ACCELPIN_2 , BRAKEPIN_1 , BRAKEPIN_2 };
5052
5153/* Factor for converting MPH to KMH */
@@ -254,6 +256,44 @@ bool calc_pedal_faults(float accel1, float accel2, float accel1_norm,
254256 return false;
255257}
256258
259+ /**
260+ * @brief Determine if there has been a brake sensor fault
261+ *
262+ * @param brake1 sensor 1 voltage reading (out of 5V)
263+ * @param accel2 sensor 2 voltage reading (out of 5V)
264+ */
265+ bool calc_brake_faults (float brake1 , float brake2 )
266+ {
267+ /* oc = Open Circuit */
268+ static nertimer_t oc_fault_timer ;
269+
270+ /* sc = Short Circuit */
271+ static nertimer_t sc_fault_timer ;
272+
273+ /* EV3.5.4: For analog acceleration control signals, this error checking must detect open circuit, short to
274+ ground and short to sensor power. */
275+
276+ /* Pedal open circuit fault */
277+ bool open_circuit =
278+ brake1 > BRAKE_SENSOR_IRREGULAR_HIGH + BRAKE_THRESHOLD_BUF ||
279+ brake2 > BRAKE_SENSOR_IRREGULAR_HIGH + BRAKE_THRESHOLD_BUF ;
280+ debounce (open_circuit , & oc_fault_timer , BRAKE_FAULT_TIME ,
281+ & pedal_fault_cb , "Brake open circuit fault - max brake value" );
282+
283+ /* Pedal short circuit to gnd */
284+ bool short_circuit =
285+ brake1 < BRAKE_SENSOR_IRREGULAR_LOW - BRAKE_THRESHOLD_BUF ||
286+ brake2 < BRAKE_SENSOR_IRREGULAR_LOW - BRAKE_THRESHOLD_BUF ;
287+ debounce (short_circuit , & sc_fault_timer , BRAKE_FAULT_TIME ,
288+ & pedal_fault_cb ,
289+ "Brake grounded circuit fault - 0 brake value" );
290+
291+ if (open_circuit || short_circuit ) {
292+ return true;
293+ }
294+ return false;
295+ }
296+
257297/**
258298 * @brief Function to send raw pedal data over CAN.
259299 *
@@ -295,20 +335,29 @@ void send_pedal_data(void *arg)
295335/**
296336 * @brief Determine if power to the motor controller should be disabled based on brake and accelerator pedal travel.
297337 *
338+ * Will queue fault
339+ *
298340 * @param accel_val Percent travel of the accelerator pedal from 0-1
299- * @param brake_val Brake pressure sensor reading
341+ * @param brake_val Brake pressure sensor reading, 0-1
300342 * @return bool True for prefault conditions met, false for no prefault
301343 */
302- bool calc_bspd_prefault (float accel_val , float brake_val )
344+ bool calc_bspd_prefault (float accel_val , float brake_val , float dc_current )
303345{
304- static fault_data_t fault_data = { .fault_id = BSPD_PREFAULT ,
305- .diag = "BSPD prefault triggered" };
346+ static const fault_data_t fault_data = {
347+ .fault_id = BSPD_PREFAULT , .diag = "BSPD prefault triggered"
348+ };
306349 static bool motor_disabled = false;
307350
308351 /* EV.4.7: If brakes are engaged and APPS signals more than 25% pedal travel, disable power
309352 to the motor(s). Re-enable when accelerator has less than 5% pedal travel. */
310353
311- if (brake_val > PEDAL_BRAKE_THRESH && accel_val > 0.25 ) {
354+ if (brake_val > PEDAL_HARD_BRAKE_THRESH && accel_val > 0.25 ) {
355+ motor_disabled = true;
356+ queue_fault (& fault_data );
357+ }
358+
359+ // prevent a fault
360+ if (brake_val > PEDAL_HARD_BRAKE_THRESH && dc_current > 10 ) {
312361 motor_disabled = true;
313362 queue_fault (& fault_data );
314363 }
@@ -596,6 +645,8 @@ void vProcessPedals(void *pv_params)
596645
597646 float accel1_volts = adc_to_volts (adc_data [ACCELPIN_1 ]);
598647 float accel2_volts = adc_to_volts (adc_data [ACCELPIN_2 ]);
648+ float brake1_volts = adc_to_volts (adc_data [BRAKEPIN_1 ]);
649+ float brake2_volts = adc_to_volts (adc_data [BRAKEPIN_2 ]);
599650
600651 // printf("accel1 volts %f\n", accel1_volts);
601652 // printf("accel2 volts %f\n", accel2_volts);
@@ -606,8 +657,10 @@ void vProcessPedals(void *pv_params)
606657 float accel2_norm = pedal_percent_pressed (
607658 accel2_volts , MIN_APPS2_VOLTS , MAX_APPS2_VOLTS );
608659
609- bool possible_faults = calc_pedal_faults (
660+ bool possible_pedal_faults = calc_pedal_faults (
610661 accel1_volts , accel2_volts , accel1_norm , accel2_norm );
662+ bool possible_brake_faults =
663+ calc_brake_faults (brake1_volts , brake2_volts );
611664
612665 /* same for brake values */
613666 float brake_avg =
@@ -630,10 +683,13 @@ void vProcessPedals(void *pv_params)
630683 osMutexRelease (brake_state_mut );
631684 write_brakelight (pdu , brake_pressed );
632685
633- if (calc_bspd_prefault (accel_value , brake_value )) {
686+ int16_t dc_current ;
687+ dti_get_dc_current (mc , & dc_current );
688+
689+ if (calc_bspd_prefault (accel_value , brake_value , dc_current )) {
634690 /* Prefault triggered */
635- // osDelay(delay_time);
636691 // dti_set_torque(0);
692+ // osDelay(delay_time);
637693 // continue;
638694 }
639695
0 commit comments