#ifndef _TMC2160_H_ #define _TMC2160_H_ #include "ptz_type_select.h" #include "gd32f4xx_gpio.h" #include "agent_hyt.h" #ifdef TMC2160 #define ADD 0x80 #define TMC2160_GCONF 0x00 //((ADD | TMC2160_GCONF)<<32) | 0x314c,,使能DIAG0输出过热预警,DIAG1输出堵转信号 #define TMC2160_GSTAT 0x01 //((ADD | TMC2160_GSTAT)<<32) | 0x07,读写1清零,状态标志 #define TMC2160_IOIN 0x04 //只读,外设引脚状态 #define TMC2160_SHORT_CONF 0x09 //短路保护 #define TMC2160_DRV_CONF 0x0A //((ADD | TMC2160_DRV_CONF)<<32) | 0x0820 #define TMC2160_GLOBAL_SCALER 0x0B //写0 #define TMC2160_IHOLD_IRUN 0x10 //8-12为设置电流,其余设置0,如0x14:((ADD | TMC2160_IHOLD_IRUN)<<32)|(0x14<<8) #define TMC2160_TPOWERDOWN 0x11 //((ADD | TMC2160_TPOWERDOWN)<<32) | 0x02 #define TMC2160_TSTEP 0x12 //只读 #define TMC2160_TPWMTHRS 0x13 #define TMC2160_TCOOLTHRS 0x14 #define TMC2160_THIGH 0x15 #define TMC2160_XDIRECT 0x2D #define TMC2160_VDCMIN 0x33 #define TMC2160_MSLUT0 0x60 #define TMC2160_MSLUT1 0x61 #define TMC2160_MSLUT2 0x62 #define TMC2160_MSLUT3 0x63 #define TMC2160_MSLUT4 0x64 #define TMC2160_MSLUT5 0x65 #define TMC2160_MSLUT6 0x66 #define TMC2160_MSLUT7 0x67 #define TMC2160_MSLUTSEL 0x68 #define TMC2160_MSLUTSTART 0x69 #define TMC2160_MSCNT 0x6A #define TMC2160_MSCURACT 0x6B #define TMC2160_CHOPCONF 0x6C //((ADD | TMC2160_CHOPCONF)<<32) | 0x5110083,24-27位配置细分,最后左移24位 #define TMC2160_COOLCONF 0x6D //智能电流控制 #define TMC2160_DCCTRL 0x6E //不用 #define TMC2160_DRV_STATUS 0x6F //只读 #define TMC2160_PWMCONF 0x70 //((ADD | TMC2160_PWMCONF)<<32) | 0xc401321e,时钟35.1KHZ #define TMC2160_PWM_SCALE 0x71 //只读,斩波调幅结果 #define TMC2160_PWM_AUTO 0x72 //只读,自动标定的偏移值 #define TMC2160_LOST_STEPS 0x73 //只读, /* 驱动器电源控制引脚 */ #define TMC2160_H_POWER_OFF gpio_bit_reset(GPIOE,GPIO_PIN_0) #define TMC2160_H_POWER_ON gpio_bit_set(GPIOE,GPIO_PIN_0) #define TMC2160_V_POWER_OFF gpio_bit_reset(GPIOE,GPIO_PIN_1) #define TMC2160_V_POWER_ON gpio_bit_set(GPIOE,GPIO_PIN_1) /// ===== SPI配置 ===== #define TMC2160_SCLK_LOW gpio_bit_reset(GPIOE,GPIO_PIN_13) #define TMC2160_SCLK_HIGH gpio_bit_set(GPIOE,GPIO_PIN_13) #define TMC2160_SDATI_0 gpio_bit_reset(GPIOE,GPIO_PIN_14) #define TMC2160_SDATI_1 gpio_bit_set(GPIOE,GPIO_PIN_14) #define TMC2160_SDATO_READ gpio_input_bit_get(GPIOE, GPIO_PIN_15) // #define TMC2160_SDATO_0 drv_gpio_clrbit(TMC2160_SDATO_PORT,TMC2160_SDATO_PIN) // #define TMC2160_SDATO_1 drv_gpio_setbit(TMC2160_SDATO_PORT,TMC2160_SDATO_PIN) /// ===== 水平驱动器配置 ===== /// ===== 引脚定义 ===== /// ===== IO模式 ===== //SPI片选输出设置 #define TMC2160_HORI_CSN_ENABLE gpio_bit_reset(GPIOD,GPIO_PIN_15) //低电平使能SPI #define TMC2160_HORI_CSN_DISABLE gpio_bit_set(GPIOD,GPIO_PIN_15) //故障接收,低电平为正常状态,用于故障检测读取 #define TMC2160_HORI_DIAG1_READ gpio_input_bit_get(GPIOD, GPIO_PIN_13) #define TMC2160_HORI_DIAG0_READ gpio_input_bit_get(GPIOD, GPIO_PIN_14) //转向设置,R反转,F正转 #define TMC2160_HORI_DIR_R gpio_bit_reset(GPIOD,GPIO_PIN_11) //电机转向 #define TMC2160_HORI_DIR_F gpio_bit_set(GPIOD,GPIO_PIN_11) //驱动器使能,初始化为低电平,失能驱动器 #define TMC2160_HORI_DISABLE gpio_bit_set(GPIOD,GPIO_PIN_10) //驱动器低电平使能 #define TMC2160_HORI_ENABLE gpio_bit_reset(GPIOD,GPIO_PIN_10) /// ===== 垂直驱动器配置 ===== /// ===== 引脚定义 ===== /// ===== IO模式 ===== //SPI片选输出设置 #define TMC2160_VERT_CSN_ENABLE gpio_bit_reset(GPIOA,GPIO_PIN_11) //低电平使能SPI #define TMC2160_VERT_CSN_DISABLE gpio_bit_set(GPIOA,GPIO_PIN_11) //故障接收,低电平为正常状态 #define TMC2160_VERT_DIAG1_READ gpio_input_bit_get(GPIOA, GPIO_PIN_8) #define TMC2160_VERT_DIAG0_READ gpio_input_bit_get(GPIOC, GPIO_PIN_9) //转向设置,R反转,F正转 #define TMC2160_VERT_DIR_R gpio_bit_reset(GPIOC,GPIO_PIN_8) //电机转向 #define TMC2160_VERT_DIR_F gpio_bit_set(GPIOC,GPIO_PIN_8) //驱动器使能,初始化为低电平,失能驱动器 #define TMC2160_VERT_DISABLE gpio_bit_set(GPIOC,GPIO_PIN_7) //低电平使能 #define TMC2160_VERT_ENABLE gpio_bit_reset(GPIOC,GPIO_PIN_7) /// ===== 步进电机分频 ===== #define TMC2160_1_1_STEP 0 #define TMC2160_1_2_STEP 1 #define TMC2160_1_4_STEP 2 #define TMC2160_1_8_STEP 3 #define TMC2160_1_16_STEP 4 #define TMC2160_1_32_STEP 5 #define TMC2160_1_64_STEP 6 #define TMC2160_1_128_STEP 7 #define TMC2160_1_256_STEP 8 #ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V /// ===== 水平电机速度 ===== // 1/8细分 #define PTZ_HORI_1_8_STEP_V_MAX 0.0//750.0 //允许的最大转速r/minPTZ_HORI_MOTOR_MAX_SPEED #define PTZ_HORI_1_8_STEP_V_MIN 0.0//500.0 //允许的最小转速r/min // 1/16细分 #define PTZ_HORI_1_16_STEP_V_MAX 500.0 //允许的最大转速r/min #define PTZ_HORI_1_16_STEP_V_MIN 250.0 //允许的最小转速r/min // 1/32细分 #define PTZ_HORI_1_32_STEP_V_MAX 250.0 //允许的最大转速r/min #define PTZ_HORI_1_32_STEP_V_MIN 100.0 //允许的最小转速r/min // 1/64细分 #define PTZ_HORI_1_64_STEP_V_MAX 100.0 //允许的最大转速r/min #define PTZ_HORI_1_64_STEP_V_MIN 1.0//50.0 //允许的最小转速r/min // 1/128细分 #define PTZ_HORI_1_128_STEP_V_MAX 0.0//50.0 //允许的最大转速r/min #define PTZ_HORI_1_128_STEP_V_MIN 0.0//1.0 //允许的最小转速r/min /// ===== 垂直电机速度 ===== // 1/8细分 //#define PTZ_VERT_1_8_STEP_V_MAX PTZ_VERT_MOTOR_MAX_SPEED//210.0//允许的最大转速r/min //#define PTZ_VERT_1_8_STEP_V_MIN 50.0//128.0 //允许的最小转速r/min // 1/16细分 #define PTZ_VERT_1_16_STEP_V_MAX 0.0//500.0//128.0//允许的最大转速r/min #define PTZ_VERT_1_16_STEP_V_MIN 0.0//250.0//37.0 //允许的最小转速r/min // 1/32细分 #define PTZ_VERT_1_32_STEP_V_MAX 300.0//允许的最大转速r/min #define PTZ_VERT_1_32_STEP_V_MIN 100.0 //允许的最小转速r/min // 1/64细分 #define PTZ_VERT_1_64_STEP_V_MAX 100.0//18.0//允许的最大转速r/min #define PTZ_VERT_1_64_STEP_V_MIN 50.0 //允许的最小转速r/min // 1/128细分 #define PTZ_VERT_1_128_STEP_V_MAX 50.0//允许的最大转速r/min #define PTZ_VERT_1_128_STEP_V_MIN 1.0 //允许的最小转速r/min #endif #ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V /// ===== 水平电机速度 ===== // 1/8细分 #define PTZ_HORI_1_8_STEP_V_MAX 750.0 //允许的最大转速r/minPTZ_HORI_MOTOR_MAX_SPEED #define PTZ_HORI_1_8_STEP_V_MIN 500.0 //允许的最小转速r/min // 1/16细分 #define PTZ_HORI_1_16_STEP_V_MAX 500.0 //允许的最大转速r/min #define PTZ_HORI_1_16_STEP_V_MIN 250.0 //允许的最小转速r/min // 1/32细分 #define PTZ_HORI_1_32_STEP_V_MAX 250.0 //允许的最大转速r/min #define PTZ_HORI_1_32_STEP_V_MIN 100.0 //允许的最小转速r/min // 1/64细分 #define PTZ_HORI_1_64_STEP_V_MAX 100.0 //允许的最大转速r/min #define PTZ_HORI_1_64_STEP_V_MIN 1.0//50.0 //允许的最小转速r/min // 1/128细分 #define PTZ_HORI_1_128_STEP_V_MAX 0.0//50.0 //允许的最大转速r/min #define PTZ_HORI_1_128_STEP_V_MIN 0.0//1.0 //允许的最小转速r/min /// ===== 垂直电机速度 ===== // 1/8细分 //#define PTZ_VERT_1_8_STEP_V_MAX PTZ_VERT_MOTOR_MAX_SPEED//210.0//允许的最大转速r/min //#define PTZ_VERT_1_8_STEP_V_MIN 50.0//128.0 //允许的最小转速r/min // 1/16细分 #define PTZ_VERT_1_16_STEP_V_MAX 500.0//128.0//允许的最大转速r/min #define PTZ_VERT_1_16_STEP_V_MIN 250.0//37.0 //允许的最小转速r/min // 1/32细分 #define PTZ_VERT_1_32_STEP_V_MAX 250.0//允许的最大转速r/min #define PTZ_VERT_1_32_STEP_V_MIN 100.0 //允许的最小转速r/min // 1/64细分 #define PTZ_VERT_1_64_STEP_V_MAX 100.0//18.0//允许的最大转速r/min #define PTZ_VERT_1_64_STEP_V_MIN 50.0 //允许的最小转速r/min // 1/128细分 #define PTZ_VERT_1_128_STEP_V_MAX 50.0//允许的最大转速r/min #define PTZ_VERT_1_128_STEP_V_MIN 1.0 //允许的最小转速r/min #endif /// ===== 加减速默认时间 ===== #define PTZ_HORI_ACC_TIME_MAX 3000.0 //从0加速到最大速度所需要的时间,单位毫秒 #define PTZ_HORI_DEC_TIME_MAX 1000.0 //从0减速到最刹车速度所需要的时间 设定减速 #define PTZ_HORI_DEC_TIME_DEF 1000.0 //从0减速到最刹车速度所需要的时间 快速减速 #define PTZ_VERT_ACC_TIME_MAX 3000.0//从0加速到最大速度所需要的时间 #define PTZ_VERT_DEC_TIME_MAX 1000.0 //从0减速到最刹车速度所需要的时间 设定减速 #define PTZ_VERT_DEC_TIME_DEF 1000.0 //从0减速到最刹车速度所需要的时间 快速减速 /// ===== 电机转动方向 ===== ///电机正转 #define TMC2160_MOTOR_DIR_FWD 1 ///电机反转 #define TMC2160_MOTOR_DIR_REV 3//0 /// ===== 电机是否刹车 ===== ///电机刹车 #define TMC2160_MOTOR_DISABLE 0 ///电机启动 #define TMC2160_MOTOR_ENABLE 1 /// ===== 24V供电正常运行时的TORQUE值 ===== #define TMC2160_HORI_TORQUE_VALUE 16//默认值0-31,建议16-31,10进制 #define TMC2160_VERT_TORQUE_VALUE 20//16//默认值 #ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V #define CURR_GLOBAL_SCALER 160//电流全局缩放,取0时为最大值256,当电阻取33毫欧 #endif #ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V #define CURR_GLOBAL_SCALER 200//电流全局缩放,取0时为最大值256 #endif #define TMC2160_WORK_TORQUE_MAX 31//量化扭矩最大值 #define TMC2160_WORK_TORQUE_MIN 5 //量化扭矩最小值 /// ===== 选择驱动器 ===== #define TMC2160_HORI 0 #define TMC2160_VERT 1 /// ===== 运动参数存储 ===== #define TMC2160_PARAMETER_FLASH_ADD 0X008A0000//参数存储地址 #define TMC2160_PARAMETER_BACKUP_FLASH_ADD 0X008B0000//参数备用存储地址 #define TMC2160_PARAMETER_SAVE_FLASH_NUM 3 //参数保存次数 #define TMC2160_PARAMETER_READ_FLASH_NUM 3 //参数读取次数 /// ===== 读寄存器 typedef struct _TMC2160Regis_ { unsigned long int gstae; unsigned long int g_conf; unsigned long int drv_conf; unsigned long int global_scaler; unsigned long int tpowerdown; unsigned long int pwmconf; unsigned long int tpwmthrs; unsigned long int i_run; unsigned long int chop_conf; unsigned long int coolconf; unsigned long int short_conf; }TMC2160Regis; /// ===== 驱动器控制参数 typedef struct _TMC2160Control_ { float set_v;//设定的转速 unsigned int start_f;//启动频率 float set_f;//设定频率 float f;//当前实际频率 unsigned char microstep;//细分等级为0,1,2,3,4,5,6,7,8 unsigned short int microstep_vlue;//细分值1,2,4,8,16,32,64,128,256 char off_on;//芯片开启状态,0关闭状态,1开启状态 unsigned char actual_microstep;//实际已经设置到芯片内的细分等级:0,1,2,3,4,5,6,7,8 float stop_angle; }TMC2160Control; typedef struct _SPIpacka_ { unsigned char data[5]; }SPIpacka; /// ===== 驱动参数设置 ===== typedef struct _TMC2160Parameter_ { char hori_step_1_1_en;//是否有效,0无效,1有效 float hori_step_1_1_v_max;//该细分程度下对应得最大转速 float hori_step_1_1_v_min;//该细分程度下对应得最小转速 char hori_step_1_2_en;//是否有效,0无效,1有效 float hori_step_1_2_v_max;//该细分程度下对应得最大转速 float hori_step_1_2_v_min;//该细分程度下对应得最小转速 char hori_step_1_4_en;//是否有效,0无效,1有效 float hori_step_1_4_v_max;//该细分程度下对应得最大转速 float hori_step_1_4_v_min;//该细分程度下对应得最小转速 char hori_step_1_8_en;//是否有效,0无效,1有效 float hori_step_1_8_v_max;//该细分程度下对应得最大转速 float hori_step_1_8_v_min;//该细分程度下对应得最小转速 char hori_step_1_16_en;//是否有效,0无效,1有效 float hori_step_1_16_v_max;//该细分程度下对应得最大转速 float hori_step_1_16_v_min;//该细分程度下对应得最小转速 char hori_step_1_32_en;//是否有效,0无效,1有效 float hori_step_1_32_v_max;//该细分程度下对应得最大转速 float hori_step_1_32_v_min;//该细分程度下对应得最小转速 char hori_step_1_64_en;//是否有效,0无效,1有效 float hori_step_1_64_v_max;//该细分程度下对应得最大转速 float hori_step_1_64_v_min;//该细分程度下对应得最小转速 char hori_step_1_128_en;//是否有效,0无效,1有效 float hori_step_1_128_v_max;//该细分程度下对应得最大转速 float hori_step_1_128_v_min;//该细分程度下对应得最小转速 char hori_step_1_256_en;//是否有效,0无效,1有效 float hori_step_1_256_v_max;//该细分程度下对应得最大转速 float hori_step_1_256_v_min;//该细分程度下对应得最小转速 unsigned char hori_work_torque;//工作时torque的值 // unsigned char hori_self_lock_micr;//自锁时,采用的细分等级,值为0,1,2,3,4,5,6,7,8 // unsigned char hori_self_lock_torque;//自锁时,torque的值 unsigned char hori_global_scaler;//电流全局缩放 unsigned short int hori_acc_time_max;//电机从0加速到最大速度所用时间 unsigned short int hori_dec_time_max;//电机从最大速度减速到0所用时间 char vert_step_1_1_en;//是否有效,0无效,1有效 float vert_step_1_1_v_max;//该细分程度下对应得最大转速 float vert_step_1_1_v_min;//该细分程度下对应得最小转速 char vert_step_1_2_en;//是否有效,0无效,1有效 float vert_step_1_2_v_max;//该细分程度下对应得最大转速 float vert_step_1_2_v_min;//该细分程度下对应得最小转速 char vert_step_1_4_en;//是否有效,0无效,1有效 float vert_step_1_4_v_max;//该细分程度下对应得最大转速 float vert_step_1_4_v_min;//该细分程度下对应得最小转速 char vert_step_1_8_en;//是否有效,0无效,1有效 float vert_step_1_8_v_max;//该细分程度下对应得最大转速 float vert_step_1_8_v_min;//该细分程度下对应得最小转速 char vert_step_1_16_en;//是否有效,0无效,1有效 float vert_step_1_16_v_max;//该细分程度下对应得最大转速 float vert_step_1_16_v_min;//该细分程度下对应得最小转速 char vert_step_1_32_en;//是否有效,0无效,1有效 float vert_step_1_32_v_max;//该细分程度下对应得最大转速 float vert_step_1_32_v_min;//该细分程度下对应得最小转速 char vert_step_1_64_en;//是否有效,0无效,1有效 float vert_step_1_64_v_max;//该细分程度下对应得最大转速 float vert_step_1_64_v_min;//该细分程度下对应得最小转速 char vert_step_1_128_en;//是否有效,0无效,1有效 float vert_step_1_128_v_max;//该细分程度下对应得最大转速 float vert_step_1_128_v_min;//该细分程度下对应得最小转速 char vert_step_1_256_en;//是否有效,0无效,1有效 float vert_step_1_256_v_max;//该细分程度下对应得最大转速 float vert_step_1_256_v_min;//该细分程度下对应得最小转速 unsigned char vert_work_torque;//工作时torque的值 // unsigned char vert_self_lock_micr;//自锁时,采用的细分等级,值为0,1,2,3,4,5,6,7,8 // unsigned char vert_self_lock_torque;//自锁时,torque的值 unsigned char vert_global_scaler;//电流全局缩放 unsigned short int vert_acc_time_max;//电机从0加速到最大速度所用时间 unsigned short int vert_dec_time_max;//电机从最大速度减速到0所用时间 unsigned int crc;//效验码 }TMC2160Parameter; unsigned long int tmc2160_write_hori_data(char choice, unsigned char x1, unsigned char x2, unsigned char x3,unsigned char x4,unsigned char x5); unsigned long int tmc2160_ihold_irun_data(unsigned char data); unsigned long int tmc2160_write_vert_data(char choice, unsigned char x1, unsigned char x2, unsigned char x3,unsigned char x4,unsigned char x5); unsigned long int tmc2160_chopconf_data(unsigned char data); char tmc2160_write_register(char choice, unsigned char mode, unsigned char data); char tmc2160_data_init(); char tmc2160_set_hori_dir(char dir); char tmc2160_set_vert_dir(char dir); char tmc2160_hori_motor_enable(char state); char tmc2160_vert_motor_enable(char state); void tmc2160_init(); void tmc2160_parameter_process(char dev, PTZ_DATA_PACK *pack); void tmc2160_parameter_upload(char dev); void tmc2160_state_return(char dev); void read_regis(); void restart_tmc2160(); void h_tmc2160_power_on(); void v_tmc2160_power_on(); #endif #endif