基于STM32F103的TM4C5130步进电机驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、TM4C5130是什么?

步进电机驱动芯片,里面包含加减速算法等

二、使用步骤

1.SPI总线配置

底层硬件SPI驱动文件:

/****************************************************************
*文件名:SPI.c
*版本:v1.0
*作者:JOHN.FENG
*描述:使用的是STM32内部SPI资源,为了避免多个使用,采用为面向对象编程的方式
****************************************************************/
#include "mcu_spi.h"

SPI_InitTypeDef  SPI_InitStructure;


/**
  * @brief  SPI引脚初始化
  * @param  MCU_SPIx 结构体配置相对应的SPI引脚通道 目前只支持SPI1,SPI2
  * @retval None
  */
void MCU_SPI_Init(MCU_SPIx *pScr)
{
    GPIO_InitTypeDef GPIO_InitStructure;
        
      switch(pScr->MCU_SPI_ClockCmd )
        {
            //根据相对应的SPI通道初始化相对应的时钟
            case MCU_SPI1_ClockCmd:
                RCC_SPI1_PeriphClockCmd;
                break;
            case MCU_SPI2_ClockCmd:
            {
                RCC_GPIO_PeriphClockCmd;
                RCC_SPI2_PeriphClockCmd;
            }
                break;
        }
//    RCC_SPI1_PeriphClockCmd;
        
      //PA4 --- SPI1_NSS  PA5 ----- SPI1_SCK    PA6  -----  SPI1_MISO 
      //PA7 --- SPI1_MISI
    GPIO_InitStructure.GPIO_Pin =  pScr->MCU_SPI_CLK | pScr->MCU_SPI_MISI | pScr->MCU_SPI_MISO;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(pScr->MCU_SPI_GPIOx, &GPIO_InitStructure);

    GPIO_SetBits(pScr->MCU_SPI_GPIOx,  pScr->MCU_SPI_CLK | pScr->MCU_SPI_MISI | pScr->MCU_SPI_MISO);
    
    GPIO_InitStructure.GPIO_Pin = pScr->MCU_SPI_CSN ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(pScr->MCU_SPI_GPIOx, &GPIO_InitStructure);//初始化GPIOB
        
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        //设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //选择了串行时钟的稳态:时钟悬空高
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;    //数据捕获于第二个时钟沿
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;        //定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;    //CRC值计算的多项式
    SPI_Init(pScr->SPIx, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

    SPI_Cmd(pScr->SPIx, ENABLE); //使能SPI外设


}
//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2   2分频   (SPI 36M@sys 72M)
//SPI_BaudRatePrescaler_8   8分频   (SPI 9M@sys 72M)
//SPI_BaudRatePrescaler_16  16分频  (SPI 4.5M@sys 72M)
//SPI_BaudRatePrescaler_256 256分频 (SPI 281.25K@sys 72M)

void SPI_SetSpeed(MCU_SPIx *pScr,uint8_t SpeedSet)
{
    SPI_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;
    SPI_Init(pScr->SPIx, &SPI_InitStructure);
    SPI_Cmd(pScr->SPIx, ENABLE);
}




uint8_t spi_read_write(MCU_SPIx *pScr,uint8_t byte)
{
    /* Loop while DR register in not emplty */
    while (SPI_I2S_GetFlagStatus(pScr->SPIx, SPI_I2S_FLAG_TXE) == RESET);

    /* Send byte through the SPI2 peripheral */
    SPI_I2S_SendData(pScr->SPIx, byte);

    /* Wait to receive a byte */
    while (SPI_I2S_GetFlagStatus(pScr->SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    /* Return the byte read from the SPI bus */
    return SPI_I2S_ReceiveData(pScr->SPIx);
}
mcu_spi.h


/****************************************************************
*文件名:SPI.h
*版本:v1.0
*作者:JOHN.FENG
*描述:使用的是STM32内部SPI资源,为了避免多个使用,采用为面向对象编程的方式
****************************************************************/
#ifndef __MCU_SPI_H
#define __MCU_SPI_H
#include "sys.h"

//STM32 内部资源SPI1引脚外设
#define RCC_SPI1_PeriphClockCmd     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE)
#define MCU_SPI1_GPIOx                        GPIOA
#define MCU_SPI1_CSN_PIN                    GPIO_Pin_4
#define MCU_SPI1_CLK_PIN                    GPIO_Pin_5
#define MCU_SPI1_MISO_PIN                    GPIO_Pin_6
#define MCU_SPI1_MISI_PIN                    GPIO_Pin_7

//STM32 内部资源SPI2引脚外设
//https://it.cha138.com/javascript/show-62584.html
#define RCC_SPI2_PeriphClockCmd     RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE)
#define RCC_GPIO_PeriphClockCmd     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE)
#define MCU_SPI2_GPIOx                        GPIOB
#define MCU_SPI2_CSN_PIN                    GPIO_Pin_12
#define MCU_SPI2_CLK_PIN                    GPIO_Pin_13
#define MCU_SPI2_MISO_PIN                    GPIO_Pin_14
#define MCU_SPI2_MISI_PIN                    GPIO_Pin_15
typedef enum   
{
    MCU_SPI1_ClockCmd,
    MCU_SPI2_ClockCmd
    
}MCU_SPIx_clock;

typedef struct  MCU_SPIx_Type 
{
    SPI_TypeDef* SPIx;
    MCU_SPIx_clock   MCU_SPI_ClockCmd;
    GPIO_TypeDef  *MCU_SPI_GPIOx;
    uint16_t     MCU_SPI_CSN;
    uint16_t     MCU_SPI_CLK;
    uint16_t     MCU_SPI_MISO;
    uint16_t     MCU_SPI_MISI;
    
}MCU_SPIx;

//MCU_SPIx spi1={
//    .SPIx                        =      SPI1,
//    .MCU_SPI_ClockCmd    =    MCU_SPI1_ClockCmd,
//    .MCU_SPI_GPIOx     =     MCU_SPI1_GPIOx,
//    .MCU_SPI_CSN       =     MCU_SPI1_CSN_PIN,
//    .MCU_SPI_CLK       =     MCU_SPI1_CLK_PIN,
//    .MCU_SPI_MISO      =     MCU_SPI1_MISO_PIN,
//    .MCU_SPI_MISI     =     MCU_SPI1_MISI_PIN
//};

//MCU_SPIx spi2={
//    .SPIx                        =      SPI2,
//    .MCU_SPI_ClockCmd    =    MCU_SPI2_ClockCmd,
//    .MCU_SPI_GPIOx     =     MCU_SPI2_GPIOx,
//    .MCU_SPI_CSN       =     MCU_SPI2_CSN_PIN,
//    .MCU_SPI_CLK       =     MCU_SPI2_CLK_PIN,
//    .MCU_SPI_MISO      =     MCU_SPI2_MISO_PIN,
//    .MCU_SPI_MISI     =     MCU_SPI2_MISI_PIN
//};

//#define pTMC_MISO             PAout(6)    //33
//#define pTMC_MOSI             PAout(7)    //32
//#define pTMC_CLK              PAout(5)    //31
//#define pTMC_CSN0              PAout(4)    //30

//#define pTMC_MOSI GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
//#define pTMC_MISO GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
//#define pTMC_CLK     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);



void MCU_SPI_Init(MCU_SPIx *pScr);
 
void SPI_SetSpeed(MCU_SPIx *pScr,uint8_t SpeedSet);
uint8_t spi_read_write(MCU_SPIx *pScr,uint8_t byte);


#endif


2.芯片层代码配置

tm4c5130_edv: 

#include "tmc5130_dev.h"


//MCU_SPIx spi1={
//    .SPIx                        =      SPI1,
//    .MCU_SPI_ClockCmd    =    MCU_SPI1_ClockCmd,
//    .MCU_SPI_GPIOx     =     MCU_SPI1_GPIOx,
//    .MCU_SPI_CSN       =     MCU_SPI1_CSN_PIN,
//    .MCU_SPI_CLK       =     MCU_SPI1_CLK_PIN,
//    .MCU_SPI_MISO      =     MCU_SPI1_MISO_PIN,
//    .MCU_SPI_MISI     =     MCU_SPI1_MISI_PIN
//};
//配置电机引脚
MCU_SPIx spi2={
    .SPIx                        =      SPI2,
    .MCU_SPI_ClockCmd    =    MCU_SPI2_ClockCmd,
    .MCU_SPI_GPIOx     =     MCU_SPI2_GPIOx,
    .MCU_SPI_CSN       =     MCU_SPI2_CSN_PIN,
    .MCU_SPI_CLK       =     MCU_SPI2_CLK_PIN,
    .MCU_SPI_MISO      =     MCU_SPI2_MISO_PIN,
    .MCU_SPI_MISI     =     MCU_SPI2_MISI_PIN
};

//配置电机驱动使能引脚
MCU_GPIO_t TMC5130_EN =
{
    .cb.mode_set = OutPut_model,
    .cb.GPIOx_MCU_GPIO = GPIOA,
    .cb.MCU_GPIO_PIN = GPIO_Pin_11,
    .cb.GPIO_MODE = GPIO_Mode_Out_PP,
    //.prop_cb->GPIO_Init = MCU_GPIO_Init_t,

};
//配置电机驱动使能模式:输入or输出
GPIO_PROP_cb_TypeDef TMC5130_EN_pro =
{
    .GPIO_Init = MCU_GPIO_Init_t,
    .GPIO_OutputData = MCU_GPIO_OutputData

};

//配置电机驱动供电电源引脚号
MCU_GPIO_t TMC5130_POWER =
{
    .cb.mode_set = OutPut_model,
    .cb.GPIOx_MCU_GPIO = GPIOC,
    .cb.MCU_GPIO_PIN = GPIO_Pin_0,
    .cb.GPIO_MODE = GPIO_Mode_Out_PP,
    //.prop_cb->GPIO_Init = MCU_GPIO_Init_t,

};
//配置电机驱动供电电源使能模式:输入or输出
GPIO_PROP_cb_TypeDef TMC5130_POWER_pro =
{
    .GPIO_Init = MCU_GPIO_Init_t,
    .GPIO_OutputData = MCU_GPIO_OutputData

};


void TMC_SPI1_CS(uint8_t motor,uint8_t onoff)
{
    if(onoff)
    {
        if(motor == 0)
        {
//            pTMC_CSN0 = 1;
            pTMC_CSN0(1);
        }
        else if(motor == 1)
        {
//            pTMC_CSN0 = 1;
            pTMC_CSN0(1);
        }        
    }
    else
    {
        if(motor == 0)
        {
//            pTMC_CSN0 = 0;
            pTMC_CSN0(0);
        }
        else if(motor == 1)
        {
//            pTMC_CSN0 = 0;
            pTMC_CSN0(0);
        }
    }
}


uint8_t gTMC_SPI1_Status;     
//------------------------------------------------------
//motor:    电机号片选
//reg:        寄存器地址
//返回值:    写入32位数值
//------------------------------------------------------
uint32_t TMC_SPI1_WriteInt(uint8_t motor, uint8_t reg, s32 dat)
{
    uint8_t dat1,dat2,dat3,dat4;
    
    dat1 = dat;
    dat2 = dat>>8;
    dat3 = dat>>16;
    dat4 = dat>>24;
    
    TMC_SPI1_CS(motor,0);
    gTMC_SPI1_Status = spi_read_write(&spi2,reg|0x80);
    dat4 = spi_read_write(&spi2,dat4);
    dat3 = spi_read_write(&spi2,dat3);
    dat2 = spi_read_write(&spi2,dat2);
    dat1 = spi_read_write(&spi2,dat1);

    TMC_SPI1_CS(motor,1);

    dat = (dat4 << 24) + (dat3 << 16) + (dat2 << 8) + dat1;
    return dat; 
}
//------------------------------------------------------
//motor:    电机号片选
//reg:        寄存器地址
//返回值:    读32位数值 
//------------------------------------------------------
uint32_t TMC_SPI1_ReadInt(uint8_t motor, uint8_t reg)
{    
    uint8_t dat1,dat2,dat3,dat4;
    uint8_t i;
    
    s32 dat=0;    
    
    TMC_SPI1_CS(motor,0);
    spi_read_write(&spi2,reg);
    spi_read_write(&spi2,0X00);
    spi_read_write(&spi2,0X00);
    spi_read_write(&spi2,0X00);
    spi_read_write(&spi2,0X00);
    TMC_SPI1_CS(motor,1);

    for(i=0;i<5;i++)
    { }

    TMC_SPI1_CS(motor,0);
    gTMC_SPI1_Status = spi_read_write(&spi2,reg);
    dat4 = spi_read_write(&spi2,0X00);
    dat3 = spi_read_write(&spi2,0X00);
    dat2 = spi_read_write(&spi2,0X00);
    dat1 = spi_read_write(&spi2,0X00);
    TMC_SPI1_CS(motor,1);

    dat = (dat4 << 24) + (dat3 << 16) + (dat2 << 8) + dat1;
    return dat;
}

//配置控制TMC5130芯片的初始化 
void TMC5130_GPIO_Init(void)
{
    
    MCU_SPI_Init(&spi2);
    TMC5130_EN_pro.GPIO_Init(&TMC5130_EN.cb);
    TMC5130_POWER_pro.GPIO_Init(&TMC5130_POWER.cb);
//    
    TMC5130_POWER_pro.GPIO_OutputData(&TMC5130_POWER.cb, 1);
    TMC5130_EN_pro.GPIO_OutputData(&TMC5130_EN.cb, 1);            //TMC5130初始状态设置失能 0:开启 1:关闭

}

void TMC5130_EN_VolSetting(char vol)
{
//    TMC5130_POWER_pro.GPIO_OutputData(&TMC5130_POWER.cb, vol);
    TMC5130_EN_pro.GPIO_OutputData(&TMC5130_EN.cb, vol);
}

#ifndef TMC5130_DEV_H_
#define TMC5130_DEV_H_
#include "mcu_spi.h"
#include <stdio.h>
#include <stdint.h>
#include "mcu_gpio.h"

#define spi1    0    //是不是spi1信号

#if spi1
#define pTMC_CSN0(vol) GPIO_WriteBit(MCU_SPI1_GPIOx, MCU_SPI1_CSN_PIN,(vol & (1<<0 )) ? Bit_SET : Bit_RESET);
#else
#define pTMC_CSN0(vol) GPIO_WriteBit(MCU_SPI2_GPIOx, MCU_SPI2_CSN_PIN,(vol & (1<<0 )) ? Bit_SET : Bit_RESET);
#endif

uint32_t TMC_SPI1_WriteInt(uint8_t motor, uint8_t reg, s32 dat);
uint32_t TMC_SPI1_ReadInt(uint8_t motor, uint8_t reg);
void TMC5130_GPIO_Init(void);
void TMC5130_EN_VolSetting(char vol);
#endif

3.TM4C5130APP层

/****************************************************************
*文件名:TMC5130_EVAL.c
*版本:v1.0
*作者:JOHN.FENG
*描述:步进电机TMC5130驱动程序
****************************************************************/


//#include "IncludeAll.h"
#include "mcu_spi.h"
#include "math.h"
#include "TMC5130_EVAL.h"
#include "delay.h"

#define    TMC5130_EVAL_GLOBALS

/***************************************
//计算配置TMC5130驱动芯片寄存器参数
*输入:转速rpm/分
*输出:VMAX寄存器值ppt
***************************************/
uint32_t TMC5130_speed_Vmax(uint16_t rpm)
{
    uint32_t uSteps_s = 0;    //微步速度μsteps/s
    float VMAX = 0.0;                //VMAX寄存器值ppt
    uSteps_s = M0TOR_SETP * MICRO_STEP * ((float)rpm / 60);
    VMAX = (uSteps_s * 2 * pow(2, 23) / TMC5130_CLK);
    return (uint32_t)VMAX;
}

void TMC5130_init(u8 motor)
{

    TMC5130_GPIO_Init();

    delay_ms(500);

    TMC_SPI1_WriteInt(motor, TMC5130_GSTAT,         0x00000007);

    TMC_SPI1_WriteInt(motor, TMC5130_GCONF,         0x00000000);     //启用了静态芯片电压PWM模式(取决于速度阈值)。“开关
    TMC_SPI1_WriteInt(motor, TMC5130_CHOPCONF,     0x000100c3);
    TMC5130_move_IHOLD_IRUN(9);            //调节电流
    TMC_SPI1_WriteInt(motor, TMC5130_PWMCONF,     0xC40C261E);
    TMC_SPI1_WriteInt(motor, TMC5130_TPWMTHRS,     0);    //Stealthchop 模式设定

    TMC_SPI1_WriteInt(motor, TMC5130_RAMPMODE,     2);

    TMC_SPI1_WriteInt(motor, TMC5130_VMAX,     0);

}

/****************************************************
*函数名:TMC5130_move_run
*作者:john.feng
*输入:电机启动
*输出:无
*返回值:无
****************************************************/
void TMC5130_move_run(uint32_t speed)
{
    uint8_t motor = 0;
    TMC5130_EN_VolSetting(0);                //开启TMC5130使能

    TMC_SPI1_WriteInt(motor, TMC5130_XTARGET,  0);
    TMC_SPI1_WriteInt(motor, TMC5130_VSTART,     0);                    //加速开始速度
    TMC_SPI1_WriteInt(motor, TMC5130_A1,     1000);                        //VSTART和V1之间的首次加速
    TMC_SPI1_WriteInt(motor, TMC5130_V1,     0);                                //只用AMAX,DMAX
    TMC_SPI1_WriteInt(motor, TMC5130_VMAX,     speed);
    TMC_SPI1_WriteInt(motor, TMC5130_DMAX,     1000);          //TMC5130_VMAX 到 TMC5130_V1的减速
    TMC_SPI1_WriteInt(motor, TMC5130_D1,         1000);                    //V1和VSTOP之间的减速
    TMC_SPI1_WriteInt(motor, TMC5130_VSTOP,     10);                    //加速停止速度
    TMC_SPI1_WriteInt(motor, TMC5130_TZEROWAIT,     100);            //设置的静止后的延迟时间
    TMC_SPI1_WriteInt(motor, TMC5130_AMAX,     speed);                    //V1和VMAX之间的秒加速度

    TMC_SPI1_WriteInt(motor, TMC5130_VMAX,     speed);

}

/****************************************************
*函数名:TMC5130_move_stop
*作者:john.feng
*输入:电机停止
*输出:无
*返回值:无
****************************************************/
void TMC5130_move_stop()
{
    u8 motor = 0;
    TMC_SPI1_WriteInt(motor, TMC5130_VMAX,     0);  //减速到零
    TMC5130_EN_VolSetting(1);    //关闭TMC5130的使能

}


/****************************************************
*函数名:TMC5130_move_dir
*作者:john.feng
*输入:电机状态,0:电机停止; 1:电机正转; 2:电机反转; 3:
*输出:无
*返回值:无
****************************************************/
void TMC5130_move_dir(TMC5130_MODE_STU status)
{
    TMC_SPI1_WriteInt(0, TMC5130_RAMPMODE, status);
}


/****************************************************
*函数名:TMC5130_move_chopconf
*作者:john.feng
*输入:电机的细分数
*输出:无
*返回值:无
****************************************************/
//void TMC5130_move_chopconf()
//{
//    TMC_SPI1_WriteInt(0,TMC5130_CHOPCONF,     0x000100c3);
//}


/****************************************************
*函数名:TMC5130_move_chopconf
*作者:john.feng
*输入:电机驱动电流调节 0-31
*输出:无
*返回值:无
****************************************************/
void TMC5130_move_IHOLD_IRUN(uint32_t curr_num)
{

    curr_num = (curr_num << 8) | 0x00070001;
    TMC_SPI1_WriteInt(0, TMC5130_IHOLD_IRUN, curr_num);
}

/****************************************************************
*文件名:TMC5130_EVAL.h
*版本:v1.0
*作者:JOHN.FENG
*描述:步进电机TMC5130驱动程序
****************************************************************/
#ifndef TMC5130_EVAL_H_
#define TMC5130_EVAL_H_

#include "tmc5130_dev.h"
#define MICRO_RPM          600                            //电机转速(单位:一分钟多少圈)

/*电机单圈参数*/
#define STEP_ANGLE        1.8                            //步进电机的步距角 单位:度
#define FSPR          (360.0f/1.8f)   //步进电机的一圈所需脉冲数

#define MICRO_STEP         256                            //细分数
#define M0TOR_SETP        200                            //电机步数

#define TMC5130_CLK     16000000                //步进电机外部时钟
#define TMC5130_speed_reg(MICRO_RPM)     (((M0TOR_SETP*MICRO_STEP) *2*pow(2,23)*(MICRO_RPM/60))/TMC5130_CLK) //对tmc5130驱动芯片寄存器的赋值参数


// ===== TMC5130 register set =====

#define TMC5130_GCONF       0x00        //描述/位名 
#define TMC5130_GSTAT          0x01        //全局状态标志
#define TMC5130_IFCNT          0x02        //接口传输计数器(用于串口)
#define TMC5130_SLAVECONF      0x03        //参数设置
#define TMC5130_INP_OUT        0x04        //输入,输出设置
#define TMC5130_X_COMPARE      0x05        //运动控制器位置的位置比较寄存器
#define TMC5130_IHOLD_IRUN     0x10        //驱动电流
#define TMC5130_TZEROWAIT      0x11        //设置电机静止(stst)后到电机电流断电的延迟时间
#define TMC5130_TSTEP              0x12        //两个1/256微步之间的实际测量时间
#define TMC5130_TPWMTHRS      0x13        //PWM模式的最高速度
#define TMC5130_TCOOLTHRS      0x14        //开启智能能源
#define TMC5130_THIGH          0x15        //设置允许速度依赖切换到不同的斩波模式和全步进,以最大限度地提高扭矩。

#define TMC5130_RAMPMODE       0x20        //方向:1为正向,2为反向
#define TMC5130_XACTUAL        0x21        //目标位置寄存器
#define TMC5130_VACTUAL        0x22        //实际电机速度
#define TMC5130_VSTART         0x23        //电机启动速度
#define TMC5130_A1             0x24        //VSTART和V1之间的首次加速
#define TMC5130_V1             0x25        //第一加/减速相阈值速度
#define TMC5130_AMAX           0x26        //V1和VMAX之间的第二加速度
#define TMC5130_VMAX           0x27        //运动坡道目标速度
#define TMC5130_DMAX           0x28        //VMAX和V1之间的减速
#define TMC5130_D1             0x2A        //V1和VSTOP之间的减速
#define TMC5130_VSTOP          0x2B        //电机停止速度
#define TMC5130_TZEROCROSS     0x2C        //定义减速到零速度后的等待时间
#define TMC5130_XTARGET        0x2D        //目标位置为斜坡模式


#define TMC5130_VDCMIN         0x33        //速度VDCMIN
#define TMC5130_SWMODE         0x34        //交换模式配置
#define TMC5130_RAMPSTAT       0x35        //匝道状态和交换机事件状态
#define TMC5130_XLATCH         0x36        //斜坡发生器锁存位置
#define TMC5130_ENCMODE        0x38        //停止模式选择
#define TMC5130_XENC           0x39        //使用stallGuard2停止
#define TMC5130_ENC_CONST      0x3A        //锁存编码器位置到ENC_LATCH参考开关事件
#define TMC5130_ENC_STATUS     0x3B        //编码器的配置
#define TMC5130_ENC_LATCH      0x3C        //实际编码器位置

#define TMC5130_MSLUT0         0x60
#define TMC5130_MSLUT1         0x61
#define TMC5130_MSLUT2         0x62
#define TMC5130_MSLUT3         0x63
#define TMC5130_MSLUT4         0x64
#define TMC5130_MSLUT5         0x65
#define TMC5130_MSLUT6         0x66
#define TMC5130_MSLUT7         0x67
#define TMC5130_MSLUTSEL       0x68
#define TMC5130_MSLUTSTART     0x69
#define TMC5130_MSCNT          0x6A        //微步计数器
#define TMC5130_MSCURACT       0x6B
#define TMC5130_CHOPCONF       0x6C        //Chopper和driver配置,
#define TMC5130_COOLCONF       0x6D        //coolStep智能电流控制寄存器和stallGuard2配置
#define TMC5130_DCCTRL         0x6E        //自动换相配置寄存器
#define TMC5130_DRVSTATUS      0x6F        //stallGuard2值和驱动程序错误标志
#define TMC5130_PWMCONF          0x70        //电压PWM模式斩波器配置
#define TMC5130_PWMSTATUS     0x71        //实际的PWM振幅标量
#define TMC5130_EN_CTRL         0x72        //编码器模式配置为特殊模式
#define TMC5130_LOST_STEPS     0x73

//Rampenmodi (Register TMC5130_RAMPMODE)
//#define TMC5130_MODE_POSITION   0          //电机停止
//#define TMC5130_MODE_VELPOS     1            //电机正转
//#define TMC5130_MODE_VELNEG     2            //电机反转
//#define TMC5130_MODE_HOLD       3


//Endschaltermodusbits (Register TMC5130_SWMODE)
#define TMC5130_SW_STOPL_ENABLE   0x0001
#define TMC5130_SW_STOPR_ENABLE   0x0002
#define TMC5130_SW STOPL_POLARITY 0x0004
#define TMC5130_SW_STOPR_POLARITY 0x0008
#define TMC5130_SW_SWAP_LR        0x0010
#define TMC5130_SW_LATCH_L_ACT    0x0020
#define TMC5130_SW_LATCH_L_INACT  0x0040
#define TMC5130_SW_LATCH_R_ACT    0x0080
#define TMC5130_SW_LATCH_R_INACT  0x0100
#define TMC5130_SW_LATCH_ENC      0x0200
#define TMC5130_SW_SG_STOP        0x0400
#define TMC5130_SW_SOFTSTOP       0x0800


//Statusbitss (Register TMC5130_RAMPSTAT)
#define TMC5130_RS_STOPL          0x0001
#define TMC5130_RS_STOPR          0x0002
#define TMC5130_RS_LATCHL         0x0004
#define TMC5130_RS_LATCHR         0x0008
#define TMC5130_RS_EV_STOPL       0x0010
#define TMC5130_RS_EV_STOPR       0x0020
#define TMC5130_RS_EV_STOP_SG     0x0040
#define TMC5130_RS_EV_POSREACHED  0x0080
#define TMC5130_RS_VELREACHED     0x0100
#define TMC5130_RS_POSREACHED     0x0200
#define TMC5130_RS_VZERO          0x0400
#define TMC5130_RS_ZEROWAIT       0x0800
#define TMC5130_RS_SECONDMOVE     0x1000
#define TMC5130_RS_SG             0x2000

typedef enum 
{
    TMC5130_MODE_POSITION = 0,        //停止
    TMC5130_MODE_VELPOS = 1,            //正向
        TMC5130_MODE_VELNEG = 2,            //反向
        TMC5130_MODE_HOLD = 3
}TMC5130_MODE_STU;

uint32_t TMC5130_speed_Vmax(uint16_t rpm);

void TMC5130_init(uint8_t motor);
void TMC_Init(void);


void TMC5130_move_run(uint32_t speed);

void TMC5130_move_stop(void);
void TMC5130_move_IHOLD_IRUN(uint32_t curr_num);
void TMC5130_move_dir(TMC5130_MODE_STU status);
//s32 TMC_SPI1_WriteInt(u8 motor, u8 reg, s32 dat);
//s32 TMC_SPI1_ReadInt(u8 motor, u8 reg);

#endif


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值