更改速度计算方式和相电流计算方式
This commit is contained in:
parent
9b021d1a0d
commit
203a25e7a7
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"files.associations": {
|
||||
"bsp_os.h": "c",
|
||||
"cmath": "c"
|
||||
}
|
||||
}
|
|
@ -9,6 +9,10 @@
|
|||
|
||||
#ifdef PTZ_BLDC_MOTOR
|
||||
|
||||
static volatile float tempSpeedH = 0;
|
||||
static volatile float tempSpeedV = 0;
|
||||
|
||||
|
||||
//发送云台实际转速
|
||||
void ptz_send_speed(char dev, char speed)
|
||||
{
|
||||
|
@ -64,9 +68,9 @@ void ptz_pid_init()
|
|||
g_ptz.hori_pid.TD = PTZ_HORI_PID_HORI_TD;//微分常数
|
||||
g_ptz.hori_pid.T = PTZ_HORI_PID_T / 1000.0;//采样周期
|
||||
//三个简化参数A,B,C
|
||||
g_ptz.hori_pid.A = g_ptz.hori_pid.KP * (1 + g_ptz.hori_pid.T / g_ptz.hori_pid.TI + g_ptz.hori_pid.TD);
|
||||
g_ptz.hori_pid.B = g_ptz.hori_pid.KP * (1 + 2 * g_ptz.hori_pid.TD / g_ptz.hori_pid.T);
|
||||
g_ptz.hori_pid.C = g_ptz.hori_pid.KP * (g_ptz.hori_pid.TD / g_ptz.hori_pid.T);
|
||||
// g_ptz.hori_pid.A = g_ptz.hori_pid.KP * (1 + g_ptz.hori_pid.T / g_ptz.hori_pid.TI + g_ptz.hori_pid.TD);
|
||||
// g_ptz.hori_pid.B = g_ptz.hori_pid.KP * (1 + 2 * g_ptz.hori_pid.TD / g_ptz.hori_pid.T);
|
||||
// g_ptz.hori_pid.C = g_ptz.hori_pid.KP * (g_ptz.hori_pid.TD / g_ptz.hori_pid.T);
|
||||
|
||||
g_ptz.vert_pid.SumError = 0;//累计误差
|
||||
g_ptz.vert_pid.LastError = 0;//上一次输入偏差
|
||||
|
@ -78,9 +82,10 @@ void ptz_pid_init()
|
|||
g_ptz.vert_pid.TD = PTZ_VERT_PID_VERT_TD;//微分常数
|
||||
g_ptz.vert_pid.T = PTZ_VERT_PID_T / 1000.0;//采样周期
|
||||
//三个简化参数A,B,C
|
||||
g_ptz.vert_pid.A = g_ptz.vert_pid.KP * (1 + g_ptz.vert_pid.T / g_ptz.vert_pid.TI + g_ptz.vert_pid.TD);
|
||||
g_ptz.vert_pid.B = g_ptz.vert_pid.KP * (1 + 2 * g_ptz.vert_pid.TD / g_ptz.vert_pid.T);
|
||||
g_ptz.vert_pid.C = g_ptz.vert_pid.KP * (g_ptz.vert_pid.TD / g_ptz.vert_pid.T);
|
||||
// g_ptz.vert_pid.A = g_ptz.vert_pid.KP * (1 + g_ptz.vert_pid.T / g_ptz.vert_pid.TI + g_ptz.vert_pid.TD);
|
||||
// g_ptz.vert_pid.B = g_ptz.vert_pid.KP * (1 + 2 * g_ptz.vert_pid.TD / g_ptz.vert_pid.T);
|
||||
// g_ptz.vert_pid.C = g_ptz.vert_pid.KP * (g_ptz.vert_pid.TD / g_ptz.vert_pid.T);
|
||||
|
||||
}
|
||||
|
||||
void ptz_hori_pid_clear_zero()
|
||||
|
@ -108,7 +113,9 @@ static float ptz_hori_pid_calculate(float H_SampSpeed)
|
|||
// H_IError = PTZ_HORI_PID_INPUT_LIMIT * -1;
|
||||
// }
|
||||
//增量计算
|
||||
H_IIncPid = g_ptz.hori_pid.A * H_IError + g_ptz.hori_pid.B * g_ptz.hori_pid.LastError + g_ptz.hori_pid.C * g_ptz.hori_pid.PrevError;
|
||||
// H_IIncPid = g_ptz.hori_pid.A * H_IError + g_ptz.hori_pid.B * g_ptz.hori_pid.LastError + g_ptz.hori_pid.C * g_ptz.hori_pid.PrevError;
|
||||
H_IIncPid = g_ptz.hori_pid.KP * (H_IError - g_ptz.hori_pid.LastError) + g_ptz.hori_pid.TI * H_IError;
|
||||
|
||||
//存储误差,用于下次计算
|
||||
g_ptz.hori_pid.PrevError = g_ptz.hori_pid.LastError;
|
||||
g_ptz.hori_pid.LastError = H_IError;
|
||||
|
@ -121,6 +128,10 @@ static float ptz_hori_pid_calculate(float H_SampSpeed)
|
|||
//新调速方式
|
||||
static void ptz_hori_pid_task()
|
||||
{
|
||||
|
||||
|
||||
OSTimeDlyHMSM(0u, 0u, 0u, 1000u);
|
||||
|
||||
unsigned int time = 0;
|
||||
char i = 0;
|
||||
while(1)
|
||||
|
@ -581,6 +592,35 @@ static void ptz_hori_pid_task()
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef PTZ_PID_AS5047_SPEED
|
||||
|
||||
static float lastAngle = 0;
|
||||
static float lastTime = 0;
|
||||
float angle = 0;
|
||||
float time = 0;
|
||||
|
||||
OSTimeDlyHMSM(0u, 0u, 0u, 20u);
|
||||
/* 读取到正确速度为止 */
|
||||
start:
|
||||
angle = as5047d_hori_get_angle_a();
|
||||
time = OSTimeGet();
|
||||
if (angle < 0 || //防止读出的角度为负值
|
||||
angle > 360.0||//防止读出的数值超过360
|
||||
isnan(angle) == 1) {//防止读出的不是一个数
|
||||
//以上错误的数据都该舍弃,从新读取
|
||||
goto start;
|
||||
}
|
||||
|
||||
float angleDifference = fabs(angle - lastAngle);
|
||||
if (angleDifference < 3) {
|
||||
// goto start;
|
||||
return;
|
||||
}
|
||||
|
||||
float timeDifference = fabs(time - lastTime);
|
||||
g_ptz.hori_speed_actual = angleDifference / timeDifference / PTZ_HORI_RATIO * 1000;
|
||||
|
||||
#endif
|
||||
|
||||
/*由于系统实时调节能力不足将调速分为两个部分:
|
||||
1.启动时首先进入直线比例快速提速;
|
||||
|
@ -646,6 +686,8 @@ static void ptz_hori_pid_task()
|
|||
g_ptz.hori_pid.PidUT_float = PTZ_HORI_VR_MAX;
|
||||
}
|
||||
|
||||
tempSpeedH = g_ptz.hori_pid.PidUT_float;
|
||||
|
||||
g_ptz.hori_pid.PidUT_uint = (unsigned int)(g_ptz.hori_pid.PidUT_float + 0.5);
|
||||
|
||||
//限制PID的输出值在某个指定的范围
|
||||
|
@ -754,7 +796,9 @@ static float ptz_vert_pid_calculate(float SampSpeed)
|
|||
// IError = PTZ_VERT_PID_INPUT_LIMIT * -1;
|
||||
// }
|
||||
//增量计算
|
||||
IIncPid = g_ptz.vert_pid.A * IError + g_ptz.vert_pid.B * g_ptz.vert_pid.LastError + g_ptz.vert_pid.C * g_ptz.vert_pid.PrevError;
|
||||
// IIncPid = g_ptz.vert_pid.A * IError + g_ptz.vert_pid.B * g_ptz.vert_pid.LastError + g_ptz.vert_pid.C * g_ptz.vert_pid.PrevError;
|
||||
IIncPid = g_ptz.vert_pid.KP * (IError - g_ptz.vert_pid.LastError) + g_ptz.vert_pid.TI * IError;
|
||||
|
||||
//存储误差,用于下次计算
|
||||
g_ptz.vert_pid.PrevError = g_ptz.vert_pid.LastError;
|
||||
g_ptz.vert_pid.LastError = IError;
|
||||
|
@ -1219,6 +1263,33 @@ static void ptz_vert_pid_task()
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef PTZ_PID_AS5047_SPEED
|
||||
static float lastAngle = 0;
|
||||
static float lastTime = 0;
|
||||
float angle = 0;
|
||||
float time = 0;
|
||||
|
||||
OSTimeDlyHMSM(0u, 0u, 0u, 20u);
|
||||
/* 读取到正确速度为止 */
|
||||
start:
|
||||
angle = as5047d_vert_get_angle_a();
|
||||
time = OSTimeGet();
|
||||
if (angle < 0 || //防止读出的角度为负值
|
||||
angle > 360.0||//防止读出的数值超过360
|
||||
isnan(angle) == 1) {//防止读出的不是一个数
|
||||
//以上错误的数据都该舍弃,从新读取
|
||||
goto start;
|
||||
}
|
||||
|
||||
float angleDifference = fabs(angle - lastAngle);
|
||||
if (angleDifference < 3) {
|
||||
// goto start;
|
||||
return;
|
||||
}
|
||||
|
||||
float timeDifference = fabs(time - lastTime);
|
||||
g_ptz.vert_speed_actual = angleDifference / timeDifference / PTZ_VERT_RATIO * 166.667f;
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
|
@ -1304,6 +1375,8 @@ static void ptz_vert_pid_task()
|
|||
|
||||
g_ptz.vert_pid.PidUT_uint = (unsigned int)(g_ptz.vert_pid.PidUT_float + 0.5);
|
||||
|
||||
tempSpeedV = g_ptz.vert_pid.PidUT_float;
|
||||
|
||||
//限制PID的输出值在某个指定的范围
|
||||
if(g_ptz.vert_pid.PidUT_uint <= PTZ_VERT_VR_MIN)//限制输入模拟电压最小值
|
||||
{
|
||||
|
|
|
@ -228,23 +228,25 @@
|
|||
//通过芯片反馈测速
|
||||
//#define PTZ_HORI_PID_JY02A_SPEED
|
||||
//#define PTZ_VERT_PID_JY02A_SPEED
|
||||
#define PTZ_PID_HALL_SPEED 1
|
||||
// #define PTZ_PID_HALL_SPEED 1
|
||||
|
||||
#define PTZ_PID_AS5047_SPEED 1
|
||||
|
||||
#define PTZ_HORI_PID_T 30u
|
||||
#define PTZ_HORI_PID_HORI_KP 20.0//比例系数
|
||||
#define PTZ_HORI_PID_HORI_TI 100.0 //积分系数
|
||||
#define PTZ_HORI_PID_HORI_KP 100.0//比例系数
|
||||
#define PTZ_HORI_PID_HORI_TI 30.0 //积分系数
|
||||
#define PTZ_HORI_PID_HORI_TD 0.0 //微分系数
|
||||
|
||||
#define PTZ_HORI_PID_INPUT_LIMIT 100.0//PID调速输入值限定
|
||||
#define PTZ_HORI_PID_OUTPUT_LIMIT 200.0//PID调速输出值限定,当前输出值和上一次输出值之间的差异
|
||||
#define PTZ_HORI_PID_OUTPUT_LIMIT 50.0//PID调速输出值限定,当前输出值和上一次输出值之间的差异
|
||||
|
||||
#define PTZ_VERT_PID_T 30u
|
||||
#define PTZ_VERT_PID_VERT_KP 20.0//比例系数
|
||||
#define PTZ_VERT_PID_VERT_TI 100.0 //积分系数
|
||||
#define PTZ_VERT_PID_VERT_KP 100.0//比例系数
|
||||
#define PTZ_VERT_PID_VERT_TI 30.0 //积分系数
|
||||
#define PTZ_VERT_PID_VERT_TD 0.0 //微分系数
|
||||
|
||||
#define PTZ_VERT_PID_INPUT_LIMIT 100.0//PID调速输入值限定
|
||||
#define PTZ_VERT_PID_OUTPUT_LIMIT 200.0//PID调速输出值限定,当前输出值和上一次输出值之间的差异
|
||||
#define PTZ_VERT_PID_OUTPUT_LIMIT 50.0//PID调速输出值限定,当前输出值和上一次输出值之间的差异
|
||||
|
||||
#define PTZ_HORI_PID_T_MAX 100u//PID调速最大周期
|
||||
#define PTZ_VERT_PID_T_MAX 100u//PID调速最大周期
|
||||
|
|
|
@ -14,23 +14,35 @@ static char ptz_temp_volt_current_fault_detect_task()
|
|||
static unsigned short int time_ms;
|
||||
|
||||
time_ms ++;
|
||||
|
||||
static unsigned char hCurrCount = 0;
|
||||
static unsigned char vCurrCount = 0;
|
||||
|
||||
|
||||
if(time_ms < 50)
|
||||
{
|
||||
//轻型云台峰值电流5.4A,
|
||||
if(H_ADC_Collect.Phase_curr_V >= PHASE_CURRENT ||H_ADC_Collect.Phase_curr_U >= PHASE_CURRENT ||H_ADC_Collect.Phase_curr_W >= PHASE_CURRENT )
|
||||
{//堵转检测,防止电机堵转烧坏,结合电机卡死故障监测,与云台工作电流监测。
|
||||
|
||||
if (3 < hCurrCount++) {
|
||||
g_ptz.fault_detect.Phase_curr_H = FAULT;//水平电机相电流过大,报警
|
||||
|
||||
ptz_hori_stop(PTZ_HORI_STOP_TIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
hCurrCount = 0;
|
||||
|
||||
if(V_ADC_Collect.Phase_curr_V >= PHASE_CURRENT ||V_ADC_Collect.Phase_curr_U >= PHASE_CURRENT ||V_ADC_Collect.Phase_curr_W >= PHASE_CURRENT )
|
||||
{//堵转检测,防止电机堵转烧坏,结合电机卡死故障监测,与云台工作电流监测。
|
||||
|
||||
if (3 < vCurrCount++) {
|
||||
g_ptz.fault_detect.Phase_curr_V = FAULT;//垂直电机相电流过大,报警
|
||||
|
||||
ptz_vert_stop(PTZ_VERT_STOP_TIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
vCurrCount = 0;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -718,11 +718,11 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>OCOutputOverride</name>
|
||||
<state>1</state>
|
||||
<state>0</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OOCOutputFile</name>
|
||||
<state>LW21_01B-3S24_BLDC_V20-SV20_24052101.bin</state>
|
||||
<state>OS2.bin</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>OOCCommandLineProducer</name>
|
||||
|
@ -761,7 +761,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>IlinkOutputFile</name>
|
||||
<state>gd32f4xx.out</state>
|
||||
<state>gd32f4xx.elf</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>IlinkDebugInfoEnable</name>
|
||||
|
@ -825,7 +825,7 @@
|
|||
</option>
|
||||
<option>
|
||||
<name>IlinkIcfFile</name>
|
||||
<state>D:\psx\Pan-Tilt\1.software\HY\4.0 LW21-01B\BSP\IAR\GD32F450xE_APP.icf</state>
|
||||
<state>D:\psx\Pan-Tilt\1.software\HY\4.0 LW21-01B\BSP\IAR\GD32F450xE.icf</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>IlinkIcfFileSlave</name>
|
||||
|
|
Loading…
Reference in New Issue