#ifndef __DEVICE_SPEED_BLDC_H_
#define __DEVICE_SPEED_BLDC_H_
#include "ptz_type_select.h"

#ifdef PTZ_BLDC_MOTOR


#ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D
     
      #define PID_B      1
      //水平速度小于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_LESS   0.4 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_LESS     1.6 //水平比例调速增加的倍数
      //水平速度大于设定速度时
//      #define PTZ_HORI_PRO_ADD_RANGE_MORE   0.5 //水平比例调速的范围
//      #define PTZ_HORI_PRO_ADD_MUL_MORE     0.8 //水平比例调速增加的倍数 
      //垂直速度小于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_LESS   0.4 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_LESS     1.2 //垂直比例调速增加的倍数

      #define PTZ_PID_HALL_SPEED               1

      #define PTZ_HORI_PID_T             30u
      #define PTZ_HORI_PID_HORI_KP       3.5//4//1.4   //0.014//0.005   //比例系数
      #define PTZ_HORI_PID_HORI_TI       100.0    //积分系数
      #define PTZ_HORI_PID_HORI_TD       0.0        //微分系数

      #define PTZ_HORI_PID_INPUT_LIMIT   100//6.91//PID调速输入值限定
      #define PTZ_HORI_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异
      

      #define PTZ_VERT_PID_T             20u
      #define PTZ_VERT_PID_VERT_KP       3//2//1.4    //0.014//0.005   //比例系数
      #define PTZ_VERT_PID_VERT_TI       100.0    //积分系数
      #define PTZ_VERT_PID_VERT_TD       0.0        //微分系数

      #define PTZ_VERT_PID_INPUT_LIMIT   100//4.0//PID调速输入值限定
      #define PTZ_VERT_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异
      
      
      #define PTZ_HORI_PID_T_MAX         75//50u//PID调速最大周期
      #define PTZ_VERT_PID_T_MAX         75//50u//PID调速最大周期


      #define PTZ_HORI_PID_ADD           30//PID调速快速增量
      #define PTZ_VERT_PID_ADD           30//PID调速快速增量

      #define PTZ_HORI_PID_ADD_A           10//10//PID调速快速增量
      #define PTZ_VERT_PID_ADD_A           10//15//PID调速快速增量
     
#endif

#ifdef PTZ_MEDIUM_WORM_L6235D_AS5047D

      #define PID_B      1
      //水平速度小于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_LESS   0.4 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_LESS     1.2 //水平比例调速增加的倍数
      //水平速度大于设定速度时
//      #define PTZ_HORI_PRO_ADD_RANGE_MORE   0.5 //水平比例调速的范围
//      #define PTZ_HORI_PRO_ADD_MUL_MORE     0.8 //水平比例调速增加的倍数 
      //垂直速度小于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_LESS   0.4 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_LESS     1.2 //垂直比例调速增加的倍数
      //垂直速度大于设定速度时
//      #define PTZ_VERT_PRO_ADD_RANGE_MORE   0.5 //垂直比例调速的范围
//      #define PTZ_VERT_PRO_ADD_MUL_MORE     0.8 //垂直比例调速增加的倍数 

      //#define PID_A      1
      // #define PTZ_HORI_PID_AS5048A_ANGLE_ASY_SPEED   2//角度变化异步
      // #define PTZ_VERT_PID_AS5048A_ANGLE_ASY_SPEED   2//角度变化异步
      //通过芯片反馈测速
      //#define  PTZ_HORI_PID_JY02A_SPEED
      //#define  PTZ_VERT_PID_JY02A_SPEED
      #define PTZ_PID_HALL_SPEED               1

      #define PTZ_HORI_PID_T             30u
      #define PTZ_HORI_PID_HORI_KP       15.0//0.6//1.0//6.0//比例系数
      #define PTZ_HORI_PID_HORI_TI       100.0//80.0//100.0//积分系数
      #define PTZ_HORI_PID_HORI_TD       0//0.001//微分系数

      #define PTZ_HORI_PID_INPUT_LIMIT   100.0//PID调速输入值限定
      #define PTZ_HORI_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异

      #define PTZ_VERT_PID_T             30u
      #define PTZ_VERT_PID_VERT_KP       20.0//6//6.0//比例系数
      #define PTZ_VERT_PID_VERT_TI       100.0//100.0//积分系数
      #define PTZ_VERT_PID_VERT_TD       0//0.001//微分系数

      #define PTZ_VERT_PID_INPUT_LIMIT   100.0//PID调速输入值限定
      #define PTZ_VERT_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异   

      #define PTZ_HORI_PID_T_MAX         80//75u//PID调速最大周期
      #define PTZ_VERT_PID_T_MAX         80//75u//PID调速最大周期

      #define PTZ_HORI_PID_ADD           20//PID调速快速增量
      #define PTZ_VERT_PID_ADD           20//PID调速快速增量

      #define PTZ_HORI_PID_ADD_A           15//PID调速快速增量
      #define PTZ_VERT_PID_ADD_A           15//PID调速快速增量

