遗留问题
- 电机参数测量问题:给定力矩,测试速度微分,摩擦系数B不可忽略,无法精准测试
- 命令滤波不起作用(命令值变化不大,接近阶跃信号)
- 命令滤波与低通滤波的区别?
- 速度环前馈不起作用(由于命令值变化不大,只有启动时候才有一点作用)
- 对称最优化算法计算出来的P和I不符合常理,积分太大,抗干扰能力弱,容易震荡(不知道命令滤波有没有起作用)
电机参数Js+B
解决方案:估测
B不能忽略的情况下,分子逐渐趋于0,分母转速的微分会趋于0,此时速度趋于恒定,如下图:
系统输入:Te=0.26147
个人猜测:
- Te给的很大时候,w速度越接近0的趋近,B影响越小,此时计算出J更准
- 给定一个较小的力矩Te,当w稳定时候,此时可以测得摩擦系数B=Te/w
滤波器问题
连续系统到离散系统需要考虑采样周期
typedef struct
{
float input;/*需要滤波的数据*/
float output;/*滤波后的数据*/
float last_output;/*上次滤波后的数据*/
float Wb;/*滤波器带宽(rad/s)*/
float dt;/*输入数据的周期 */
/* data */
}LPF_para_t;
/**
* @brief 一阶低通滤波器
* @brief Wb/(s+Wb)
* @param Wb:滤波器带宽(rad/s)
* @param LPF:低通滤波器句柄
* @param input:滤波器输入
* @retval
*/
void LPF_caculate(LPF_para_t *LPF ,float Wb,float input)
{
/*parame*/
static uint32_t INS_DWT_Count = 0;
LPF->last_output=LPF->output;
LPF->Wb = Wb;
LPF->dt=DWT_GetDeltaT(&INS_DWT_Count);
LPF->input=input;
/*caculate*/
LPF->output=LPF->input * (LPF->Wb*LPF->dt/(1+LPF->Wb*LPF->dt)) +
LPF->last_output*(1/(1+LPF->Wb*LPF->dt));
}
下图中Wc=1/RC
云台电机参数
电机内部参数
相电阻:Rs=1.8欧
相电感:Ls=5.7810^-3H
转矩常数:Kt= 0.741 NM/A 1/Kt=
转动惯量:J= KG-m^2
电机接收数据:-16384到+16384(-3A到3A)
电机反馈:速度RPM
rad/s= (2π×rpm)/60=0.1047 rpm
rpm = 30/π * rad/s = 9.549296748407161 * rad/s
C板陀螺仪:频率1KHz=延迟0.001s
控制器设计
云台电流环未知,假设带宽=5000HZ
测试J:
输入2000:
给定电流2000*(3/16384)=0.3662109375A
转矩常数:Kt= 0.741 NM/A
-16384到+16384(-3A到3A)
Te=IKt=0.3662109375 * 0.741=0.2713623046875 Nm
J = Te / dV Kgm^2
J =Te/8 =0.0339202880859375
输入3000:
Te=3000*(3/16384)*0.741=0.40704345703125
J=Te / dV=Te / 13.94 = 0.03