V_Limit(); /* 限 速 */ p[1] = 3.4; // left p[2] = 3.2; //right p[3] = 10; //behind PID_Cal( &PID_SPEED[1], MOTOR_FEEDBACK[1].speed_rpm, speed[1], p[1], 5000); PID_Cal( &PID_SPEED[2], MOTOR_FEEDBACK[2].speed_rpm, speed[2], p[2], 5000); PID_Cal( &PID_SPEED[3], MOTOR_FEEDBACK[3].speed_rpm, speed[3], p[3], 9000); //3号速度>1号2号 Motor_Set_Current(PID_SPEED[1].OUT,PID_SPEED[2].OUT,PID_SPEED[3].OUT,0);
时间: 2023-11-18 08:04:47 浏览: 35
这段代码看起来像是嵌入式系统中的控制代码,主要是控制电机转速的PID算法。首先调用了V_Limit()函数限制速度,然后分别将左右轮和后轮的目标速度设置为3.4、3.2和10,并调用PID_Cal()函数计算出每个电机的输出值。最后调用Motor_Set_Current()函数设置电机的输出电流。其中PID_Cal()函数应该是用来计算PID控制器的输出值的。
相关问题
解释一下这段代码typedef struct { int16_t s16Kp; /* Proportional Gain */ int16_t i16Kp_Shift; /* Proportional shift value */ int16_t s16Ki; /* Integral Gain */ int16_t i16Ki_Shift; /* Integral shift value */ int32_t s32IAccK_1; /* State variable output at step k-1 */ Q15_t s16UpperLim; /* Upper Limit of the controller */ Q15_t s16LowerLim; /* Lower Limit of the controller */ bool_t bLimFlag; /* Limitation flag, if set to 1, the controller output has reached either the UpperLimit or LowerLimit */ }MLIB_PIControl_T;
这段代码定义了一个名为MLIB_PIControl_T的结构体,包含了一组PI控制器所需的参数:
- s16Kp: 比例增益
- i16Kp_Shift: 比例增益的位移值
- s16Ki: 积分增益
- i16Ki_Shift: 积分增益的位移值
- s32IAccK_1: k-1时刻的积分状态变量输出值
- s16UpperLim: 控制器的上限值
- s16LowerLim: 控制器的下限值
- bLimFlag: 限制标志,如果设置为1,则表示控制器输出已经达到了上限或下限。
这个结构体可以用于实现PI控制器的功能,用来控制某个系统的输出,使其达到期望的目标值。
nbs = 64 lr_limit_max = 1e-3 if optimizer_type == 'adam' else 1e-1 lr_limit_min = 1e-4 if optimizer_type == 'adam' else 5e-4 if backbone in ['vit_b_16', 'swin_transformer_tiny', 'swin_transformer_small', 'swin_transformer_base']: nbs = 256 lr_limit_max = 1e-3 if optimizer_type == 'adam' else 1e-1 lr_limit_min = 1e-5 if optimizer_type == 'adam' else 5e-4 Init_lr_fit = min(max(batch_size / nbs * Init_lr, lr_limit_min), lr_limit_max) Min_lr_fit = min(max(batch_size / nbs * Min_lr, lr_limit_min * 1e-2), lr_limit_max * 1e-2)
这段代码的作用是根据不同的模型参数和超参数计算出初始学习率 `Init_lr_fit` 和最小学习率 `Min_lr_fit`。
其中,`nbs` 表示每个 GPU 的 batch size,`lr_limit_max` 表示最大学习率的上限,`lr_limit_min` 表示最小学习率的下限,`optimizer_type` 表示优化器的类型,`backbone` 表示模型的主干网络。
如果模型使用的是 `vit_b_16`、`swin_transformer_tiny`、`swin_transformer_small` 或 `swin_transformer_base` 这些主干网络,每个 GPU 的 batch size 将会设为 256,最大学习率的上限将会设为 1e-3(如果优化器类型为 Adam,则为 1e-3,否则为 1e-1),最小学习率的下限将会设为 1e-5(如果优化器类型为 Adam,则为 1e-5,否则为 5e-4)。
在计算 `Init_lr_fit` 时,会根据当前的 batch size、`nbs`、初始学习率 `Init_lr`,以及最大和最小学习率的上下限计算出一个介于最大和最小学习率之间的学习率。在计算 `Min_lr_fit` 时,会根据当前的 batch size、`nbs`、最小学习率 `Min_lr`,以及最大和最小学习率的上下限计算出一个介于最大和最小学习率之间的学习率,同时还会将计算出的学习率再除以 100(即乘以 1e-2),作为最小学习率。