#endif

#ifdef PTZ_HEAVY_WORM_L6235D_AS5047D

      #define PID_B      1
      //水平速度小于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_LESS   0.4 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_LESS     1.4 //水平比例调速增加的倍数
      //水平速度大于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_MORE   0.5 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_MORE     0.8 //水平比例调速增加的倍数 
      //垂直速度小于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_LESS   0.4 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_LESS     1.4 //垂直比例调速增加的倍数
      //垂直速度大于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_MORE   0.5 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_MORE     0.8 //垂直比例调速增加的倍数 




      #define PTZ_PID_HALL_SPEED               1

//      #define PTZ_VERT_PID_as5047d_ANGLE_ASY_SPEED    1
//      #define PTZ_HORI_PID_as5047d_ANGLE_SYN_SPEED    1


      #define PTZ_HORI_PID_T             50u
      #define PTZ_HORI_PID_HORI_KP       10.0//3.0   //0.014//0.005   //比例系数
      #define PTZ_HORI_PID_HORI_TI       100.0    //积分系数
      #define PTZ_HORI_PID_HORI_TD       0.0        //微分系数

      #define PTZ_HORI_PID_INPUT_LIMIT   6.91//PID调速输入值限定
      #define PTZ_HORI_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异

      #define PTZ_VERT_PID_T             50u
      #define PTZ_VERT_PID_VERT_KP       20.0//3.0    //0.014//0.005   //比例系数
      #define PTZ_VERT_PID_VERT_TI       100.0    //积分系数
      #define PTZ_VERT_PID_VERT_TD       0.0        //微分系数

      #define PTZ_VERT_PID_INPUT_LIMIT   4.0//PID调速输入值限定
      #define PTZ_VERT_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异

      #define PTZ_HORI_PID_T_MAX         75//50u//PID调速最大周期
      #define PTZ_VERT_PID_T_MAX         75//50u//PID调速最大周期

      #define PTZ_HORI_PID_ADD           30//PID调速快速增量
      #define PTZ_VERT_PID_ADD           30//PID调速快速增量

      #define PTZ_HORI_PID_ADD_A           20//PID调速快速增量
      #define PTZ_VERT_PID_ADD_A           20//PID调速快速增量
#endif

