04_TMC5160驱动两相步进电机(STM32芯片)

这篇博客详细介绍了如何使用STM32芯片驱动TMC5160控制器来操作两相步进电机。通过配置电流、步进模式、运动参数等,实现了电机的精确控制。涉及的硬件初始化包括SPI通信、使能输出、步进脉冲等,并提供了相应的C语言函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

TMC5160.h

#ifndef _TMC5160_h_
#define _TMC5160_h_
#include "main.h"

#define configModeSTEP            0//定义5160步进模式对应配置值
#define configModeLocation        1//定义5160步进模式对应配置值
#define configmaxCurrent         4.7 //定义芯片的最大电流
#define configDirLeft1             1 //定义电机1的右方向为1
#define configDirRight1            0 //定义电机1的左方向为1
#define configDirLeft2             1 //定义电机1的右方向为1
#define configDirRight2         0 //定义电机1的左方向为1

//EleMchinery_SPI  SPI初始化函数
//#define SPI_SendData_OneByte(TxData)    SPI1_ReadWriteByte(u16 TxData)
//#define    SPIInit_ConfigTMC5160()                SPI1_Init()
//EleMchinery_CS  SPI通信管脚
#define TMC5160_SPICS1_IOInit()             GPIO_OUT_Init(GPIO_C,GPIO_Pin_14)
#define TMC5160_SPICS2_IOInit()             GPIO_OUT_Init(GPIO_A,GPIO_Pin_4)

#define TMC5160_SPICS1_L()                        GPIO_ResetBits(GPIOC,GPIO_Pin_14)
#define TMC5160_SPICS2_L()                        GPIO_ResetBits(GPIOA,GPIO_Pin_4)

#define TMC5160_SPICS1_H()                        GPIO_SetBits(GPIOC,GPIO_Pin_14)
#define TMC5160_SPICS2_H()                        GPIO_SetBits(GPIOA,GPIO_Pin_4)
//EleMchinery_DRV_ENN    使能管脚
#define    TMC5160_DRVENN1_IOInit()            GPIO_OUT_Init(GPIO_C,GPIO_Pin_15)
#define    TMC5160_DRVENN2_IOInit()            GPIO_OUT_Init(GPIO_C,GPIO_Pin_0)

#define    TMC5160_DRVENN1_L()                        GPIO_ResetBits(GPIOC,GPIO_Pin_15)
#define    TMC5160_DRVENN2_L()                        GPIO_ResetBits(GPIOC,GPIO_Pin_0)

#define    TMC5160_DRVENN1_H()                        GPIO_SetBits(GPIOC,GPIO_Pin_15)
#define    TMC5160_DRVENN2_H()                        GPIO_SetBits(GPIOC,GPIO_Pin_0)
//EleMchinery_Step      步进引脚
#define    TMC5160_Step1_IOInit()            GPIO_OUT_Init(GPIO_C,GPIO_Pin_13)
#define    TMC5160_Step2_IOInit()            GPIO_OUT_Init(GPIO_A,GPIO_Pin_0)

#define    TMC5160_Step1_H()                GPIO_SetBits(GPIOC,GPIO_Pin_13)
#define    TMC5160_Step2_H()                GPIO_SetBits(GPIOA,GPIO_Pin_0)

#define    TMC5160_Step1_L()                GPIO_ResetBits(GPIOC,GPIO_Pin_13)
#define    TMC5160_Step2_L()                GPIO_ResetBits(GPIOA,GPIO_Pin_0)

//EleMchinery_DIR      方向引脚
#define    TMC5160_DIR1_IOInit()            GPIO_OUT_Init(GPIO_E,GPIO_Pin_6)
#define    TMC5160_DIR2_IOInit()            GPIO_OUT_Init(GPIO_C,GPIO_Pin_3)

#define    TMC5160_DIR_H1()            GPIO_SetBits(GPIOE,GPIO_Pin_6)
#define    TMC5160_DIR_H2()            GPIO_SetBits(GPIOC,GPIO_Pin_3)

#define    TMC5160_DIR_L1()            GPIO_ResetBits(GPIOE,GPIO_Pin_6)
#define    TMC5160_DIR_L2()            GPIO_ResetBits(GPIOC,GPIO_Pin_3)

//EleMchinery_SDMode  SD模式选择引脚
#define    TMC5160_SDMode1_IOInit()            GPIO_OUT_Init(GPIO_E,GPIO_Pin_5)
#define    TMC5160_SDMode2_IOInit()            GPIO_OUT_Init(GPIO_C,GPIO_Pin_2)

#define    TMC5160_SDMode1_H()                GPIO_SetBits(GPIOE,GPIO_Pin_5)
#define    TMC5160_SDMode2_H()                GPIO_SetBits(GPIOC,GPIO_Pin_2)

