当前位置:   article > 正文

基于STM32F103的TM4C5130步进电机驱动_stm32 tmc5130

stm32 tmc5130

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


前言

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

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


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

一、TM4C5130是什么?

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

二、使用步骤

1.SPI总线配置

底层硬件SPI驱动文件:

  1. /****************************************************************
  2. *文件名:SPI.c
  3. *版本:v1.0
  4. *作者:JOHN.FENG
  5. *描述:使用的是STM32内部SPI资源,为了避免多个使用,采用为面向对象编程的方式
  6. ****************************************************************/
  7. #include "mcu_spi.h"
  8. SPI_InitTypeDef  SPI_InitStructure;
  9. /**
  10.   * @brief  SPI引脚初始化
  11.   * @param  MCU_SPIx 结构体配置相对应的SPI引脚通道 目前只支持SPI1,SPI2
  12.   * @retval None
  13.   */
  14. void MCU_SPI_Init(MCU_SPIx *pScr)
  15. {
  16.     GPIO_InitTypeDef GPIO_InitStructure;
  17.         
  18.       switch(pScr->MCU_SPI_ClockCmd )
  19.         {
  20.             //根据相对应的SPI通道初始化相对应的时钟
  21.             case MCU_SPI1_ClockCmd:
  22.                 RCC_SPI1_PeriphClockCmd;
  23.                 break;
  24.             case MCU_SPI2_ClockCmd:
  25.             {
  26.                 RCC_GPIO_PeriphClockCmd;
  27.                 RCC_SPI2_PeriphClockCmd;
  28.             }
  29.                 break;
  30.         }
  31. //    RCC_SPI1_PeriphClockCmd;
  32.         
  33.       //PA4 --- SPI1_NSS  PA5 ----- SPI1_SCK    PA6  -----  SPI1_MISO 
  34.       //PA7 --- SPI1_MISI
  35.     GPIO_InitStructure.GPIO_Pin =  pScr->MCU_SPI_CLK | pScr->MCU_SPI_MISI | pScr->MCU_SPI_MISO;
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  37.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.     GPIO_Init(pScr->MCU_SPI_GPIOx, &GPIO_InitStructure);
  39.     GPIO_SetBits(pScr->MCU_SPI_GPIOx,  pScr->MCU_SPI_CLK | pScr->MCU_SPI_MISI | pScr->MCU_SPI_MISO);
  40.     
  41.     GPIO_InitStructure.GPIO_Pin = pScr->MCU_SPI_CSN ;
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  43.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  44.     GPIO_Init(pScr->MCU_SPI_GPIOx, &GPIO_InitStructure);//初始化GPIOB
  45.         
  46.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  47.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        //设置SPI工作模式:设置为主SPI
  48.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //设置SPI的数据大小:SPI发送接收8位帧结构
  49.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //选择了串行时钟的稳态:时钟悬空高
  50.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;    //数据捕获于第二个时钟沿
  51.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  52.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;        //定义波特率预分频的值:波特率预分频值为256
  53.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  54.     SPI_InitStructure.SPI_CRCPolynomial = 7;    //CRC值计算的多项式
  55.     SPI_Init(pScr->SPIx, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  56.     SPI_Cmd(pScr->SPIx, ENABLE); //使能SPI外设
  57. }
  58. //SPI 速度设置函数
  59. //SpeedSet:
  60. //SPI_BaudRatePrescaler_2   2分频   (SPI 36M@sys 72M)
  61. //SPI_BaudRatePrescaler_8   8分频   (SPI 9M@sys 72M)
  62. //SPI_BaudRatePrescaler_16  16分频  (SPI 4.5M@sys 72M)
  63. //SPI_BaudRatePrescaler_256 256分频 (SPI 281.25K@sys 72M)
  64. void SPI_SetSpeed(MCU_SPIx *pScr,uint8_t SpeedSet)
  65. {
  66.     SPI_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;
  67.     SPI_Init(pScr->SPIx, &SPI_InitStructure);
  68.     SPI_Cmd(pScr->SPIx, ENABLE);
  69. }
  70. uint8_t spi_read_write(MCU_SPIx *pScr,uint8_t byte)
  71. {
  72.     /* Loop while DR register in not emplty */
  73.     while (SPI_I2S_GetFlagStatus(pScr->SPIx, SPI_I2S_FLAG_TXE) == RESET);
  74.     /* Send byte through the SPI2 peripheral */
  75.     SPI_I2S_SendData(pScr->SPIx, byte);
  76.     /* Wait to receive a byte */
  77.     while (SPI_I2S_GetFlagStatus(pScr->SPIx, SPI_I2S_FLAG_RXNE) == RESET);
  78.     /* Return the byte read from the SPI bus */
  79.     return SPI_I2S_ReceiveData(pScr->SPIx);
  80. }
mcu_spi.h
  1. /****************************************************************
  2. *文件名:SPI.h
  3. *版本:v1.0
  4. *作者:JOHN.FENG
  5. *描述:使用的是STM32内部SPI资源,为了避免多个使用,采用为面向对象编程的方式
  6. ****************************************************************/
  7. #ifndef __MCU_SPI_H
  8. #define __MCU_SPI_H
  9. #include "sys.h"
  10. //STM32 内部资源SPI1引脚外设
  11. #define RCC_SPI1_PeriphClockCmd     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE)
  12. #define MCU_SPI1_GPIOx                        GPIOA
  13. #define MCU_SPI1_CSN_PIN                    GPIO_Pin_4
  14. #define MCU_SPI1_CLK_PIN                    GPIO_Pin_5
  15. #define MCU_SPI1_MISO_PIN                    GPIO_Pin_6
  16. #define MCU_SPI1_MISI_PIN                    GPIO_Pin_7
  17. //STM32 内部资源SPI2引脚外设
  18. //https://it.cha138.com/javascript/show-62584.html
  19. #define RCC_SPI2_PeriphClockCmd     RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE)
  20. #define RCC_GPIO_PeriphClockCmd     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE)
  21. #define MCU_SPI2_GPIOx                        GPIOB
  22. #define MCU_SPI2_CSN_PIN                    GPIO_Pin_12
  23. #define MCU_SPI2_CLK_PIN                    GPIO_Pin_13
  24. #define MCU_SPI2_MISO_PIN                    GPIO_Pin_14
  25. #define MCU_SPI2_MISI_PIN                    GPIO_Pin_15
  26. typedef enum   
  27. {
  28.     MCU_SPI1_ClockCmd,
  29.     MCU_SPI2_ClockCmd
  30.     
  31. }MCU_SPIx_clock;
  32. typedef struct  MCU_SPIx_Type 
  33. {
  34.     SPI_TypeDef* SPIx;
  35.     MCU_SPIx_clock   MCU_SPI_ClockCmd;
  36.     GPIO_TypeDef  *MCU_SPI_GPIOx;
  37.     uint16_t     MCU_SPI_CSN;
  38.     uint16_t     MCU_SPI_CLK;
  39.     uint16_t     MCU_SPI_MISO;
  40.     uint16_t     MCU_SPI_MISI;
  41.     
  42. }MCU_SPIx;
  43. //MCU_SPIx spi1={
  44. //    .SPIx                        =      SPI1,
  45. //    .MCU_SPI_ClockCmd    =    MCU_SPI1_ClockCmd,
  46. //    .MCU_SPI_GPIOx     =     MCU_SPI1_GPIOx,
  47. //    .MCU_SPI_CSN       =     MCU_SPI1_CSN_PIN,
  48. //    .MCU_SPI_CLK       =     MCU_SPI1_CLK_PIN,
  49. //    .MCU_SPI_MISO      =     MCU_SPI1_MISO_PIN,
  50. //    .MCU_SPI_MISI     =     MCU_SPI1_MISI_PIN
  51. //};
  52. //MCU_SPIx spi2={
  53. //    .SPIx                        =      SPI2,
  54. //    .MCU_SPI_ClockCmd    =    MCU_SPI2_ClockCmd,
  55. //    .MCU_SPI_GPIOx     =     MCU_SPI2_GPIOx,
  56. //    .MCU_SPI_CSN       =     MCU_SPI2_CSN_PIN,
  57. //    .MCU_SPI_CLK       =     MCU_SPI2_CLK_PIN,
  58. //    .MCU_SPI_MISO      =     MCU_SPI2_MISO_PIN,
  59. //    .MCU_SPI_MISI     =     MCU_SPI2_MISI_PIN
  60. //};
  61. //#define pTMC_MISO             PAout(6)    //33
  62. //#define pTMC_MOSI             PAout(7)    //32
  63. //#define pTMC_CLK              PAout(5)    //31
  64. //#define pTMC_CSN0              PAout(4)    //30
  65. //#define pTMC_MOSI GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
  66. //#define pTMC_MISO GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
  67. //#define pTMC_CLK     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);
  68. void MCU_SPI_Init(MCU_SPIx *pScr);
  69.  
  70. void SPI_SetSpeed(MCU_SPIx *pScr,uint8_t SpeedSet);
  71. uint8_t spi_read_write(MCU_SPIx *pScr,uint8_t byte);
  72. #endif

2.芯片层代码配置

tm4c5130_edv: 

  1. #include "tmc5130_dev.h"
  2. //MCU_SPIx spi1={
  3. //    .SPIx                        =      SPI1,
  4. //    .MCU_SPI_ClockCmd    =    MCU_SPI1_ClockCmd,
  5. //    .MCU_SPI_GPIOx     =     MCU_SPI1_GPIOx,
  6. //    .MCU_SPI_CSN       =     MCU_SPI1_CSN_PIN,
  7. //    .MCU_SPI_CLK       =     MCU_SPI1_CLK_PIN,
  8. //    .MCU_SPI_MISO      =     MCU_SPI1_MISO_PIN,
  9. //    .MCU_SPI_MISI     =     MCU_SPI1_MISI_PIN
  10. //};
  11. //配置电机引脚
  12. MCU_SPIx spi2={
  13.     .SPIx                        =      SPI2,
  14.     .MCU_SPI_ClockCmd    =    MCU_SPI2_ClockCmd,
  15.     .MCU_SPI_GPIOx     =     MCU_SPI2_GPIOx,
  16.     .MCU_SPI_CSN       =     MCU_SPI2_CSN_PIN,
  17.     .MCU_SPI_CLK       =     MCU_SPI2_CLK_PIN,
  18.     .MCU_SPI_MISO      =     MCU_SPI2_MISO_PIN,
  19.     .MCU_SPI_MISI     =     MCU_SPI2_MISI_PIN
  20. };
  21. //配置电机驱动使能引脚
  22. MCU_GPIO_t TMC5130_EN =
  23. {
  24.     .cb.mode_set = OutPut_model,
  25.     .cb.GPIOx_MCU_GPIO = GPIOA,
  26.     .cb.MCU_GPIO_PIN = GPIO_Pin_11,
  27.     .cb.GPIO_MODE = GPIO_Mode_Out_PP,
  28.     //.prop_cb->GPIO_Init = MCU_GPIO_Init_t,
  29. };
  30. //配置电机驱动使能模式:输入or输出
  31. GPIO_PROP_cb_TypeDef TMC5130_EN_pro =
  32. {
  33.     .GPIO_Init = MCU_GPIO_Init_t,
  34.     .GPIO_OutputData = MCU_GPIO_OutputData
  35. };
  36. //配置电机驱动供电电源引脚号
  37. MCU_GPIO_t TMC5130_POWER =
  38. {
  39.     .cb.mode_set = OutPut_model,
  40.     .cb.GPIOx_MCU_GPIO = GPIOC,
  41.     .cb.MCU_GPIO_PIN = GPIO_Pin_0,
  42.     .cb.GPIO_MODE = GPIO_Mode_Out_PP,
  43.     //.prop_cb->GPIO_Init = MCU_GPIO_Init_t,
  44. };
  45. //配置电机驱动供电电源使能模式:输入or输出
  46. GPIO_PROP_cb_TypeDef TMC5130_POWER_pro =
  47. {
  48.     .GPIO_Init = MCU_GPIO_Init_t,
  49.     .GPIO_OutputData = MCU_GPIO_OutputData
  50. };
  51. void TMC_SPI1_CS(uint8_t motor,uint8_t onoff)
  52. {
  53.     if(onoff)
  54.     {
  55.         if(motor == 0)
  56.         {
  57. //            pTMC_CSN0 = 1;
  58.             pTMC_CSN0(1);
  59.         }
  60.         else if(motor == 1)
  61.         {
  62. //            pTMC_CSN0 = 1;
  63.             pTMC_CSN0(1);
  64.         }        
  65.     }
  66.     else
  67.     {
  68.         if(motor == 0)
  69.         {
  70. //            pTMC_CSN0 = 0;
  71.             pTMC_CSN0(0);
  72.         }
  73.         else if(motor == 1)
  74.         {
  75. //            pTMC_CSN0 = 0;
  76.             pTMC_CSN0(0);
  77.         }
  78.     }
  79. }
  80. uint8_t gTMC_SPI1_Status;     
  81. //------------------------------------------------------
  82. //motor:    电机号片选
  83. //reg:        寄存器地址
  84. //返回值:    写入32位数值
  85. //------------------------------------------------------
  86. uint32_t TMC_SPI1_WriteInt(uint8_t motor, uint8_t reg, s32 dat)
  87. {
  88.     uint8_t dat1,dat2,dat3,dat4;
  89.     
  90.     dat1 = dat;
  91.     dat2 = dat>>8;
  92.     dat3 = dat>>16;
  93.     dat4 = dat>>24;
  94.     
  95.     TMC_SPI1_CS(motor,0);
  96.     gTMC_SPI1_Status = spi_read_write(&spi2,reg|0x80);
  97.     dat4 = spi_read_write(&spi2,dat4);
  98.     dat3 = spi_read_write(&spi2,dat3);
  99.     dat2 = spi_read_write(&spi2,dat2);
  100.     dat1 = spi_read_write(&spi2,dat1);
  101.     TMC_SPI1_CS(motor,1);
  102.     dat = (dat4 << 24) + (dat3 << 16) + (dat2 << 8) + dat1;
  103.     return dat; 
  104. }
  105. //------------------------------------------------------
  106. //motor:    电机号片选
  107. //reg:        寄存器地址
  108. //返回值:    读32位数值 
  109. //------------------------------------------------------
  110. uint32_t TMC_SPI1_ReadInt(uint8_t motor, uint8_t reg)
  111. {    
  112.     uint8_t dat1,dat2,dat3,dat4;
  113.     uint8_t i;
  114.     
  115.     s32 dat=0;    
  116.     
  117.     TMC_SPI1_CS(motor,0);
  118.     spi_read_write(&spi2,reg);
  119.     spi_read_write(&spi2,0X00);
  120.     spi_read_write(&spi2,0X00);
  121.     spi_read_write(&spi2,0X00);
  122.     spi_read_write(&spi2,0X00);
  123.     TMC_SPI1_CS(motor,1);
  124.     for(i=0;i<5;i++)
  125.     { }
  126.     TMC_SPI1_CS(motor,0);
  127.     gTMC_SPI1_Status = spi_read_write(&spi2,reg);
  128.     dat4 = spi_read_write(&spi2,0X00);
  129.     dat3 = spi_read_write(&spi2,0X00);
  130.     dat2 = spi_read_write(&spi2,0X00);
  131.     dat1 = spi_read_write(&spi2,0X00);
  132.     TMC_SPI1_CS(motor,1);
  133.     dat = (dat4 << 24) + (dat3 << 16) + (dat2 << 8) + dat1;
  134.     return dat;
  135. }
  136. //配置控制TMC5130芯片的初始化 
  137. void TMC5130_GPIO_Init(void)
  138. {
  139.     
  140.     MCU_SPI_Init(&spi2);
  141.     TMC5130_EN_pro.GPIO_Init(&TMC5130_EN.cb);
  142.     TMC5130_POWER_pro.GPIO_Init(&TMC5130_POWER.cb);
  143. //    
  144.     TMC5130_POWER_pro.GPIO_OutputData(&TMC5130_POWER.cb, 1);
  145.     TMC5130_EN_pro.GPIO_OutputData(&TMC5130_EN.cb, 1);            //TMC5130初始状态设置失能 0:开启 1:关闭
  146. }
  147. void TMC5130_EN_VolSetting(char vol)
  148. {
  149. //    TMC5130_POWER_pro.GPIO_OutputData(&TMC5130_POWER.cb, vol);
  150.     TMC5130_EN_pro.GPIO_OutputData(&TMC5130_EN.cb, vol);
  151. }
  1. #ifndef TMC5130_DEV_H_
  2. #define TMC5130_DEV_H_
  3. #include "mcu_spi.h"
  4. #include <stdio.h>
  5. #include <stdint.h>
  6. #include "mcu_gpio.h"
  7. #define spi1    0    //是不是spi1信号
  8. #if spi1
  9. #define pTMC_CSN0(vol) GPIO_WriteBit(MCU_SPI1_GPIOx, MCU_SPI1_CSN_PIN,(vol & (1<<0 )) ? Bit_SET : Bit_RESET);
  10. #else
  11. #define pTMC_CSN0(vol) GPIO_WriteBit(MCU_SPI2_GPIOx, MCU_SPI2_CSN_PIN,(vol & (1<<0 )) ? Bit_SET : Bit_RESET);
  12. #endif
  13. uint32_t TMC_SPI1_WriteInt(uint8_t motor, uint8_t reg, s32 dat);
  14. uint32_t TMC_SPI1_ReadInt(uint8_t motor, uint8_t reg);
  15. void TMC5130_GPIO_Init(void);
  16. void TMC5130_EN_VolSetting(char vol);
  17. #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提供了大量能使我们快速便捷地处理数据的函数和方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/908454
推荐阅读
相关标签
  

闽ICP备14008679号