#ifdef PTZ_SUPER_LIGHT_WORM_L6235D_AS5047D_12V
      #define PID_B      1
      //水平速度小于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_LESS   0.6 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_LESS     1.3 //水平比例调速增加的倍数
      //水平速度大于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_MORE   0.5 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_MORE     0.8 //水平比例调速增加的倍数 
      //垂直速度小于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_LESS   0.6 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_LESS     1.3 //垂直比例调速增加的倍数
      //垂直速度大于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_MORE   0.5 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_MORE     0.8 //垂直比例调速增加的倍数 




      //#define PTZ_HORI_PID_AS5048A_ANGLE_ASY_SPEED   2//角度变化异步
      //#define PTZ_VERT_PID_AS5048A_ANGLE_ASY_SPEED   2//角度变化异步
            //通过芯片反馈测速
      //#define  PTZ_HORI_PID_JY02A_SPEED
      //#define  PTZ_VERT_PID_JY02A_SPEED
      #define PTZ_PID_HALL_SPEED               1

      #define PTZ_HORI_PID_T             30u
      #define PTZ_HORI_PID_HORI_KP       2.0//6.0   //0.014//0.005   //比例系数
      #define PTZ_HORI_PID_HORI_TI       100.0    //积分系数
      #define PTZ_HORI_PID_HORI_TD       0.0        //微分系数

      #define PTZ_HORI_PID_INPUT_LIMIT   100.0//6.91//PID调速输入值限定
      #define PTZ_HORI_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异

      #define PTZ_VERT_PID_T             30u
      #define PTZ_VERT_PID_VERT_KP       2.0//6.0    //0.014//0.005   //比例系数
      #define PTZ_VERT_PID_VERT_TI       100.0    //积分系数
      #define PTZ_VERT_PID_VERT_TD       0.0        //微分系数

      #define PTZ_VERT_PID_INPUT_LIMIT   100.0//4.0//PID调速输入值限定
      #define PTZ_VERT_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异   

      #define PTZ_HORI_PID_T_MAX         100u//PID调速最大周期
      #define PTZ_VERT_PID_T_MAX         100u//PID调速最大周期

      #define PTZ_HORI_PID_ADD           20//40//PID调速快速增量
      #define PTZ_VERT_PID_ADD           20//40//PID调速快速增量

      #define PTZ_HORI_PID_ADD_A           15//PID调速快速增量
      #define PTZ_VERT_PID_ADD_A           15//PID调速快速增量

#endif


#ifdef PTZ_SUPER_LIGHT_WORM_L6235D_AS5047D_24V
      #define PID_B      1
      //水平速度小于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_LESS   0.4 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_LESS     1.2 //水平比例调速增加的倍数
      //水平速度大于设定速度时
      #define PTZ_HORI_PRO_ADD_RANGE_MORE   0.5 //水平比例调速的范围
      #define PTZ_HORI_PRO_ADD_MUL_MORE     0.8 //水平比例调速增加的倍数 
      //垂直速度小于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_LESS   0.4 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_LESS     1.2 //垂直比例调速增加的倍数
      //垂直速度大于设定速度时
      #define PTZ_VERT_PRO_ADD_RANGE_MORE   0.5 //垂直比例调速的范围
      #define PTZ_VERT_PRO_ADD_MUL_MORE     0.8 //垂直比例调速增加的倍数 




      //#define PTZ_HORI_PID_AS5048A_ANGLE_ASY_SPEED   2//角度变化异步
      //#define PTZ_VERT_PID_AS5048A_ANGLE_ASY_SPEED   2//角度变化异步
            //通过芯片反馈测速
      //#define  PTZ_HORI_PID_JY02A_SPEED
      //#define  PTZ_VERT_PID_JY02A_SPEED
      #define PTZ_PID_HALL_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_TD       0.0        //微分系数

      #define PTZ_HORI_PID_INPUT_LIMIT   100.0//PID调速输入值限定
      #define PTZ_HORI_PID_OUTPUT_LIMIT  200.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_TD       0.0        //微分系数

      #define PTZ_VERT_PID_INPUT_LIMIT   100.0//PID调速输入值限定
      #define PTZ_VERT_PID_OUTPUT_LIMIT  200.0//PID调速输出值限定，当前输出值和上一次输出值之间的差异   

      #define PTZ_HORI_PID_T_MAX         100u//PID调速最大周期
      #define PTZ_VERT_PID_T_MAX         100u//PID调速最大周期

      #define PTZ_HORI_PID_ADD           20//20//PID调速快速增量
      #define PTZ_VERT_PID_ADD           20//20//PID调速快速增量

      //#define PTZ_HORI_PID_ADD_A           15//PID调速快速增量
      //#define PTZ_VERT_PID_ADD_A           15//PID调速快速增量

#endif


//PID调速
#define PID_ADJUST_SPEED     0
//方向调速
#define DIRECTOR_ADJUST_SPEED   1

#ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D 
//通过方向PWM波提供反向力矩调速
//是否启用方向调速
#define PTZ_CONTROL_SPEED_L6235D  2
//方向调速总周期
#define PTZ_DIRECTOR_SPEED_T  10//20
#endif

void ptz_send_speed(char dev, char speed);
void init_speed_module(void);
void ptz_pid_Init();
void ptz_hori_pid_clear_zero();
void ptz_vert_pid_clear_zero();
void init_speed_module(void);
#endif

#endif