Files
DBW/DBW_V2/Core/Inc/dbw.h
v0stap 78e6a1b8aa base
2026-04-05 11:31:20 +02:00

261 lines
5.8 KiB
C

/*
* dbw.h
*
* Created on: May 5, 2021
* Author: Dmitrijs
*/
#ifndef SRC_DBW_H_
#define SRC_DBW_H_
#define CONFIG_AGREEMENT_F 0x01
#define CONFIG_SENSORS_CALIBRATED_F 0x02
#define CONFIG_TESTMODE_F 0x04
#define CONFIG_SAFETY_FEATURES_F 0x08
#define DBW_STATUS0_READY_F 0x1
#define DBW_STATUS0_AGREEMENT_F 0x2
#define DBW_STATUS0_SENSOR_CAL_F 0x4
#define DBW_STATUS0_FAULT_F 0x8
#define DBW_STATUS0_CAN_MSDBW_F 0x10
#define DBW_STATUS0_CAN_RX_BCST_F 0x20
#define DBW_STATUS0_PWM_IDLE_F 0x40
#define DBW_STATUS0_GPI1_F 0x80
#define DBW_STATUS0_GPI2_F 0x100
#define DBW_STATUS0_GPO1_F 0x200
#define DBW_STATUS0_GPO2_F 0x400
#define DBW_STATUS0_PPSTPS_CAL_F 0x800
#define DBW_STATUS0_UNPROTECTED_F 0x1000
#define DBW_STATUS0_CONF_ERROR_F 0x2000
#define DBW_STATUS0_SENSOR_FAULT_F 0x4000
#define DBW_STATUS1_SAFETY_F 0x01
#define PPS2_CALC_OPTION_LINEAR 0
#define PPS2_CALC_OPTION_POLYNOMAL 1
#define TPS2_CALC_OPTION_LINEAR 0
#define TPS2_CALC_OPTION_POLYNOMAL 1
#define PPS2TPS_OPTION_CURVE 0
#define PPS2TPS_OPTION_MS3_CAN 1
#define IDLE_OPTION_NO_IDLE_INPUT 0
#define IDLE_OPTION_PWM_INPUT1 1
#define IDLE_OPTION_PWM_INPUT2 2
#define IDLE_OPTION_MS_CAN 3
#define MOTOR_PID_OPTION_STATIC 0
#define MOTOR_PID_OPTION_STATIC_FWRW 1
#define MOTOR_PID_OPTION_TABLE 2
typedef struct
{
uint8_t pps_calc_option;
uint8_t tps_calc_option;
uint16_t pps1_min;
uint16_t pps1_max;
uint16_t pps2_min;
uint16_t pps2_mid;
uint16_t pps2_mid_pct;
uint16_t pps2_max;
uint16_t tps1_min;
uint16_t tps1_max;
uint16_t tps2_min;
uint16_t tps2_mid;
uint16_t tps2_mid_pct;
uint16_t tps2_max;
uint8_t pps2tps_option;
uint8_t idle_input_option;
// pps to tps target curve
int16_t pps_bins[16]; //[0.1%]
int16_t tps_bins[16]; //[0.1%]
// Idle pps modifier curve. when Idle input is used. it modifies tps target
int16_t idle_input_bins[8]; //input pwm duty [0.1%]
int16_t idle_tps_adder_bins[8]; //tps target adder [0.1%]
uint16_t motor_pwm_fq; // frequency in Hz
uint16_t motor_ctl_period; // ctl_teriod in [100uS]
uint16_t motor_pid_option; // PID static coefs, static coef, but different for forward and backward moving
// 3D table
// PID COEFICIENTS for forward and reward
int16_t motor_fw_p;
int16_t motor_fw_i;
int16_t motor_fw_d;
int16_t motor_rw_p;
int16_t motor_rw_i;
int16_t motor_rw_d;
int16_t motor_p_tps_bins[16];
int16_t motor_p_error_bins[16];
int16_t motor_p_table[16][16];
//PID limmits
int16_t i_limmit;
int16_t motor_dc_max;
int16_t motor_dc_min;
//DC offset curve
int16_t tps_dc_tps_bins[16]; // tps bins [0.1%]
int16_t tps_dc_offset_bins[16]; // motor pwm offset [0.01%PWM]
//Battery voltage correction curve
uint16_t vbat_bins[8]; // battery voltage ADC bins []
int16_t motor_pwm_corr_bins[8]; // motor pwm correction [0.1%]
uint16_t pwm_deadtime;
uint16_t can_dbw_id;
uint16_t can_idle_base_id;
uint16_t config_bits;
uint16_t pps1_margin;
uint16_t pps2_margin;
int16_t pps_delta_margin;
uint16_t tps1_margin;
uint16_t tps2_margin;
uint16_t tps_delta_margin;
int16_t tps_error_margin1;
uint16_t tps_error_time1;
int16_t tps_error_margin2;
uint16_t tps_error_time2;
uint16_t can_dbw_poll_perod;
//enable tuning over CAN;
uint8_t can_ms29bit_id;
uint8_t can_ms29bit_options;
//broadcast my data
uint8_t can_bcst_data_enable;
uint8_t can_bcst_data_period;
uint16_t can_bcst_canid;
}config_t;
typedef struct
{
uint32_t clock;
uint16_t status0;
uint16_t status1;
uint16_t status2;
uint16_t status3;
uint16_t pps1_adc;
uint16_t pps2_adc;
uint16_t tps1_adc;
uint16_t tps2_adc;
uint16_t motor_current_adc;
uint16_t vbat_adc;
int16_t pps1;
int16_t pps2;
int16_t tps1;
int16_t tps2;
int16_t pps;
int16_t tps;
int16_t tps_error;
int16_t motor_pwm;
uint16_t idle_dc;
int16_t pps_delta;
int16_t tps_delta;
int16_t tps_target;
uint16_t vss;
uint16_t rpm;
}var_t;
#define PWM_STATUS_DEFAULT 0
#define PWM_STATUS_IDLE 1
#define PWM_STATUS_STARTED 2
#define PWM_STATUS_ERROR 3
#define PWM_STATE_POSITIVE_INACTIVE 0
#define PWM_STATE_POSITIVE_ACTIVE 1
#define PWM_STATE_NEGATIVE_INACTIVE 2
#define PWM_STATE_NEGATIVE_ACTIVE 3
typedef struct
{
unsigned char status;
unsigned char state;
GPIO_TypeDef *pos_port;
unsigned short pos_pin;
GPIO_TypeDef *neg_port;
unsigned short neg_pin;
unsigned int period_ticks;
unsigned int duty_ticks;
signed int pwm;
signed int pwm_t;
signed int single_pulse;
}pwm_t;
extern volatile float pps1_gain, pps1_offset, pps2_gain, pps2_offset, tps1_gain, tps2_offset;
extern volatile uint16_t dbw_fast_process_timer, dbw_slow_process_timer;
void Apply_Sensor_Calibration(void);
int DBW_Process(void);
void DBW_Pwm_Init(void);
void DBW_Pwm_Set_Duty(signed int duty, pwm_t* ttl);
void TIM2_IRQHandler (void);
int intrp_1dstable(signed short x, unsigned char n, signed short * x_table, char sgn,signed short * z_table);
signed short intrp_1d_ss_table(signed short x, unsigned char n, signed short * x_table, char sgn, signed short * z_table);
unsigned int intrp_1d_uitable(unsigned int x, unsigned char nx, unsigned int * x_table, unsigned int * z_table);
void DBW_Init(void);
void DBW_Start(void);
void DBW_Stop(void);
void DBW_TPS_AutoCal(void);
void DBW_Read_sensors(void);
extern volatile pwm_t ttl1_pwm;
extern volatile unsigned short ctl_period;
extern volatile config_t config_ram;
extern volatile var_t var;
extern volatile config_t *config;
extern const config_t config_flash;
extern volatile int32_t vbat_corr, tps_slow_t, p_comp, i_comp, d_comp, tps_error_t, can_target, spring_preload, idle_adder;
extern volatile uint32_t ac_timer, ac_mode;
#endif /* SRC_DBW_H_ */