#define    TMC5160_SDMode1_L()                GPIO_ResetBits(GPIOE,GPIO_Pin_5)
#define    TMC5160_SDMode2_L()                GPIO_ResetBits(GPIOC,GPIO_Pin_2)

//EleMchinery_SPIMode  SPI模式选择引脚
#define    TMC5160_SPIMode1_IOInit()        GPIO_OUT_Init(GPIO_E,GPIO_Pin_4)
#define    TMC5160_SPIMode2_IOInit()        GPIO_OUT_Init(GPIO_C,GPIO_Pin_1)

#define    TMC5160_SPIMode1_H()                GPIO_SetBits(GPIOE,GPIO_Pin_4)
#define    TMC5160_SPIMode2_H()                GPIO_SetBits(GPIOC,GPIO_Pin_1)

#define    TMC5160_SPIMode1_L()                GPIO_ResetBits(GPIOE,GPIO_Pin_4)
#define    TMC5160_SPIMode2_L()                GPIO_ResetBits(GPIOC,GPIO_Pin_1)
typedef struct
{
    uint8_t setMode;//运动模式设置
    uint8_t maxCurrent;//电流额度,31~256,最大4.7A,根据50mΩ
    uint8_t runCurrent;//运动电流0.6A~6.6A,对应值为6~60,小数点一位,采样电阻采用50mR
    uint8_t standbCurrent;//静止电流0.6A~6.6A,对应值为6~60,小数点一位,采样电阻采用50mR
    uint8_t subdivision;//电机细分
    uint32_t  moveStepNumber;//步进模式下的运动走多少步
    int32_t    StepNumber;//电机物理位置步数记录
    uint16_t oneAcceleration;//电机第一阶段加速度无符号16位有效值0~2^16
    uint32_t oneSpeed;//电机第一阶段目标速度无符号20位有效值0~2^20
    uint16_t Acceleration;//电机加速度无符号16位有效值0~2^16
    uint32_t maxSpeed;//电机最大速度有符号16位  有效值0~2^20
    uint16_t DecapAcceleration;//电机减速度无符号16位有效值0~2^16
    uint16_t oneDecapAcceleration;//电机减速度最后一个阶段
    uint16_t startSpeed;//电机启动速度有符号16位 有效值0~2^16
    uint16_t stopSpeed;//电机关闭速度有符号16位 有效值0~2^16
    int32_t    XACTUAL;    //电机实际位置 有效值0~+-2^31
    int32_t    XTARGET;    //电机目标位置 有效值0~+-2^31
} SystemTMC5160Data;
extern SystemTMC5160Data TMC5160_1;
extern SystemTMC5160Data TMC5160_2;
void TMC5160_IO_Init(uint8_t num);
void TMC5160_SPI_CS_OPEN(uint8_t num);
void TMC5160_SPI_CS_CLOSE(uint8_t num);
uint8_t TMC5160_SPI_SendData(uint8_t num,uint16_t Writerdata);
void TMC5160_MODE_Set(uint8_t Num,uint8_t setMode,SystemTMC5160Data *moveData);
void TMC5160_MoveParameterSet(uint8_t Num,uint8_t setMode,SystemTMC5160Data *moveData,uint8_t DIR,uint32_t endLocation);
void TMC5160_Writer(uint8_t Num,uint8_t adr,uint8_t data1,uint8_t data2,uint8_t data3,uint8_t data4);
void TMC5160_SPI_MODE_L(uint8_t num);
void TMC5160_STEP_H(uint8_t num);
void TMC5160_STEP_L(uint8_t Num);
void TMC5160_OPEN(uint8_t Num);
void TMC5160_Close(uint8_t Num);
uint8_t TMC5160_Location_read(uint8_t Num);

#endif
 

TMC5160.c

/****************
函数名称:TMC5160_IO_Init_SPI
函数功能: 硬件初始化——SPI
传入参数:无
输出参数:无
****************/
void TMC5160_IO_Init_SPI(uint8_t num)
{
//    SPI1_Init();//SPI引脚已经独立在main中初始化
    switch(num)
    {
    case 1:
        TMC5160_SPICS1_IOInit();//CS1初始化
        break;
    case 2:
        TMC5160_SPICS2_IOInit();//CS2初始化
        break;
    case 3:

        break;
    case 4:

        break;
    case 5:

        break;
    case 6:

        break;
    }
}
/****************
函数名称:TMC5160_SPI_CS_OPEN
函数功能: SPI片选打开
传入参数:num第几个电机
输出参数:无
****************/
void TMC5160_SPI_CS_OPEN(uint8_t num)
{
    switch(num)
    {
    case 1:
        TMC5160_SPICS1_L();
        break;
    case 2:
        TMC5160_SPICS2_L();
        break;
    case 3:

        break;
    case 4:

        break;
    case 5:

        break;
    case 6:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值