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:

04-03
### TMC5160 技术资料概述 TMC5160 是一款高性能步进电机驱动芯片,广泛应用于工业自动化、机器人技术和精密控制领域。以下是关于 TMC5160 的技术资料、数据手册和应用场景的具体说明。 #### 数据手册与技术文档 TMC5160 数据手册提供了全面的技术参数和支持信息,帮助开发者深入了解这款芯片的功能特性。中文版的数据手册已经发布,为中文用户带来了极大的便利[^1]。通过阅读数据手册,可以获取以下关键信息: - **工作电压范围**:支持宽泛的工作电压区间。 - **电流调节能力**:能够精确调整电机绕组中的电流强度。 - **微步步数设置**:支持高分辨率的微步细分模式。 - **保护机制**:内置过温、短路等多种安全防护措施。 #### 原理图设计指导 针对实际应用需求,官方还发布了详细的原理图设计方案。这些资源可以帮助工程师理解如何将 TMC5160 芯片集成到具体电路中[^2]。例如,在普通模式下运行时,需要考虑以下几个方面: - 输入电源管理:确保稳定的直流供电环境。 - 温度监控模块:防止因长时间负载过高而导致器件损坏。 - 电磁干扰抑制策略:减少外部信号对内部逻辑的影响。 #### 固件开发支持 为了简化基于 TMC5160 的嵌入式系统的实现过程,厂商推出了配套的固件库工具包。此套件不仅包含了 SPI 接口操作接口定义,还包括了一系列实用函数用于初始化硬件寄存器并执行日常任务[^4]。下面是一个简单的代码片段展示如何利用该库来配置基本参数: ```c #include "tmc_api.h" void configure_TMC5160() { uint8_t status; // 初始化设备连接 tmc_spi_init(); // 设置最大电流限值 (单位 mA) status = tmc_set_register(TMC_MAX_CURRENT, 1000); if (!status) printf("Failed to set max current\n"); // 启用 StealthChop 模式以降低噪音水平 status = tmc_enable_stealthchop(true); if (!status) printf("Failed to enable stealthchop mode\n"); } ``` #### 应用场景分析 凭借卓越性能表现,TMC5160 成功覆盖多个行业领域内的多样化用途案例: - 工业机械臂关节运动控制单元; - CNC 数控机床轴定位精度提升组件; - 打印机头平稳移动轨迹规划引擎; 尽管如此,值得注意的是同家族其他成员如 TMC2209 也各自拥有独特优势,并可能更适合某些特定场合下的部署考量[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值