Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/SUFST/Inc/Functions/torque_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,17 @@ typedef struct _torque_map_t
uint16_t deadzone_end; // end of deadzone
float deadzone_scale; // scale factor for inputs
const config_torque_map_t* config_ptr; // configuration
uint16_t output_max;
uint16_t speed_min; // minimum Torque request at max speed (Nm *10)
uint16_t speed_start; // speed to start limiting torque (rpm)
uint16_t speed_end; // speed for max torque limiting (rpm)
} torque_map_t;

/*
* public functions
*/
status_t torque_map_init(torque_map_t* map_ptr,
const config_torque_map_t* config_ptr);
uint16_t torque_map_apply(torque_map_t* map_ptr, uint16_t input);
uint16_t torque_map_apply(torque_map_t* map_ptr, uint16_t input, int16_t speed);

#endif
3 changes: 3 additions & 0 deletions src/SUFST/Inc/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ typedef struct {
uint16_t input_max; // maximum input value (range must be zero to max)
uint16_t output_max; // maximum output value (Nm * 10)
float deadzone_fraction; // fraction of input range for deadzone
uint16_t speed_min; // minimum Torque request at max speed (Nm *10)
uint16_t speed_start; // speed to start limiting torque (rpm)
uint16_t speed_end; // speed for max torque limiting (rpm)
} config_torque_map_t;

/**
Expand Down
81 changes: 65 additions & 16 deletions src/SUFST/Src/Functions/torque_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
/*
* internal function prototypes
*/
static inline uint16_t apply_deadzone(torque_map_t *map_ptr, uint16_t input);
static uint16_t null_torque_map(torque_map_t *map_ptr, uint16_t input);
static uint16_t linear_torque_map(torque_map_t *map_ptr, uint16_t input);
static inline uint16_t apply_deadzone(torque_map_t* map_ptr, uint16_t input);
static uint16_t null_torque_map(torque_map_t* map_ptr, uint16_t input);
static uint16_t linear_torque_map(torque_map_t* map_ptr, uint16_t input);
static inline uint16_t
apply_speed_limit(torque_map_t* map_ptr, uint16_t input, int16_t speed);

/**
* @brief Initialises the torque map
Expand All @@ -16,15 +18,18 @@ static uint16_t linear_torque_map(torque_map_t *map_ptr, uint16_t input);
* @param[in] map_ptr Torque map
* @param[in] config_ptr Configuration
*/
status_t torque_map_init(torque_map_t *map_ptr,
const config_torque_map_t *config_ptr)
status_t torque_map_init(torque_map_t* map_ptr,
const config_torque_map_t* config_ptr)
{
map_ptr->config_ptr = config_ptr;

// pre-compute deadzone parameters
map_ptr->deadzone_end = config_ptr->deadzone_fraction * config_ptr->input_max;
map_ptr->deadzone_end
= config_ptr->deadzone_fraction * config_ptr->input_max;

map_ptr->deadzone_scale = ((float)config_ptr->input_max) / ((float)(config_ptr->input_max - map_ptr->deadzone_end));
map_ptr->deadzone_scale
= ((float) config_ptr->input_max)
/ ((float) (config_ptr->input_max - map_ptr->deadzone_end));

// load mapping function
status_t status = STATUS_OK;
Expand All @@ -43,6 +48,10 @@ status_t torque_map_init(torque_map_t *map_ptr,
break;
};

map_ptr->speed_min = config_ptr->speed_min;
map_ptr->speed_start = config_ptr->speed_start;
map_ptr->speed_end = config_ptr->speed_end;

return status;
}

