MW22-02A/APP/Device/Device_rotate/rotate_electricstable.c

220 lines
7.8 KiB
C

//云台电子稳定,由于直齿轮云台自锁能力太差,增加电子自锁功能。
//当云台处于滑动状态时,给予反向力矩,防止云台转动
#include "ptz_header_file.h"
//#include "device_rotate_electricstable.h"
//#include "device_rotate.h"
#ifdef PTZ_BLDC_MOTOR
#ifdef PTZ_ELECTRIC_STABLE_L6235D
//数据初始化
void ptz_hori_electric_stable_init()
{
g_ptz.hori_electric_stable.stable_stop_switch = 1;
g_ptz.hori_electric_stable.sample_count = 0;
g_ptz.hori_electric_stable.stable_sample_switch = 0;
g_ptz.hori_electric_stable.slide_dir_change_num = 0;
g_ptz.hori_electric_stable.stable_vref = 0;
memset(g_ptz.hori_electric_stable.stable_angle, 0, sizeof(g_ptz.hori_electric_stable.stable_angle));
}
void ptz_vert_electric_stable_init()
{
g_ptz.vert_electric_stable.stable_stop_switch = 1;
g_ptz.vert_electric_stable.torque_switch = 0;
g_ptz.vert_electric_stable.stop_hall_count = 0;
// g_ptz.vert_electric_stable.sample_count = 0;
// g_ptz.vert_electric_stable.stable_sample_switch = 0;
g_ptz.vert_electric_stable.slide_dir_change_num = 0;
g_ptz.vert_electric_stable.stable_vref = 0;
g_ptz.vert_electric_stable.stop_hall_count = 0;
g_ptz.vert_electric_stable.state = 0;
// memset(g_ptz.vert_electric_stable.stable_angle, 0, sizeof(g_ptz.vert_electric_stable.stable_angle));
}
static char ptz_vert_electric_stable_task()
{
if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP &&//判断是否处于刹车状态
g_ptz.vert_electric_stable.stable_stop_switch == 1 &&//刹车停止时间是否结束
g_ptz.vert_electric_stable.stop_hall_count > VERT_STOP_HALL_NUM)//刹车后霍尔脉冲满足多少个时
{
//判断反向力矩方向
g_ptz.vert_electric_stable.slide_direction_actual = g_ptz.vert_direction_actual;
if(g_ptz.vert_electric_stable.slide_direction_actual == PTZ_VERT_DIR_DOWN)
{//如果云台向下滑动
g_ptz.vert_electric_stable.reverse_torque_direction = PTZ_VERT_DIR_UP;
}
//如果云台向上滑动
if(g_ptz.vert_electric_stable.slide_direction_actual == PTZ_VERT_DIR_UP)
{
g_ptz.vert_electric_stable.reverse_torque_direction = PTZ_VERT_DIR_DOWN;
}
if(g_ptz.vert_electric_stable.torque_switch == 1)//判断刹车PWM的占空比
{
if(g_ptz.vert_electric_stable.reverse_torque_direction_a ==
g_ptz.vert_electric_stable.reverse_torque_direction)
{//如果力矩没有改变方向,则继续增大解除刹车占空比
g_ptz.vert_electric_stable.torque_start_t =
g_ptz.vert_electric_stable.torque_start_t + 1;
if(g_ptz.vert_electric_stable.torque_start_t > TORQUE_TOTAL_T)
{
g_ptz.vert_electric_stable.torque_start_t = TORQUE_TOTAL_T;
}
g_ptz.vert_electric_stable.torque_stop_t =
TORQUE_TOTAL_T - g_ptz.vert_electric_stable.torque_start_t;
}
else
{//如果力矩方向改变,则减少解除刹车占空比
if(g_ptz.vert_electric_stable.torque_start_t > 0)
{
g_ptz.vert_electric_stable.torque_start_t =
g_ptz.vert_electric_stable.torque_start_t - 1;
}
g_ptz.vert_electric_stable.torque_stop_t =
TORQUE_TOTAL_T - g_ptz.vert_electric_stable.torque_start_t;
}
}
if(g_ptz.vert_electric_stable.torque_switch == 0)//初始化反向力矩
{
//保存初始力矩方向
g_ptz.vert_electric_stable.reverse_torque_direction_a =
g_ptz.vert_electric_stable.reverse_torque_direction;
//输入反向力矩方向
l6235d_vert_set_direction(g_ptz.vert_electric_stable.reverse_torque_direction);
//输入指定模拟电压
g_ptz.vert_electric_stable.stable_vref = TORQUE_VREF;
adc7311_vert_vr(g_ptz.vert_electric_stable.stable_vref);
//计算刹车PWM波的初始刹车时间和解除刹车初始时间
g_ptz.vert_electric_stable.torque_start_t = TORQUE_TOTAL_T / 2;
g_ptz.vert_electric_stable.torque_stop_t =
TORQUE_TOTAL_T - g_ptz.vert_electric_stable.torque_start_t;
g_ptz.vert_electric_stable.torque_switch = 1;
}
g_ptz.vert_electric_stable.reverse_torque_direction_last =
g_ptz.vert_electric_stable.reverse_torque_direction;//保存上一次反向力矩的方向
g_ptz.vert_electric_stable.stop_hall_count --;
}
return 1;
}
static void ptz_vert_electric_stable_pwm_task()
{
while(1)
{
static char flag;
if(g_ptz.vert_start_stop_set == PTZ_VERT_START && flag == 1)
{//防止反向力矩PWM波干扰电机正常启动
flag = 0;
l6235d_vert_start_stop(PTZ_VERT_START);
}
if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP &&
g_ptz.vert_electric_stable.torque_switch == 1)
{//提供刹车用的PWM波
if(g_ptz.vert_electric_stable.torque_start_t > 0)
{
l6235d_vert_start_stop(PTZ_VERT_START);//启动
OSTimeDlyHMSM(0u, 0u, 0u, g_ptz.vert_electric_stable.torque_start_t);
}
if(g_ptz.vert_electric_stable.torque_stop_t > 0)
{
l6235d_vert_start_stop(PTZ_VERT_STOP); //刹车
OSTimeDlyHMSM(0u, 0u, 0u, g_ptz.vert_electric_stable.torque_stop_t);
}
flag = 1;
}
else
{
OSTimeDlyHMSM(0u, 0u, 0u, STABLE_T);
}
}
}
//#define TASK_VERT_ELECTRIC_STABLE_PWM_PRIO 17u
//#define TASK_VERT_ELECTRIC_STABLE_PWM_SIZE 100u
static OS_STK task_vert_electric_stable_pwm_stk[TASK_VERT_ELECTRIC_STABLE_PWM_SIZE];
static void creat_task_vert_electric_stable_pwm(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_vert_electric_stable_pwm_task,
(void *) 0,
(OS_STK *)&task_vert_electric_stable_pwm_stk[TASK_VERT_ELECTRIC_STABLE_PWM_SIZE - 1],
(INT8U ) TASK_VERT_ELECTRIC_STABLE_PWM_PRIO,
(INT16U ) TASK_VERT_ELECTRIC_STABLE_PWM_PRIO,
(OS_STK *)&task_vert_electric_stable_pwm_stk[0],
(INT32U ) TASK_VERT_ELECTRIC_STABLE_PWM_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_VERT_ELECTRIC_STABLE_PWM_PRIO, "ptz_vert_electric_stable_pwm_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_vert_electric_stable_pwm_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_vert_electric_stable_pwm_task failed...\n\r");
}
}
static void ptz_electric_stable_task()
{
while(1)
{
ptz_vert_electric_stable_task();
//ptz_hori_electric_stable_task();
g_ptz.hori_electric_stable.state = 0;
OSTimeDlyHMSM(0u, 0u, 0u, STABLE_T);
g_ptz.hori_electric_stable.state = 1;
}
}
static OS_STK task_electric_stable_stk[TASK_ELECTRIC_STABLE_STK_SIZE];
static void creat_task_electric_stable(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_electric_stable_task,
(void *) 0,
(OS_STK *)&task_electric_stable_stk[TASK_ELECTRIC_STABLE_STK_SIZE - 1],
(INT8U ) TASK_ELECTRIC_STABLE_PRIO,
(INT16U ) TASK_ELECTRIC_STABLE_PRIO,
(OS_STK *)&task_electric_stable_stk[0],
(INT32U ) TASK_ELECTRIC_STABLE_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_ELECTRIC_STABLE_PRIO, "ptz_electric_stable_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_electric_stable_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_electric_stable_task failed...\n\r");
}
}
#endif
#endif
void task_electric_stable_init(void)
{
#ifdef PTZ_BLDC_MOTOR
#ifdef PTZ_ELECTRIC_STABLE_ON
creat_task_electric_stable();
#ifdef PTZ_ELECTRIC_STABLE_L6235D
creat_task_vert_electric_stable_pwm();
#endif
#endif
#endif
}