MW22-02A/BSP/Driver/tmc2160/tmc2160.h

394 lines
16 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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-3110进制
#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;//自锁时采用的细分等级值为012345678
// 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;//自锁时采用的细分等级值为012345678
// 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