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

1800 lines
58 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.

#include "ptz_type_select.h"
#include "ptz_struct.h"
#include "ptz_default_value.h"
#include "tmc2160.h"
#include "w25q128.h"
#ifdef TMC2160
TMC2160Parameter tmc2160_parameter;
TMC2160Regis hori_regis;
TMC2160Regis vert_regis;
unsigned long int version_hori=0;
unsigned long int version_vert=0;
static BSP_OS_SEM ptz_tmc2160_mutex;//共享资源锁
static void delay_time(int time)
{
for(int i = 0; i < time; i ++)
{//主频200MHZ
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
///驱动器重新上电后自动复位,全部置零
void h_tmc2160_power_on()
{
//电源打开
TMC2160_H_POWER_ON;
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//====初始化驱动器参数
tmc2160_data_init();
TMC2160_HORI_CSN_DISABLE;
TMC2160_HORI_DISABLE;
//====上电清除全局状态标志
tmc2160_write_register(TMC2160_HORI, TMC2160_GSTAT, 0);
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
//====寄存器通用配置
//水平
tmc2160_write_register(TMC2160_HORI, TMC2160_GLOBAL_SCALER, tmc2160_parameter.hori_global_scaler);
tmc2160_write_register(TMC2160_HORI, TMC2160_GCONF, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_PWMCONF, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_DRV_CONF, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_TPOWERDOWN, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_CHOPCONF, TMC2160_1_16_STEP);//细分默认16
tmc2160_write_register(TMC2160_HORI, TMC2160_IHOLD_IRUN, tmc2160_parameter.hori_work_torque);//电流默认值=20/32*2.3A
tmc2160_write_register(TMC2160_HORI, TMC2160_TPWMTHRS, 0);
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
tmc2160_write_register(TMC2160_HORI, TMC2160_SHORT_CONF, 0);
#endif
}
///驱动器重新上电后自动复位,全部置零
void v_tmc2160_power_on()
{
//电源打开
TMC2160_V_POWER_ON;
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//====初始化驱动器参数
tmc2160_data_init();
TMC2160_VERT_CSN_DISABLE;
TMC2160_VERT_DISABLE;
//====上电清除全局状态标志
tmc2160_write_register(TMC2160_VERT, TMC2160_GSTAT, 0);
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
//====寄存器通用配置
//垂直
tmc2160_write_register(TMC2160_VERT, TMC2160_GLOBAL_SCALER, tmc2160_parameter.vert_global_scaler);
tmc2160_write_register(TMC2160_VERT, TMC2160_GCONF, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_PWMCONF, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_DRV_CONF, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_TPOWERDOWN, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_CHOPCONF, TMC2160_1_16_STEP);//细分默认16
tmc2160_write_register(TMC2160_VERT, TMC2160_IHOLD_IRUN, tmc2160_parameter.vert_work_torque);//电流默认值=20/32*2.3A
tmc2160_write_register(TMC2160_VERT, TMC2160_TPWMTHRS, 0);
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
tmc2160_write_register(TMC2160_VERT, TMC2160_SHORT_CONF, 0);
#endif
}
///===== 初始化驱动器 =====
///驱动器重新上电后自动复位,全部置零
void tmc2160_init()
{
BSP_OS_SemCreate(&ptz_tmc2160_mutex,1u,"ptz_tmc2160_mutex");
//配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_GPIOE);
//GD改版后驱动策略进行了修改————新增驱动器电源控制引脚便于驱动器的断电复位等
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//水平电源控制引脚
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1);//垂直电源控制引脚
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0| GPIO_PIN_1);
//电源打开
TMC2160_H_POWER_ON;
TMC2160_V_POWER_ON;
OSTimeDlyHMSM(0u, 0u, 0u, 100u);
//====初始化驱动器参数
tmc2160_data_init();
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//SPI
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_13);//CLK
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14);//SDI主出从入
gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_15);//SDO主入从出
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13| GPIO_PIN_14);
//====水平驱动器初始化
gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);//H_CSN
gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_14);//DIAG1
gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13);//DIAG0
gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_10);//DRVEN
gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);//DIR
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10| GPIO_PIN_11| GPIO_PIN_5);
//====垂直驱动器初始化
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);//V_CSN
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_8);//DIAG1
gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_9);//DIAG0
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_7);//DRVEN
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);//DIR
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7| GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
TMC2160_HORI_CSN_DISABLE;
TMC2160_HORI_DISABLE;
TMC2160_VERT_CSN_DISABLE;
TMC2160_VERT_DISABLE;
//====上电清除全局状态标志
tmc2160_write_register(TMC2160_HORI, TMC2160_GSTAT, 0);
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
tmc2160_write_register(TMC2160_VERT, TMC2160_GSTAT, 0);
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
//====寄存器通用配置
//水平
tmc2160_write_register(TMC2160_HORI, TMC2160_GLOBAL_SCALER, tmc2160_parameter.hori_global_scaler);
tmc2160_write_register(TMC2160_HORI, TMC2160_GCONF, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_PWMCONF, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_DRV_CONF, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_TPOWERDOWN, 0);
tmc2160_write_register(TMC2160_HORI, TMC2160_CHOPCONF, TMC2160_1_16_STEP);//细分默认16
tmc2160_write_register(TMC2160_HORI, TMC2160_IHOLD_IRUN, tmc2160_parameter.hori_work_torque);//电流默认值=20/32*2.3A
tmc2160_write_register(TMC2160_HORI, TMC2160_TPWMTHRS, 0);
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
tmc2160_write_register(TMC2160_HORI, TMC2160_SHORT_CONF, 0);
#endif
tmc2160_write_register(TMC2160_HORI, TMC2160_COOLCONF, 0);
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//垂直
tmc2160_write_register(TMC2160_VERT, TMC2160_GLOBAL_SCALER, tmc2160_parameter.vert_global_scaler);
tmc2160_write_register(TMC2160_VERT, TMC2160_GCONF, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_PWMCONF, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_DRV_CONF, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_TPOWERDOWN, 0);
tmc2160_write_register(TMC2160_VERT, TMC2160_CHOPCONF, TMC2160_1_16_STEP);//细分默认16
tmc2160_write_register(TMC2160_VERT, TMC2160_IHOLD_IRUN, tmc2160_parameter.vert_work_torque);//电流默认值=20/32*2.3A
tmc2160_write_register(TMC2160_VERT, TMC2160_TPWMTHRS, 0);
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
tmc2160_write_register(TMC2160_VERT, TMC2160_SHORT_CONF, 0);
#endif
tmc2160_write_register(TMC2160_VERT, TMC2160_COOLCONF, 0);
// vert_regis.g_conf = tmc2160_write_hori_data(TMC2160_HORI,TMC2160_DRV_STATUS,0,0,0,0);
}
///===== 读写寄存器SPI位40位8位地址32位数据
unsigned long int tmc2160_write_hori_data(char choice, unsigned char x1, unsigned char x2, unsigned char x3,unsigned char x4,unsigned char x5)
{//choice——驱动器选择x2/x3/x4/x5——写寄存器的数据
SPIpacka packa;
unsigned long int dat=0;
unsigned char datak[5] = {0};
char i,j,k;
unsigned char temp=0;
packa.data[0] = x1;//寄存器地址位
packa.data[1] = x2;//寄存器数据位
packa.data[2] = x3;//寄存器数据位
packa.data[3] = x4;//寄存器数据位
packa.data[4] = x5;//寄存器数据位
for(k = 0; k < 2; k++)
{//连续2次写入一方面确保寄存器写入成功二是当前SPI写入时同时寄存器会返回上一次写入数据由此实现返回数据为当前写入数据
TMC2160_VERT_CSN_DISABLE;
TMC2160_HORI_CSN_ENABLE;
delay_time(2);
TMC2160_SCLK_HIGH;
delay_time(2);
// //片选
// if(choice == TMC2160_HORI)
// {
// TMC2160_HORI_CSN_ENABLE;
// }else{//TMC2160_VERT
// TMC2160_VERT_CSN_ENABLE;
// }
delay_time(2);
TMC2160_SCLK_LOW;
delay_time(10);
for(j = 0; j < 5; j++)
{
for(i = 0; i < 8; i++)
{
TMC2160_SCLK_LOW;
if((packa.data[j] & 0x80) != 0)
{
TMC2160_SDATI_1;
}else{
TMC2160_SDATI_0;
}
packa.data[j] = packa.data[j] << 1;
delay_time(2);
TMC2160_SCLK_HIGH;
temp = TMC2160_SDATO_READ;
datak[j] = datak[j] | (temp << (7-i));
delay_time(2);
}
}
TMC2160_SCLK_HIGH;
delay_time(2);
//片选失能
TMC2160_HORI_CSN_DISABLE;
dat = datak[0];
dat = (dat << 8) | datak[1];
dat = (dat << 8) | datak[2];
dat = (dat << 8) | datak[3];
dat = (dat << 8) | datak[4];
// dat = datak[4];
}
return dat;
}
///===== SPI位40位8位地址32位数据
unsigned long int tmc2160_write_vert_data(char choice, unsigned char x1, unsigned char x2, unsigned char x3,unsigned char x4,unsigned char x5)
{//choice——驱动器选择x2/x3/x4/x5——写寄存器的数据
SPIpacka packa;
unsigned long int dat=0;
unsigned char datak[5] = {0};
char i,j,k;
unsigned char temp=0;
packa.data[0] = x1;//0x90;
packa.data[1] = x2;//0xAB;
packa.data[2] = x3;//0xef;
packa.data[3] = x4;//0xCD;
packa.data[4] = x5;//0xbc;
for(k = 0; k < 2; k++)
{//连续3次写入
TMC2160_HORI_CSN_DISABLE;
TMC2160_VERT_CSN_ENABLE;
delay_time(2);
TMC2160_SCLK_HIGH;
delay_time(2);
// //片选
// if(choice == TMC2160_HORI)
// {
// TMC2160_HORI_CSN_ENABLE;
// }else{//TMC2160_VERT
// TMC2160_VERT_CSN_ENABLE;
// }
delay_time(2);
TMC2160_SCLK_LOW;
delay_time(10);
for(j = 0; j < 5; j++)
{
for(i = 0; i < 8; i++)
{
TMC2160_SCLK_LOW;
if((packa.data[j] & 0x80) != 0)
{
TMC2160_SDATI_1;
}else{
TMC2160_SDATI_0;
}
packa.data[j] = packa.data[j] << 1;
delay_time(2);
TMC2160_SCLK_HIGH;
temp = TMC2160_SDATO_READ;
datak[j] = datak[j] | (temp << (7-i));
delay_time(2);
}
}
TMC2160_SCLK_HIGH;
delay_time(2);
//片选失能
TMC2160_VERT_CSN_DISABLE;
dat = datak[0];
dat = (dat << 8) | datak[1];
dat = (dat << 8) | datak[2];
dat = (dat << 8) | datak[3];
dat = (dat << 8) | datak[4];
// dat = datak[4];
}
return dat;
}
///===== 水平电机转向设置
char tmc2160_set_hori_dir(char dir)
{
if (dir == TMC2160_MOTOR_DIR_FWD)
{//电机正转
TMC2160_HORI_DIR_F; return 1;
}
if (dir == TMC2160_MOTOR_DIR_REV)
{//电机反转
TMC2160_HORI_DIR_R; return 1;
}
delay_time(2);
return 0;
}
///===== 垂直电机转向设置
char tmc2160_set_vert_dir(char dir)
{
if (dir == TMC2160_MOTOR_DIR_FWD)
{//电机正转
TMC2160_VERT_DIR_F; return 1;
}
if (dir == TMC2160_MOTOR_DIR_REV)
{//电机反转
TMC2160_VERT_DIR_R; return 1;
}
delay_time(2);
return 0;
}
///===== 水平驱动器使能
char tmc2160_hori_motor_enable(char state)
{
if (state == TMC2160_MOTOR_ENABLE)
{//启动电机
TMC2160_HORI_ENABLE; return 1;
}
if (state == TMC2160_MOTOR_DISABLE)
{//关闭电机
TMC2160_HORI_DISABLE; return 1;
}
delay_time(2);
return 0;
}
///===== 垂直驱动器使能
char tmc2160_vert_motor_enable(char state)
{
if (state == TMC2160_MOTOR_ENABLE)
{//启动电机
TMC2160_VERT_ENABLE; return 1;
}
if (state == TMC2160_MOTOR_DISABLE)
{//关闭电机
TMC2160_VERT_DISABLE; return 1;
}
delay_time(2);
return 0;
}
///===== 写寄存器,mode为寄存器地址,data为电流或细分等级choice为片选
char tmc2160_write_register(char choice, unsigned char mode, unsigned char data)
{
u_int8_t buff[5] = {0x00,0x00,0x00,0x00,0x00};
BSP_OS_SemWait(&ptz_tmc2160_mutex, 0u);
switch (mode)
{
case TMC2160_GCONF:
buff[0] = TMC2160_GCONF + 0x80;
buff[1] = 0x00;
buff[2] = 0x00;
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V
buff[3] = 0x01;//01——磁滞1/16
#endif
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
buff[3] = 0x41;//41——磁滞1/32
#endif
buff[4] = 0x4c;//DIAG0输出过热预警DIAG1输出电机堵转信号低电平有效预警时指示灯亮48
if(choice == TMC2160_HORI)
{//读即写
hori_regis.g_conf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.g_conf = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_GSTAT://全局状态标志写1清除
buff[0] = TMC2160_GSTAT +0x80;
buff[1] = 0xff;
buff[2] = 0xff;
buff[3] = 0xff;
buff[4] = 0xff;
if(choice == TMC2160_HORI)
{
hori_regis.gstae = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.gstae = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_DRV_CONF://设置斩波噪音,温度等
buff[0] = TMC2160_DRV_CONF +0x80;
buff[1] = 0x00;
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V
buff[2] = 0x0c;//3c;//0x24;//0x24;//28,08
buff[3] = 0x04;//04
#endif
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
buff[2] = 0x38;//0x24;//38,
buff[3] = 0x02;//0x04;//02
#endif
buff[4] = 0x00;//0x10;//0x10;//00
if(choice == TMC2160_HORI)
{
hori_regis.drv_conf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.drv_conf = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_GLOBAL_SCALER://电流的全局缩放满量程0
buff[0] = TMC2160_GLOBAL_SCALER +0x80;
buff[1] = 0x00;
buff[2] = 0x00;
buff[3] = 0x00;
buff[4] = data;//取值255
if(choice == TMC2160_HORI)
{
hori_regis.global_scaler = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.global_scaler = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_IHOLD_IRUN://电机电流设置
buff[0] = TMC2160_IHOLD_IRUN +0x80;
buff[1] = 0x00;
buff[2] = 0x06;//0x04;//电流降延时,电机停止后延时断电,可防止电机因惯性多转
buff[3] = data;//运行电流=data/32*4.7A对应采样电阻0.05欧
buff[4] = (data>>1);//静止电流0x00,自锁电流为运行电流的一半
if(choice == TMC2160_HORI)
{
hori_regis.i_run = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.i_run = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_TPOWERDOWN://电流降延时时间2
buff[0] = TMC2160_TPOWERDOWN +0x80;
buff[1] = 0x00;
buff[2] = 0x00;
buff[3] = 0x00;
buff[4] = 0x0a;
if(choice == TMC2160_HORI)
{
hori_regis.tpowerdown = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.tpowerdown = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_TPWMTHRS: //暂时不设置,,速度上限
buff[0] = TMC2160_TPWMTHRS +0x80;
buff[1] = 0x00;
buff[2] = 0x00;
buff[3] = 0x00;
buff[4] = 0xf4;
if(choice == TMC2160_HORI)
{
hori_regis.tpwmthrs = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.tpwmthrs = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_CHOPCONF: //0x00010083,24-27位配置细分最后左移24位
buff[0] = TMC2160_CHOPCONF +0x80;
buff[1] = tmc2160_chopconf_data(data);
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V
buff[2] = 0xe1;//e1,,高4为被动快速衰减时间可降低中程共振
buff[3] = 0x03;//03
buff[4] = 0x34;//C3
#endif
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
buff[2] = 0xf1;//e1,,高4为被动快速衰减时间可降低中程共振
buff[3] = 0x03;//0300
buff[4] = 0x04;//0464低4设置TOFF取3或4高3设置hstrt滞环过小振动噪音增加过大斩波噪音增加
#endif
if(choice == TMC2160_HORI)
{
hori_regis.chop_conf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.chop_conf = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_COOLCONF: ///暂时不写...智能电流控制
buff[0] = TMC2160_COOLCONF +0x80;
buff[1] = 0x00;
buff[2] = 0x00;
buff[3] = 0xA8;
buff[4] = 0x28;
if(choice == TMC2160_HORI)
{
hori_regis.coolconf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.coolconf = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_PWMCONF: //0xc401321e时钟35.1KHZ
buff[0] = TMC2160_PWMCONF +0x80;
buff[1] = 0xd2;//c4
buff[2] = 0x0d;//0x0E;//09,0D
buff[3] = 0x32;
buff[4] = 0x1e;
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
buff[3] = 0x32;
buff[4] = 0x24;//0x6e
#endif
if(choice == TMC2160_HORI)
{
tmc2160_write_hori_data(choice, buff[0],buff[1],0x09,buff[3],buff[4]);
hori_regis.pwmconf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
tmc2160_write_vert_data(choice, buff[0],buff[1],0x09,buff[3],buff[4]);
vert_regis.pwmconf = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
case TMC2160_SHORT_CONF:
buff[0] = TMC2160_SHORT_CONF +0x80;
buff[1] = 0x00;
buff[2] = 0x06;
buff[3] = 0x0c;
buff[4] = 0x0c;
if(choice == TMC2160_HORI)
{
hori_regis.short_conf = tmc2160_write_hori_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}else{
vert_regis.short_conf = tmc2160_write_vert_data(choice, buff[0],buff[1],buff[2],buff[3],buff[4]);
}
break;
}
BSP_OS_SemPost(&ptz_tmc2160_mutex);
return 0;
}
unsigned long int tmc2160_ihold_irun_data(unsigned char data)
{//电流设置共5位第8-12位因此要左移8位
unsigned long int write_data = 0;
write_data = write_data | data << 8;
return write_data;
}
unsigned long int tmc2160_chopconf_data(unsigned char data)
{//驱动细分共4位第24-27位
//默认值写0x00010083,256细分
unsigned char write_data = 0x10;//0x10;
// write_data = 0x00010083;
switch (data)//此时data作为细分等级
{
case TMC2160_1_8_STEP: //38分频
write_data = write_data | 0x05;// << 24;
break;
case TMC2160_1_16_STEP: //416分频
write_data = write_data | 0x04;// << 24;
break;
case TMC2160_1_32_STEP: //532分频
write_data = write_data | 0x03;// << 24;
break;
case TMC2160_1_64_STEP: //664分频
write_data = write_data | 0x02;// << 24;
break;
case TMC2160_1_128_STEP: //7128分频
write_data = write_data | 0x01;// << 24;
break;
}
return write_data;
}
///===== 计算效验码
unsigned int tmc2160_parameter_crc(TMC2160Parameter data)
{
float crc = 0;
unsigned int crc1 = 0;
crc = crc + data.hori_step_1_8_en;
crc = crc + data.hori_step_1_8_v_max;
crc = crc + data.hori_step_1_8_v_min;
crc = crc + data.hori_step_1_16_en;
crc = crc + data.hori_step_1_16_v_max;
crc = crc + data.hori_step_1_16_v_min;
crc = crc + data.hori_step_1_32_en;
crc = crc + data.hori_step_1_32_v_max;
crc = crc + data.hori_step_1_32_v_min;
crc = crc + data.hori_step_1_64_en;
crc = crc + data.hori_step_1_64_v_max;
crc = crc + data.hori_step_1_64_v_min;
crc = crc + data.hori_step_1_128_en;
crc = crc + data.hori_step_1_128_v_max;
crc = crc + data.hori_step_1_128_v_min;
crc = crc + data.hori_work_torque;
crc = crc + data.hori_global_scaler;
crc = crc + data.hori_acc_time_max;//电机从0加速到最大速度所用时间
crc = crc + data.hori_dec_time_max;//电机从最大速度减速到0所用时间
crc = crc + data.vert_step_1_8_en;
crc = crc + data.vert_step_1_8_v_max;
crc = crc + data.vert_step_1_8_v_min;
crc = crc + data.vert_step_1_16_en;
crc = crc + data.vert_step_1_16_v_max;
crc = crc + data.vert_step_1_16_v_min;
crc = crc + data.vert_step_1_32_en;
crc = crc + data.vert_step_1_32_v_max;
crc = crc + data.vert_step_1_32_v_min;
crc = crc + data.vert_step_1_64_en;
crc = crc + data.vert_step_1_64_v_max;
crc = crc + data.vert_step_1_64_v_min;
crc = crc + data.vert_step_1_128_en;
crc = crc + data.vert_step_1_128_v_max;
crc = crc + data.vert_step_1_128_v_min;
crc = crc + data.vert_work_torque;
crc = crc + data.vert_global_scaler;
crc = crc + data.vert_acc_time_max;//电机从0加速到最大速度所用时间
crc = crc + data.vert_dec_time_max;//电机从最大速度减速到0所用时间
crc1 = (unsigned int)crc;
return crc1;
}
///===== 运动参数存储
char tmc2160_parameter_save()
{
TMC2160Parameter tmc2160_parameter_a;
char i,j;
//计算效验码
tmc2160_parameter.crc = tmc2160_parameter_crc(tmc2160_parameter);
//写入主存储区
for(i = 0; i < TMC2160_PARAMETER_SAVE_FLASH_NUM; i++)
{
memset(&tmc2160_parameter_a, 0, sizeof(tmc2160_parameter_a));
write_many_data(sizeof(tmc2160_parameter),(unsigned char *)(&tmc2160_parameter),TMC2160_PARAMETER_FLASH_ADD);
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
Flash_Read((unsigned char *)(&tmc2160_parameter_a),TMC2160_PARAMETER_FLASH_ADD,sizeof(tmc2160_parameter_a));
if(memcmp(&tmc2160_parameter, &tmc2160_parameter_a, sizeof(tmc2160_parameter)) == 0)//判断写入数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
//写入备份存储区
for(j = 0; j < TMC2160_PARAMETER_SAVE_FLASH_NUM; j++)
{
memset(&tmc2160_parameter_a, 0, sizeof(tmc2160_parameter_a));
write_many_data(sizeof(tmc2160_parameter),(unsigned char *)(&tmc2160_parameter),TMC2160_PARAMETER_BACKUP_FLASH_ADD);
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
Flash_Read((unsigned char *)(&tmc2160_parameter_a),TMC2160_PARAMETER_BACKUP_FLASH_ADD,sizeof(tmc2160_parameter_a));
if(memcmp(&tmc2160_parameter, &tmc2160_parameter_a, sizeof(tmc2160_parameter)) == 0)//判断写入数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
if(i < TMC2160_PARAMETER_SAVE_FLASH_NUM || j < TMC2160_PARAMETER_SAVE_FLASH_NUM)//判断写入数据是否成功
{
//写入成功
return 1;
}
//写入失败
return 0;
}
///===== 运动参数读取
char tmc2160_parameter_read()
{
char i;
//首先从主存储区读取数据
for(i = 0; i < TMC2160_PARAMETER_READ_FLASH_NUM; i++)
{
memset(&tmc2160_parameter, 0, sizeof(tmc2160_parameter));
Flash_Read((unsigned char *)(&tmc2160_parameter),TMC2160_PARAMETER_FLASH_ADD,sizeof(tmc2160_parameter));
if(tmc2160_parameter.crc == tmc2160_parameter_crc(tmc2160_parameter) && tmc2160_parameter.crc > 0)
{
return 1;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
//如果主存储区读取的数据是错误的,则从备份存储区读取数据
for(i = 0; i < TMC2160_PARAMETER_READ_FLASH_NUM; i++)
{
memset(&tmc2160_parameter, 0, sizeof(tmc2160_parameter));
Flash_Read((unsigned char *)(&tmc2160_parameter),TMC2160_PARAMETER_BACKUP_FLASH_ADD,sizeof(tmc2160_parameter));
if(tmc2160_parameter.crc == tmc2160_parameter_crc(tmc2160_parameter) && tmc2160_parameter.crc > 0)
{
return 1;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
return 0;
}
///===== 运动参数擦除
char tmc2160_parameter_erase()
{
TMC2160Parameter tmc2160_parameter_a;
TMC2160Parameter tmc2160_parameter_b;
char i, j;
//擦除主存储区
for(i = 0; i < TMC2160_PARAMETER_SAVE_FLASH_NUM; i++)
{
memset(&tmc2160_parameter_a, 0, sizeof(tmc2160_parameter_a));
write_many_data(sizeof(tmc2160_parameter_a),(unsigned char *)(&tmc2160_parameter_a),TMC2160_PARAMETER_FLASH_ADD);
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
Flash_Read((unsigned char *)(&tmc2160_parameter_b),TMC2160_PARAMETER_FLASH_ADD,sizeof(tmc2160_parameter_b));
if(memcmp(&tmc2160_parameter_a, &tmc2160_parameter_b, sizeof(tmc2160_parameter_a)) == 0)//判断擦除数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
//擦除备份存储区
for(j = 0; j < TMC2160_PARAMETER_SAVE_FLASH_NUM; j++)
{
memset(&tmc2160_parameter_a, 0, sizeof(tmc2160_parameter_a));
write_many_data(sizeof(tmc2160_parameter_a),(unsigned char *)(&tmc2160_parameter_a),TMC2160_PARAMETER_BACKUP_FLASH_ADD);
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
Flash_Read((unsigned char *)(&tmc2160_parameter_b),TMC2160_PARAMETER_BACKUP_FLASH_ADD,sizeof(tmc2160_parameter_b));
if(memcmp(&tmc2160_parameter_a, &tmc2160_parameter_b, sizeof(tmc2160_parameter_a)) == 0)//判断擦除数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
if(i < TMC2160_PARAMETER_SAVE_FLASH_NUM || j < TMC2160_PARAMETER_SAVE_FLASH_NUM)//判断擦除数据是否成功
{
//擦除成功
return 1;
}
//擦除失败
return 0;
}
///===== 运动参数赋值
char tmc2160_data_reset()
{
tmc2160_parameter.hori_step_1_8_en = 1;//是否有效0无效1有效
tmc2160_parameter.hori_step_1_8_v_max = PTZ_HORI_1_8_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.hori_step_1_8_v_min = PTZ_HORI_1_8_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.hori_step_1_16_en = 1;//是否有效0无效1有效
tmc2160_parameter.hori_step_1_16_v_max = PTZ_HORI_1_16_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.hori_step_1_16_v_min = PTZ_HORI_1_16_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.hori_step_1_32_en = 1;//是否有效0无效1有效
tmc2160_parameter.hori_step_1_32_v_max = PTZ_HORI_1_32_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.hori_step_1_32_v_min = PTZ_HORI_1_32_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.hori_step_1_64_en = 1;//是否有效0无效1有效
tmc2160_parameter.hori_step_1_64_v_max = PTZ_HORI_1_64_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.hori_step_1_64_v_min = PTZ_HORI_1_64_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.hori_step_1_128_en = 1;//是否有效0无效1有效
tmc2160_parameter.hori_step_1_128_v_max = PTZ_HORI_1_128_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.hori_step_1_128_v_min = PTZ_HORI_1_128_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.hori_work_torque = TMC2160_HORI_TORQUE_VALUE;//工作时torque的值
tmc2160_parameter.hori_global_scaler = CURR_GLOBAL_SCALER;//电流全局缩放
tmc2160_parameter.hori_acc_time_max = PTZ_HORI_ACC_TIME_MAX;//电机从0加速到最大速度所用时间
tmc2160_parameter.hori_dec_time_max = PTZ_HORI_DEC_TIME_MAX;//电机从最大速度减速到0所用时间
tmc2160_parameter.vert_step_1_8_en = 0;//是否有效0无效1有效
tmc2160_parameter.vert_step_1_8_v_max = 0;//该细分程度下对应得最大转速
tmc2160_parameter.vert_step_1_8_v_min = 0;//该细分程度下对应得最小转速
tmc2160_parameter.vert_step_1_16_en = 1;//是否有效0无效1有效
tmc2160_parameter.vert_step_1_16_v_max = PTZ_VERT_1_16_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.vert_step_1_16_v_min = PTZ_VERT_1_16_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.vert_step_1_32_en = 1;//是否有效0无效1有效
tmc2160_parameter.vert_step_1_32_v_max = PTZ_VERT_1_32_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.vert_step_1_32_v_min = PTZ_VERT_1_32_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.vert_step_1_64_en = 1;//是否有效0无效1有效
tmc2160_parameter.vert_step_1_64_v_max = PTZ_VERT_1_64_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.vert_step_1_64_v_min = PTZ_VERT_1_64_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.vert_step_1_128_en = 1;//是否有效0无效1有效
tmc2160_parameter.vert_step_1_128_v_max = PTZ_VERT_1_128_STEP_V_MAX;//该细分程度下对应得最大转速
tmc2160_parameter.vert_step_1_128_v_min = PTZ_VERT_1_128_STEP_V_MIN;//该细分程度下对应得最小转速
tmc2160_parameter.vert_work_torque = TMC2160_VERT_TORQUE_VALUE;//工作时torque的值
tmc2160_parameter.vert_global_scaler = CURR_GLOBAL_SCALER;//电流全局缩放
tmc2160_parameter.vert_acc_time_max = PTZ_VERT_ACC_TIME_MAX;//电机从0加速到最大速度所用时间
tmc2160_parameter.vert_dec_time_max = PTZ_VERT_DEC_TIME_MAX;//电机从最大速度减速到0所用时间
tmc2160_parameter.crc = tmc2160_parameter_crc(tmc2160_parameter);//效验码
return 1;
}
///===== 驱动器复位
char tmc2160_reset()
{
tmc2160_data_reset();
//水平
tmc2160_write_register(TMC2160_HORI, TMC2160_IHOLD_IRUN, TMC2160_HORI_TORQUE_VALUE);//电流默认值=20/32*2.3A
tmc2160_write_register(TMC2160_HORI, TMC2160_CHOPCONF, TMC2160_1_16_STEP);//细分默认16
//垂直
tmc2160_write_register(TMC2160_VERT, TMC2160_IHOLD_IRUN, TMC2160_VERT_TORQUE_VALUE);//电流默认值=20/32*2.3A
tmc2160_write_register(TMC2160_VERT, TMC2160_CHOPCONF, TMC2160_1_16_STEP);//细分默认16
if (tmc2160_parameter_save() == 1)
{//复位成功
return 1;
}
return 0;
}
///===== 参数初始化
char tmc2160_data_init()
{
tmc2160_parameter_read();
if (tmc2160_parameter_read() == 1)
{//读取成功
return 1;
}else{//读取失败
tmc2160_data_reset();
tmc2160_parameter_save();
return 0;
}
}
///===== 数据上传
void tmc2160_parameter_upload(char dev)
{
unsigned char data[7] = {0};
//*****************************发送水平参数**********************************//
/*********************************1_8*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x09;
data[4] = tmc2160_parameter.hori_step_1_8_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0a;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_8_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_8_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0b;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_8_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_8_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_16*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0c;
data[4] = tmc2160_parameter.hori_step_1_16_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0d;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_16_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_16_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0e;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_16_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_16_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_32*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0f;
data[4] = tmc2160_parameter.hori_step_1_32_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x10;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_32_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_32_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x11;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_32_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_32_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_64*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x12;
data[4] = tmc2160_parameter.hori_step_1_64_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x13;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_64_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_64_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x14;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_64_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_64_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_128*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x15;
data[4] = tmc2160_parameter.hori_step_1_128_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x16;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_128_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_128_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x17;
data[4] = ((unsigned short int)(tmc2160_parameter.hori_step_1_128_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.hori_step_1_128_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************work_torque*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x20;
data[4] = tmc2160_parameter.hori_work_torque;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/********************************global_scaler***********************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x21;
data[4] = tmc2160_parameter.hori_global_scaler;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************acc_time*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x23;
data[4] = tmc2160_parameter.hori_acc_time_max >> 8;
data[5] = tmc2160_parameter.hori_acc_time_max & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************dec_time*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x51;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x24;
data[4] = tmc2160_parameter.hori_dec_time_max >> 8;
data[5] = tmc2160_parameter.hori_dec_time_max & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//************************************************************************************************************************/
//****************************发送垂直参数************************************//
/*********************************1_8*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x09;
data[4] = tmc2160_parameter.vert_step_1_8_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0a;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_8_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_8_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0b;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_8_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_8_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_16*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0c;
data[4] = tmc2160_parameter.vert_step_1_16_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0d;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_16_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_16_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0e;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_16_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_16_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_32*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x0f;
data[4] = tmc2160_parameter.vert_step_1_32_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x10;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_32_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_32_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x11;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_32_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_32_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************1_64*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x12;
data[4] = tmc2160_parameter.vert_step_1_64_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x13;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_64_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_64_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x14;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_64_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_64_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/**********************************1_128**************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x15;
data[4] = tmc2160_parameter.vert_step_1_128_en;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x16;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_128_v_min * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_128_v_min * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x17;
data[4] = ((unsigned short int)(tmc2160_parameter.vert_step_1_128_v_max * 10)) >> 8;
data[5] = ((unsigned short int)(tmc2160_parameter.vert_step_1_128_v_max * 10)) & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************work_torque**********************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x20;
data[4] = tmc2160_parameter.vert_work_torque;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/********************************global_scaler*********************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x21;
data[4] = tmc2160_parameter.vert_global_scaler;
data[5] = 0;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************acc_time*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x23;
data[4] = tmc2160_parameter.vert_acc_time_max >> 8;
data[5] = tmc2160_parameter.vert_acc_time_max & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
/*********************************dec_time*************************************/
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x52;//0X51代表发送的是水平,0X52代表发送的是垂直
data[3] = 0x24;
data[4] = tmc2160_parameter.vert_dec_time_max >> 8;
data[5] = tmc2160_parameter.vert_dec_time_max & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
//************************************************************************************************************************/
}
///===== tmc2160数据处理
void tmc2160_parameter_process(char dev, PTZ_DATA_PACK *pack)
{
float speed;
if(pack->command[0] == 0x51)//水平电机
{
speed = (float)((pack->data[0] << 8) | pack->data[1]) / 10.0;
if(speed > PTZ_HORI_MOTOR_MAX_SPEED)
{
speed = PTZ_HORI_MOTOR_MAX_SPEED;
}
if(speed < 0)
{
speed = 0;
}
switch(pack->command[1])
{
case 0x09:
if(pack->data[0] == 1)
{
tmc2160_parameter.hori_step_1_8_en = 1;
}
else
{
tmc2160_parameter.hori_step_1_8_en = 0;
}
break;
case 0x0a:
tmc2160_parameter.hori_step_1_8_v_min = speed;
break;
case 0x0b:
tmc2160_parameter.hori_step_1_8_v_max = speed;
break;
/*******************************************************************************************/
case 0x0c:
if(pack->data[0] == 1)
{
tmc2160_parameter.hori_step_1_16_en = 1;
}
else
{
tmc2160_parameter.hori_step_1_16_en = 0;
}
break;
case 0x0d:
tmc2160_parameter.hori_step_1_16_v_min = speed;
break;
case 0x0e:
tmc2160_parameter.hori_step_1_16_v_max = speed;
break;
/*******************************************************************************************/
case 0x0f:
if(pack->data[0] == 1)
{
tmc2160_parameter.hori_step_1_32_en = 1;
}
else
{
tmc2160_parameter.hori_step_1_32_en = 0;
}
break;
case 0x10:
tmc2160_parameter.hori_step_1_32_v_min = speed;
break;
case 0x11:
tmc2160_parameter.hori_step_1_32_v_max = speed;
break;
/*******************************************************************************************/
case 0x12:
if(pack->data[0] == 1)
{
tmc2160_parameter.hori_step_1_64_en = 1;
}
else
{
tmc2160_parameter.hori_step_1_64_en = 0;
}
break;
case 0x13:
tmc2160_parameter.hori_step_1_64_v_min = speed;
break;
case 0x14:
tmc2160_parameter.hori_step_1_64_v_max = speed;
break;
/*******************************************************************************************/
case 0x15:
if(pack->data[0] == 1)
{
tmc2160_parameter.hori_step_1_128_en = 1;
}
else
{
tmc2160_parameter.hori_step_1_128_en = 0;
}
break;
case 0x16:
tmc2160_parameter.hori_step_1_128_v_min = speed;
break;
case 0x17:
tmc2160_parameter.hori_step_1_128_v_max = speed;
break;
/*******************************************************************************************/
case 0x20:
tmc2160_parameter.hori_work_torque = pack->data[0];
if(tmc2160_parameter.hori_work_torque > TMC2160_WORK_TORQUE_MAX)
{
tmc2160_parameter.hori_work_torque = TMC2160_WORK_TORQUE_MAX;
}
if(tmc2160_parameter.hori_work_torque < TMC2160_WORK_TORQUE_MIN)
{
tmc2160_parameter.hori_work_torque = TMC2160_WORK_TORQUE_MIN;
}
tmc2160_write_register(TMC2160_HORI, TMC2160_IHOLD_IRUN, tmc2160_parameter.hori_work_torque);
break;
case 0x21:
tmc2160_parameter.hori_global_scaler = pack->data[0];
tmc2160_write_register(TMC2160_HORI, TMC2160_GLOBAL_SCALER, tmc2160_parameter.hori_global_scaler);
break;
case 0x23:
tmc2160_parameter.hori_acc_time_max = (pack->data[0] << 8) | pack->data[1];
break;
case 0x24:
tmc2160_parameter.hori_dec_time_max = (pack->data[0] << 8) | pack->data[1];
break;
}
}
if(pack->command[0] == 0x52)//垂直电机
{
speed = (float)((pack->data[0] << 8) | pack->data[1]) / 10.0;
if(speed > PTZ_VERT_MOTOR_MAX_SPEED)
{
speed = PTZ_VERT_MOTOR_MAX_SPEED;
}
if(speed < 0)
{
speed = 0;
}
switch(pack->command[1])
{
case 0x09:
if(pack->data[0] == 1)
{
tmc2160_parameter.vert_step_1_8_en = 1;
}
else
{
tmc2160_parameter.vert_step_1_8_en = 0;
}
break;
case 0x0a:
tmc2160_parameter.vert_step_1_8_v_min = speed;
break;
case 0x0b:
tmc2160_parameter.vert_step_1_8_v_max = speed;
break;
/*******************************************************************************************/
case 0x0c:
if(pack->data[0] == 1)
{
tmc2160_parameter.vert_step_1_16_en = 1;
}
else
{
tmc2160_parameter.vert_step_1_16_en = 0;
}
break;
case 0x0d:
tmc2160_parameter.vert_step_1_16_v_min = speed;
break;
case 0x0e:
tmc2160_parameter.vert_step_1_16_v_max = speed;
break;
/*******************************************************************************************/
case 0x0f:
if(pack->data[0] == 1)
{
tmc2160_parameter.vert_step_1_32_en = 1;
}
else
{
tmc2160_parameter.vert_step_1_32_en = 0;
}
break;
case 0x10:
tmc2160_parameter.vert_step_1_32_v_min = speed;
break;
case 0x11:
tmc2160_parameter.vert_step_1_32_v_max = speed;
break;
/*******************************************************************************************/
case 0x12:
if(pack->data[0] == 1)
{
tmc2160_parameter.vert_step_1_64_en = 1;
}
else
{
tmc2160_parameter.vert_step_1_64_en = 0;
}
break;
case 0x13:
tmc2160_parameter.vert_step_1_64_v_min = speed;
break;
case 0x14:
tmc2160_parameter.vert_step_1_64_v_max = speed;
break;
/*******************************************************************************************/
case 0x15:
if(pack->data[0] == 1)
{
tmc2160_parameter.vert_step_1_128_en = 1;
}
else
{
tmc2160_parameter.vert_step_1_128_en = 0;
}
break;
case 0x16:
tmc2160_parameter.vert_step_1_128_v_min = speed;
break;
case 0x17:
tmc2160_parameter.vert_step_1_128_v_max = speed;
break;
/*******************************************************************************************/
case 0x20:
tmc2160_parameter.vert_work_torque = pack->data[0];
if(tmc2160_parameter.vert_work_torque > TMC2160_WORK_TORQUE_MAX)
{
tmc2160_parameter.vert_work_torque = TMC2160_WORK_TORQUE_MAX;
}
if(tmc2160_parameter.vert_work_torque < TMC2160_WORK_TORQUE_MIN)
{
tmc2160_parameter.vert_work_torque = TMC2160_WORK_TORQUE_MIN;
}
tmc2160_write_register(TMC2160_VERT, TMC2160_IHOLD_IRUN, tmc2160_parameter.vert_work_torque);
break;
case 0x21:
tmc2160_parameter.vert_global_scaler = pack->data[0];
tmc2160_write_register(TMC2160_VERT, TMC2160_GLOBAL_SCALER, tmc2160_parameter.vert_global_scaler);
break;
case 0x23:
tmc2160_parameter.vert_acc_time_max = (pack->data[0] << 8) | pack->data[1];
break;
case 0x24:
tmc2160_parameter.vert_dec_time_max = (pack->data[0] << 8) | pack->data[1];
break;
}
}
if(pack->command[0] == 0x53)//数据操作
{
switch(pack->command[1])
{
case 0x00://读取并回传DRV8711参数
//读取
tmc2160_parameter_read();
//回传
tmc2160_parameter_upload(dev);
break;
case 0x01://保存DRV8711参数
tmc2160_parameter_save();
break;
case 0x02://删除DRV8711在FLASH中的参数
tmc2160_parameter_erase();
break;
case 0x03://复位DRV8711在FLASH中保存的参数
// tmc2160_write_register(TMC2160_HORI, TMC2160_GSTAT, 0);
// OSTimeDlyHMSM(0u, 0u, 0u, 1u);
// tmc2160_write_register(TMC2160_VERT, TMC2160_GSTAT, 0);
// OSTimeDlyHMSM(0u, 0u, 0u, 1u);
tmc2160_reset();
break;
}
}
}
///===== 驱动器状态读取
unsigned int tmc2160_state_read(char choice, char regis)
{
unsigned long int status;
if(choice == TMC2160_HORI)
{
status = tmc2160_write_hori_data(choice, regis,0xff,0xff,0xff,0xff);//choice——驱动器选择x2/x3/x4/x5——写寄存器的数据
}
if(choice == TMC2160_VERT)
{
status = tmc2160_write_vert_data(choice, regis,0xff,0xff,0xff,0xff);//choice——驱动器选择x2/x3/x4/x5——写寄存器的数据
}
return status;
}
void tmc2160_state_return(char dev)
{
unsigned char data[7] = {0};
unsigned long int status;
//****************************发送水平状态******************//
status = tmc2160_state_read(TMC2160_HORI,TMC2160_DRV_STATUS);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = (status >> 24) & 0x00ff;//停止、相电源开路、短路、过温警告、过温触发、堵转状态,最高8位
data[3] = (status >> 16) & 0x00ff;
data[4] = (status >> 8) & 0x00ff;
data[5] = status & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//****************************读引脚状态******************//
status = tmc2160_state_read(TMC2160_HORI,TMC2160_IOIN);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = (status >> 24) & 0x00ff;//高8位为版本号低8位为输入引脚状态
data[3] = 0x00ff;
data[4] = 0x00ff;
data[5] = status & 0x00ff;//此低8位为引脚状态0位脉冲信号、1位转向信号、4位驱动器使能信号。
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 20u);
//**************************发送垂直状态******************//
status = tmc2160_state_read(TMC2160_VERT,TMC2160_DRV_STATUS);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = (status >> 24) & 0x00ff;//停止、相电源开路、短路、过温警告、过温触发、堵转状态,最高8位
data[3] = (status >> 16) & 0x00ff;
data[4] = (status >> 8) & 0x00ff;
data[5] = status & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
//****************************读引脚状态******************//
status = tmc2160_state_read(TMC2160_VERT,TMC2160_IOIN);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = (status >> 24) & 0x00ff;//高8位为版本号低8位为输入引脚状态
data[3] = 0x00ff;
data[4] = 0x00ff;
data[5] = status & 0x00ff;
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
/**********************以下测试用用于stealthchop参数自整定*********************/
// OSTimeDlyHMSM(0u, 0u, 0u, 20u);
// //****************************发送水平自整定值******************//
// status = tmc2160_state_read(TMC2160_HORI,TMC2160_PWM_AUTO);
// data[0] = 0xff;
// data[1] = g_ptz.address;
// data[2] = (status >> 24) & 0x00ff;
// data[3] = (status >> 16) & 0x00ff;
// data[4] = (status >> 8) & 0x00ff;
// data[5] = status & 0x00ff;
// data[6] = MotorCalPelcoDSUM(data,sizeof(data));
// ptz_send_data(dev, data, sizeof(data));
//
// OSTimeDlyHMSM(0u, 0u, 0u, 20u);
// //****************************发送垂直自整定值******************//
// status = tmc2160_state_read(TMC2160_VERT,TMC2160_PWM_AUTO);
// data[0] = 0xff;
// data[1] = g_ptz.address;
// data[2] = (status >> 24) & 0x00ff;
// data[3] = (status >> 16) & 0x00ff;
// data[4] = (status >> 8) & 0x00ff;
// data[5] = status & 0x00ff;
// data[6] = MotorCalPelcoDSUM(data,sizeof(data));
// ptz_send_data(dev, data, sizeof(data));
//
// OSTimeDlyHMSM(0u, 0u, 0u, 20u);
// //*****************************发送水平调幅结果******************//
// status = tmc2160_state_read(TMC2160_HORI,TMC2160_PWM_SCALE);
// data[0] = 0xff;
// data[1] = g_ptz.address;
// data[2] = (status >> 24) & 0x00ff;
// data[3] = (status >> 16) & 0x00ff;
// data[4] = (status >> 8) & 0x00ff;
// data[5] = status & 0x00ff;
// data[6] = MotorCalPelcoDSUM(data,sizeof(data));
// ptz_send_data(dev, data, sizeof(data));
//
// OSTimeDlyHMSM(0u, 0u, 0u, 20u);
// //*****************************发送垂直调幅结果******************//
// status = tmc2160_state_read(TMC2160_VERT,TMC2160_PWM_SCALE);
// data[0] = 0xff;
// data[1] = g_ptz.address;
// data[2] = (status >> 24) & 0x00ff;
// data[3] = (status >> 16) & 0x00ff;
// data[4] = (status >> 8) & 0x00ff;
// data[5] = status & 0x00ff;
// data[6] = MotorCalPelcoDSUM(data,sizeof(data));
// ptz_send_data(dev, data, sizeof(data));
}
#endif