Expand All @@ -52,12 +61,12 @@ status_t torque_map_init(torque_map_t *map_ptr,
* @param[in] map_ptr Torque map
* @param[in] input Input value
*/
uint16_t torque_map_apply(torque_map_t *map_ptr, uint16_t input)
uint16_t torque_map_apply(torque_map_t* map_ptr, uint16_t input, int16_t speed)
{
const uint16_t input_deadzone = apply_deadzone(map_ptr, input);
const uint16_t torque = map_ptr->map_func(map_ptr, input_deadzone);

return torque;
const uint16_t limited_torque = apply_speed_limit(map_ptr, torque, speed);
return limited_torque;
}

/**
Expand All @@ -67,7 +76,7 @@ uint16_t torque_map_apply(torque_map_t *map_ptr, uint16_t input)
* @param[in] map_ptr Torque map
* @param[in] input Input value
*/
uint16_t apply_deadzone(torque_map_t *map_ptr, uint16_t input)
uint16_t apply_deadzone(torque_map_t* map_ptr, uint16_t input)
{
uint16_t result = 0;

Expand All @@ -78,7 +87,7 @@ uint16_t apply_deadzone(torque_map_t *map_ptr, uint16_t input)
else
{
const uint16_t shifted_input = input - map_ptr->deadzone_end;
result = (uint16_t)(shifted_input * map_ptr->deadzone_scale);
result = (uint16_t) (shifted_input * map_ptr->deadzone_scale);
}

return result;
Expand All @@ -87,7 +96,7 @@ uint16_t apply_deadzone(torque_map_t *map_ptr, uint16_t input)
/**
* @brief A torque map that returns zero
*/
uint16_t null_torque_map(torque_map_t *map_ptr, uint16_t input)
uint16_t null_torque_map(torque_map_t* map_ptr, uint16_t input)
{
UNUSED(map_ptr);
UNUSED(input);
Expand All @@ -97,13 +106,53 @@ uint16_t null_torque_map(torque_map_t *map_ptr, uint16_t input)
/**
* @brief A linear torque map
*/
uint16_t linear_torque_map(torque_map_t *map_ptr, uint16_t input)
uint16_t linear_torque_map(torque_map_t* map_ptr, uint16_t input)
{
const float scale_factor = map_ptr->config_ptr->output_max / (float)map_ptr->config_ptr->input_max;
const float scale_factor = map_ptr->config_ptr->output_max
/ (float) map_ptr->config_ptr->input_max;

const uint16_t torque = (uint16_t)(input * scale_factor);
const uint16_t torque = (uint16_t) (input * scale_factor);

// TODO: clip to range

return torque;
}

uint16_t apply_speed_limit(torque_map_t* map_ptr, uint16_t input, int16_t speed)
{
uint16_t result = 0;
if (speed < map_ptr->speed_start)
{
result = input;
}
else if (speed > map_ptr->speed_end)
{
if (input < map_ptr->speed_min)
{
result = input;
}
else
{
result = map_ptr->speed_min;
}
}
else
{
uint16_t max_torque
= map_ptr->config_ptr->output_max
- (map_ptr->config_ptr->output_max - map_ptr->speed_min)
* (speed - map_ptr->speed_start)
/ (map_ptr->speed_end - map_ptr->speed_start);

if (input < max_torque)
{
result = input;
}
else
{
result = max_torque;
}
}

return result;
}
12 changes: 7 additions & 5 deletions src/SUFST/Src/Interfaces/bps.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
* @param[in] bps_ptr BPS context
* @param[in] config_ptr Configuration
*/
status_t bps_init(bps_context_t *bps_ptr, const config_bps_t *config_ptr)
status_t bps_init(bps_context_t* bps_ptr, const config_bps_t* config_ptr)
{
bps_ptr->config_ptr = config_ptr;

// compute pressure thresholds
const uint16_t range = config_ptr->scs.max_mapped - config_ptr->scs.min_mapped;
const uint16_t range
= config_ptr->scs.max_mapped - config_ptr->scs.min_mapped;

const uint16_t offset = config_ptr->scs.min_mapped;

bps_ptr->fully_pressed_threshold = (config_ptr->fully_pressed_fraction * range) + offset;
bps_ptr->fully_pressed_threshold
= (config_ptr->fully_pressed_fraction * range) + offset;

// create the SCS instance
status_t status = scs_create(&bps_ptr->signal, &config_ptr->scs);
Expand All @@ -29,7 +31,7 @@ status_t bps_init(bps_context_t *bps_ptr, const config_bps_t *config_ptr)
* @param[in] bps_ptr
* @param[out] reading_ptr
*/
status_t bps_read(bps_context_t *bps_ptr, uint16_t *reading_ptr)
status_t bps_read(bps_context_t* bps_ptr, uint16_t* reading_ptr)
{
status_t status = scs_read(&bps_ptr->signal, reading_ptr);
scs_status_t status_verbose = bps_ptr->signal.status_verbose;
Expand Down Expand Up @@ -64,7 +66,7 @@ status_t bps_read(bps_context_t *bps_ptr, uint16_t *reading_ptr)
* @retval true BPS is fully pressed
* @retval false BPS not fully pressed, or SCS fault
*/
bool bps_fully_pressed(bps_context_t *bps_ptr)
bool bps_fully_pressed(bps_context_t* bps_ptr)
{
uint16_t reading = 0;
status_t status = bps_read(bps_ptr, &reading);
Expand Down
Loading