2022-10-20 17:13:02 +08:00
|
|
|
/**
|
2022-11-03 20:38:55 +08:00
|
|
|
******************************************************************************
|
|
|
|
* @file user_lib.c
|
|
|
|
* @author Wang Hongxi
|
2022-11-12 18:03:18 +08:00
|
|
|
* @author modified by neozng
|
|
|
|
* @version 0.2 beta
|
2022-11-03 20:38:55 +08:00
|
|
|
* @date 2021/2/18
|
|
|
|
* @brief
|
|
|
|
******************************************************************************
|
|
|
|
* @attention
|
|
|
|
*
|
|
|
|
******************************************************************************
|
|
|
|
*/
|
2022-10-20 17:13:02 +08:00
|
|
|
#include "stdlib.h"
|
2023-02-16 15:46:04 +08:00
|
|
|
#include "memory.h"
|
2022-10-20 17:13:02 +08:00
|
|
|
#include "user_lib.h"
|
|
|
|
#include "math.h"
|
|
|
|
#include "main.h"
|
|
|
|
|
|
|
|
#ifdef _CMSIS_OS_H
|
|
|
|
#define user_malloc pvPortMalloc
|
|
|
|
#else
|
|
|
|
#define user_malloc malloc
|
|
|
|
#endif
|
|
|
|
|
|
|
|
uint8_t GlobalDebugMode = 7;
|
|
|
|
|
2023-02-16 15:46:04 +08:00
|
|
|
void *zero_malloc(size_t size)
|
2023-02-04 22:48:53 +08:00
|
|
|
{
|
2023-02-16 15:46:04 +08:00
|
|
|
void *ptr = malloc(size);
|
|
|
|
memset(ptr, 0, size);
|
2023-02-04 22:48:53 +08:00
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 快速开方
|
2022-10-20 17:13:02 +08:00
|
|
|
float Sqrt(float x)
|
|
|
|
{
|
|
|
|
float y;
|
|
|
|
float delta;
|
|
|
|
float maxError;
|
|
|
|
|
|
|
|
if (x <= 0)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// initial guess
|
|
|
|
y = x / 2;
|
|
|
|
|
|
|
|
// refine
|
|
|
|
maxError = x * 0.001f;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
delta = (y * y) - x;
|
|
|
|
y -= delta / (2 * y);
|
|
|
|
} while (delta > maxError || delta < -maxError);
|
|
|
|
|
|
|
|
return y;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 绝对值限制
|
2022-10-20 17:13:02 +08:00
|
|
|
float abs_limit(float num, float Limit)
|
|
|
|
{
|
|
|
|
if (num > Limit)
|
|
|
|
{
|
|
|
|
num = Limit;
|
|
|
|
}
|
|
|
|
else if (num < -Limit)
|
|
|
|
{
|
|
|
|
num = -Limit;
|
|
|
|
}
|
|
|
|
return num;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 判断符号位
|
2022-10-20 17:13:02 +08:00
|
|
|
float sign(float value)
|
|
|
|
{
|
|
|
|
if (value >= 0.0f)
|
|
|
|
{
|
|
|
|
return 1.0f;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return -1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 浮点死区
|
2022-10-20 17:13:02 +08:00
|
|
|
float float_deadband(float Value, float minValue, float maxValue)
|
|
|
|
{
|
|
|
|
if (Value < maxValue && Value > minValue)
|
|
|
|
{
|
|
|
|
Value = 0.0f;
|
|
|
|
}
|
|
|
|
return Value;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 限幅函数
|
2022-10-20 17:13:02 +08:00
|
|
|
float float_constrain(float Value, float minValue, float maxValue)
|
|
|
|
{
|
|
|
|
if (Value < minValue)
|
|
|
|
return minValue;
|
|
|
|
else if (Value > maxValue)
|
|
|
|
return maxValue;
|
|
|
|
else
|
|
|
|
return Value;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 限幅函数
|
2022-10-20 17:13:02 +08:00
|
|
|
int16_t int16_constrain(int16_t Value, int16_t minValue, int16_t maxValue)
|
|
|
|
{
|
|
|
|
if (Value < minValue)
|
|
|
|
return minValue;
|
|
|
|
else if (Value > maxValue)
|
|
|
|
return maxValue;
|
|
|
|
else
|
|
|
|
return Value;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 循环限幅函数
|
2022-10-20 17:13:02 +08:00
|
|
|
float loop_float_constrain(float Input, float minValue, float maxValue)
|
|
|
|
{
|
|
|
|
if (maxValue < minValue)
|
|
|
|
{
|
|
|
|
return Input;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Input > maxValue)
|
|
|
|
{
|
|
|
|
float len = maxValue - minValue;
|
|
|
|
while (Input > maxValue)
|
|
|
|
{
|
|
|
|
Input -= len;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (Input < minValue)
|
|
|
|
{
|
|
|
|
float len = maxValue - minValue;
|
|
|
|
while (Input < minValue)
|
|
|
|
{
|
|
|
|
Input += len;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Input;
|
|
|
|
}
|
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 弧度格式化为-PI~PI
|
2022-10-20 17:13:02 +08:00
|
|
|
|
2022-11-12 18:03:18 +08:00
|
|
|
// 角度格式化为-180~180
|
2022-10-20 17:13:02 +08:00
|
|
|
float theta_format(float Ang)
|
|
|
|
{
|
|
|
|
return loop_float_constrain(Ang, -180.0f, 180.0f);
|
|
|
|
}
|
|
|
|
|
|
|
|
int float_rounding(float raw)
|
|
|
|
{
|
|
|
|
static int integer;
|
|
|
|
static float decimal;
|
|
|
|
integer = (int)raw;
|
|
|
|
decimal = raw - integer;
|
|
|
|
if (decimal > 0.5f)
|
|
|
|
integer++;
|
|
|
|
return integer;
|
2022-10-31 20:20:16 +08:00
|
|
|
}
|