391 lines
10 KiB
C
391 lines
10 KiB
C
/*
|
|
* safety.c
|
|
*
|
|
* Created on: 12 May 2021
|
|
* Author: Dmitrijs
|
|
*/
|
|
|
|
#include "main.h"
|
|
#include "dbw.h"
|
|
#include "ts_comms.h"
|
|
#include "safety.h"
|
|
|
|
const char msg1[42] = { "PPS1 Safety margin >4095 or less then 0\r\n" };
|
|
const char msg2[42] = { "PPS2 Safety margin >4095 or less then 0\r\n" };
|
|
const char msg3[42] = { "TPS1 Safety margin >4095 or less then 0\r\n" };
|
|
const char msg4[42] = { "TPS2 Safety margin >4095 or less then 0\r\n" };
|
|
|
|
void Flash_Write_Protect(void) {
|
|
|
|
FLASH_OBProgramInitTypeDef p;
|
|
p.OptionType = OPTIONBYTE_WRP;
|
|
p.WRPState = OB_WRPSTATE_ENABLE;
|
|
|
|
HAL_FLASH_Unlock();
|
|
HAL_FLASH_OB_Unlock();
|
|
HAL_FLASHEx_OBErase();
|
|
|
|
p.WRPPage = 0x00003FFF;
|
|
|
|
HAL_FLASHEx_OBProgram(&p);
|
|
FLASH_WaitForLastOperation((uint32_t) FLASH_TIMEOUT_VALUE);
|
|
|
|
HAL_FLASH_OB_Lock();
|
|
HAL_FLASH_Lock();
|
|
HAL_FLASH_OB_Launch();
|
|
|
|
}
|
|
|
|
void Flash_Write_Unprotect(void) {
|
|
|
|
FLASH_OBProgramInitTypeDef p;
|
|
p.OptionType = OPTIONBYTE_WRP;
|
|
p.WRPState = OB_WRPSTATE_DISABLE;
|
|
|
|
HAL_FLASH_Unlock();
|
|
HAL_FLASH_OB_Unlock();
|
|
HAL_FLASHEx_OBErase();
|
|
|
|
p.WRPPage = 0x00003FFF;
|
|
|
|
HAL_FLASHEx_OBProgram(&p);
|
|
FLASH_WaitForLastOperation((uint32_t) FLASH_TIMEOUT_VALUE);
|
|
|
|
HAL_FLASH_OB_Lock();
|
|
HAL_FLASH_Lock();
|
|
HAL_FLASH_OB_Launch();
|
|
|
|
}
|
|
|
|
void Watch_Dog_Update(void) {
|
|
IWDG->KR = 0x0000AAAA; // update wd timer
|
|
}
|
|
|
|
void Watch_Dog_Init(void) {
|
|
IWDG->KR = 0x0000CCCC; // enable watchdog
|
|
IWDG->KR = 0x00005555; // enable register access
|
|
while (IWDG->SR)
|
|
;
|
|
IWDG->PR = 0x00000000; // prescaler LSI / 4
|
|
while (IWDG->SR)
|
|
;
|
|
IWDG->RLR = 1000; // set timeout to 100mS
|
|
while (IWDG->SR)
|
|
;
|
|
IWDG->KR = 0x0000AAAA; // enable register access
|
|
while (IWDG->SR)
|
|
;
|
|
|
|
}
|
|
|
|
void Check_Safety_Limits(void) {
|
|
|
|
//PPS1
|
|
|
|
if (config->pps1_min < config->pps1_max) {
|
|
if ((config->pps1_margin > config->pps1_min)
|
|
|| ((config->pps1_max + config->pps1_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg1, 42);
|
|
}
|
|
} else {
|
|
//config->pps1_min > config->pps1_max
|
|
if ((config->pps1_margin > config->pps1_max)
|
|
|| ((config->pps1_min + config->pps1_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg1, 42);
|
|
}
|
|
}
|
|
//PPS2
|
|
|
|
if (config->pps2_min < config->pps2_max) {
|
|
if ((config->pps2_margin > config->pps2_min)
|
|
|| ((config->pps2_max + config->pps2_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg2, 42);
|
|
}
|
|
} else {
|
|
//config->pps2_min > config->pps1_max
|
|
if ((config->pps2_margin > config->pps2_max)
|
|
|| ((config->pps2_min + config->pps2_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg2, 42);
|
|
}
|
|
}
|
|
|
|
//TPS1
|
|
|
|
if (config->tps1_min < config->tps1_max) {
|
|
if ((config->tps1_margin > config->tps1_min)
|
|
|| ((config->tps1_max + config->tps1_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg3, 42);
|
|
}
|
|
} else {
|
|
//config->tps1_min > config->tps1_max
|
|
if ((config->tps1_margin > config->tps1_max)
|
|
|| ((config->tps1_min + config->tps1_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg3, 42);
|
|
}
|
|
}
|
|
//TPS2
|
|
|
|
if (config->tps2_min < config->tps2_max) {
|
|
if ((config->tps2_margin > config->tps2_min)
|
|
|| ((config->tps2_max + config->tps2_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg4, 42);
|
|
}
|
|
} else {
|
|
//config->tps2_min > config->tps1_max
|
|
if ((config->tps2_margin > config->tps2_max)
|
|
|| ((config->tps2_min + config->tps2_margin) > 4095)) {
|
|
//config errror
|
|
var.status0 |= DBW_STATUS0_CONF_ERROR_F;
|
|
DBW_Stop();
|
|
TX_Schedule((unsigned char*) msg4, 42);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void Check_Adc_Range(void) {
|
|
|
|
//PPS1
|
|
if (config->pps1_min < config->pps1_max) {
|
|
|
|
if (var.pps1_adc < (config->pps1_min - config->pps1_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS1_SS_GND;
|
|
}
|
|
|
|
if (var.pps1_adc > (config->pps1_max + config->pps1_margin)) {
|
|
//Fault condition PPS1 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS1_SS_VREF;
|
|
}
|
|
} else {
|
|
//config->pps1_min < config->pps1_max
|
|
if (var.pps1_adc < (config->pps1_max - config->pps1_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS1_SS_GND;
|
|
}
|
|
|
|
if (var.pps1_adc > (config->pps1_min + config->pps1_margin)) {
|
|
//Fault condition PPS1 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS1_SS_VREF;
|
|
}
|
|
}
|
|
|
|
//PPS2
|
|
if (config->pps2_min < config->pps2_max) {
|
|
if (var.pps2_adc < (config->pps2_min - config->pps2_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS2_SS_GND;
|
|
}
|
|
|
|
if (var.pps2_adc > (config->pps2_max + config->pps2_margin)) {
|
|
//Fault condition PPS1 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS1_SS_VREF;
|
|
}
|
|
} else {
|
|
|
|
if (var.pps2_adc < (config->pps2_max - config->pps2_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS2_SS_GND;
|
|
}
|
|
|
|
if (var.pps2_adc > (config->pps2_min + config->pps2_margin)) {
|
|
//Fault condition PPS1 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS1_SS_VREF;
|
|
}
|
|
}
|
|
|
|
//PPS Delta
|
|
if ((var.pps_delta > config->pps_delta_margin)
|
|
|| (var.pps_delta < ((int16_t) -config->pps_delta_margin))) {
|
|
//Fault condition PPS DELTA
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_PPS_DELTA;
|
|
}
|
|
|
|
//##########################################
|
|
//TPS1
|
|
if (config->tps1_min < config->tps1_max) {
|
|
if (var.tps1_adc < (config->tps1_min - config->tps1_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS1_SS_GND;
|
|
}
|
|
|
|
if (var.tps1_adc > (config->tps1_max + config->tps1_margin)) {
|
|
//Fault condition TPS1 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS1_SS_VREF;
|
|
}
|
|
} else {
|
|
|
|
if (var.tps1_adc < (config->tps1_max - config->tps1_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS1_SS_GND;
|
|
}
|
|
|
|
if (var.tps1_adc > (config->tps1_min + config->tps1_margin)) {
|
|
//Fault condition TPS1 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS1_SS_VREF;
|
|
}
|
|
}
|
|
|
|
//TPS2
|
|
if (config->tps2_min < config->tps2_max) {
|
|
if (var.tps2_adc < (config->tps2_min - config->tps2_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS2_SS_GND;
|
|
}
|
|
|
|
if (var.tps2_adc > (config->tps2_max + config->tps2_margin)) {
|
|
//Fault condition TPS2 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS2_SS_VREF;
|
|
}
|
|
} else {
|
|
if (var.tps2_adc < (config->tps2_max - config->tps2_margin)) {
|
|
//Fault condition PPS1 min
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS2_SS_GND;
|
|
}
|
|
|
|
if (var.tps2_adc > (config->tps2_min + config->tps2_margin)) {
|
|
//Fault condition TPS2 MAX
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS2_SS_VREF;
|
|
}
|
|
}
|
|
|
|
//TPS Delta
|
|
if ((var.tps_delta > config->tps_delta_margin)
|
|
|| (var.tps_delta < ((int16_t) -config->tps_delta_margin))) {
|
|
//Fault condition PPS DELTA
|
|
var.status0 |= DBW_STATUS0_SENSOR_FAULT_F;
|
|
DBW_Stop();
|
|
var.status3 = STATUS3_TPS_DELTA;
|
|
}
|
|
|
|
}
|
|
|
|
volatile int dbw_target_tmr1, dbw_target_tmr2;
|
|
|
|
void Safety_TPS_Safety_Timer(void) {
|
|
if (dbw_target_tmr1 > 0)
|
|
dbw_target_tmr1--;
|
|
if (dbw_target_tmr2 > 0)
|
|
dbw_target_tmr2--;
|
|
}
|
|
|
|
void Safety_TPS_Safety_Timer_Start(void) {
|
|
//enable timers. add 1S time to start, because safety system starts in 1S after startup
|
|
dbw_target_tmr1 = config->tps_error_time1 + 1000;
|
|
dbw_target_tmr2 = config->tps_error_time2 + 1000;
|
|
}
|
|
|
|
void Check_TPS_Target() {
|
|
if (var.tps_error > 0) {
|
|
//check if tps is within specified target
|
|
if (var.tps_error < config->tps_error_margin1)
|
|
dbw_target_tmr1 = config->tps_error_time1;
|
|
else {
|
|
// if not in range in specified time
|
|
if (dbw_target_tmr1 == 0) {
|
|
//fault
|
|
var.status0 |= DBW_STATUS0_FAULT_F;
|
|
DBW_Stop();
|
|
var.status2 = STATUS3_TARGET1_FAULT;
|
|
}
|
|
}
|
|
|
|
if (var.tps_error < config->tps_error_margin2)
|
|
dbw_target_tmr2 = config->tps_error_time2;
|
|
else {
|
|
// if not in range in specified time
|
|
if (dbw_target_tmr2 == 0) {
|
|
//fault
|
|
var.status0 |= DBW_STATUS0_FAULT_F;
|
|
DBW_Stop();
|
|
var.status2 = STATUS3_TARGET2_FAULT;
|
|
}
|
|
}
|
|
}
|
|
|
|
else {
|
|
//tps_error<0
|
|
|
|
//check if tps is within specified target
|
|
if (var.tps_error > (-config->tps_error_margin1))
|
|
dbw_target_tmr1 = config->tps_error_time1;
|
|
else {
|
|
// if not in range in specified time
|
|
if (dbw_target_tmr1 == 0) {
|
|
//fault
|
|
var.status0 |= DBW_STATUS0_FAULT_F;
|
|
DBW_Stop();
|
|
var.status2 = STATUS3_TARGET1_FAULT;
|
|
}
|
|
}
|
|
|
|
if (var.tps_error > (-config->tps_error_margin2))
|
|
dbw_target_tmr2 = config->tps_error_time2;
|
|
else {
|
|
// if not in range in specified time
|
|
if (dbw_target_tmr2 == 0) {
|
|
//fault
|
|
var.status0 |= DBW_STATUS0_FAULT_F;
|
|
DBW_Stop();
|
|
var.status2 = STATUS3_TARGET2_FAULT;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|