首先先来了解一下TMC5160的3种工作模式
TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE。
1、当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模式1(SPI控制模式)。在该模式下,用户通过SPI接口来设置TMC5160的寄存器。
TMC5160使用自己的梯形曲线发生器来控制步进电机转动,用户需要设置:开始运动速度VSTART、第一段折线末速度V1、最大速度VMAX、停止速度VSTOP、第一段折线的加速度A1、第二段折线加速度AMAX、第四段折线的减速度DMAX、第五段折线的减速度D1。把上面的参数设置好,再设置工作模式:速度模式和位置模式。最后再设置目标位置。
如果是速度模式运行,不需要设置目标位置,电机就会开始转动。如果是位置模式,则需要设置目标位置,且目标位置与电机当前位置值不同电机才会转动。下图中的红线是电机的实际速度,不管是速度模式还是位置模式,电机的运行过程会按照下图来进行。
2、当SD_MODE接高电平,SPI_MODE拉高,TMC5160工作在模式2(SPI+S/D)。在该模式下,用户通过SPI接口来设置TMC5160的寄存器。TMC5160的功能和DRV8825类似,外界通过脉冲和方向引脚来控制步进电机运动。
3、当SD_MODE接高电平,SPI_MODE接地,TMC5160工作在模式3(S/D独立模式)。在该模式下,SPI接口失能,TMC5160的工作状态由CFG引脚配置,外界通过脉冲和方向引脚来控制步进电机运动。TMC5160可以完全独立工作,不需要接CPU。
 
目前是实现电机的简单转动,下面将用模式三来控制电机。
该模式下不需要通过SPI通讯,配置相关GPIO引脚和发送频率一定的正弦波即可。TMC5160的GPIO和STM32的引脚对应如下表:
先将SD_MODE接地,SPI_MODE拉高(PB1=1,PB=0),进入独立模式。
其它引脚的参数可以参考TMC5160数据手册根据自己的需求进行设置。初始化程序如下:
  1. void TMC5160_Init3(void) //模式三独立模式
  2. {
  3. GPIO_InitTypeDef GPIO_Initure;
  4.  
  5. __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
  6. __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
  7.  
  8. GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8;
  9. GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
  10. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
  11. GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
  12. HAL_GPIO_Init(GPIOA,&GPIO_Initure);
  13.  
  14. GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  15. GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
  16. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
  17. GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
  18. HAL_GPIO_Init(GPIOB,&GPIO_Initure);
  19.  
  20. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6|GPIO_PIN_5,GPIO_PIN_SET);
  21. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
  22. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_12|GPIO_PIN_1,GPIO_PIN_SET);
  23. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15|GPIO_PIN_2|GPIO_PIN_0,GPIO_PIN_RESET);
  24. }
然后PA8需要输出PWM方波,方波的频率决定电机转动速度,可以用PWM通道的方式搞定,也可以用定时器中断来做,这边采用定时器中断的方法,
例如,STM32F103的时钟频率为72M,分频设为72,装载值设为500,每0.5ms中断一次,PA8电平取反,1KHZ的方波就完成了。频率可以改变。程序如下:
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. if(htim==(&TIM3_Handler))
  4. {
  5. COUNT++;
  6. A8=~A8;
  7.  
  8. if(COUNT>=6400)
  9. {
  10. //HAL_NVIC_DisableIRQ(TIM3_IRQn);
  11. LED=1; //转一圈,停2s后继续
  12. delay_ms(2000);
  13. LED=0;
  14. COUNT=0;
  15. }
  16. }
  17. }
实现的功能是让电机转1圈后停2s后继续。
采用四相电机,脉冲数控制电机转多少,电机步距角位1.8°,一个脉冲转1.8°,200个脉冲一圈,采用16细分,那么一圈就需要3200个脉冲。
电机转动的速度就由脉冲频率决定,可以根据细分及脉冲频率来换算电机实际转速。

使用STM32控制TMC5160驱动步进电机的更多相关文章

  1. STM32 控制步进电机 28BYJ-48

    STM32 控制步进电机 28BYJ-48  http://blog.chinaunix.net/uid-12664992-id-300272.html 步进电机驱动最简化的逻辑: //四相八拍:A- ...

  2. STM32F103控制两个步进电机按照一定转速比运动

    这个暑假没有回家,在学校准备九月份的电子设计竞赛.今天想给大家分享一下STM32定时器控制两个步进电机按照一定速度比转动的问题. 这次做的05年的电子设计竞赛题目,运动悬挂系统..本实验是控制两个步进 ...

  3. FPGA驱动步进电机

    步进电机 步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受 ...

  4. python代码实现树莓派3b+驱动步进电机

    python代码实现树莓派3b+驱动步进电机 之前买了个树莓派,刚买回来那会儿热情高涨,折腾了一段时间,然后就放那吃灰了.前几天忽然想起来这个东西了,决定再玩玩儿,于是就从某宝上购买了一套步进电机.驱 ...

  5. arduino中驱动 步进电机

    参考:https://www.arduino.cn/thread-75936-1-1.html 知识点:    步进电机是一种将电脉冲转化为角位移的执行机构.通俗一点讲:当步进驱动器接收到一个脉冲信号 ...

  6. STM32硬件IIC驱动设计(转)

    源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论

  7. MPU6050工作原理及STM32控制MPU6050

    源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍

  8. STM32移植USB驱动总结

    https://blog.csdn.net/stm32_newlearner/article/details/88095944 stm32   移植usb驱动开发 单片机 STM32单片机和51单片机 ...

  9. stm32控制步进电机加减速

    实习公司项目需要控制步进电机,电机方面主要包括控制运动.加减速.限位.下面介绍一下在电机控制方面的心得,由于对于电机的控制不需要很精确,并且自身能力有限,相比于大牛有很大的差距. 1.需要实现的功能 ...

随机推荐

  1. BSS应用程序云原生部署的8大挑战

    云原生部署改变了软件开发.根据云原生计算基金会(CNCF)2021年年度调查,96%的组织正在使用或评估Kubernetes.更确切地说,560万开发者在使用Kubernetes,比去年增加了67%. ...

  2. Linux yum搭建私有仓库

    搭建yum仓库需要两种资源: rpm包 rpm包的元数据(repodata) 搭建好仓库后需要使用三种网络协议共享出来 http或https ftp 范例: 使用http协议搭建私有仓库 (本示例使用 ...

  3. PotPlayer播放百度云盘视频

    需要的工具 PotPlayer.油猴tampermonkey.坚果(这个不用下载,有个账号就行) 下载地址:百度网盘 步骤 安装油猴tampermonkey 拖拽Tampermonkey_4.14.c ...

  4. bat-winget-win平台的软件包管理器

    win10 1709版本以后 引入的包管理器,如果不可用 需要 更新一下 应用安装程序. winget命令的功能  常用的就  安装 卸载 更新  . 卸载 使用中如果提示 策略 不允许,可执行下面命 ...

  5. 用Python实时获取Steam特惠游戏数据,我看看谁的钱包还有钱

    前言 大家好鸭, 我是小熊猫 Steam大家应该不陌生吧?不知道的话就让我们来了解一下吧~(一下简称"S") S是由美国电子游戏商Valve于2003年9月12日推出的数字发行平台 ...

  6. HiEngine:可媲美本地的云原生内存数据库引擎

    摘要:HiEngine与华为GaussDB (for MySQL)集成,将内存数据库引擎的优势带到云端,并与基于磁盘的引擎共存.HiEngine的性能比传统的以存储为中心的解决方案高出7.5倍. 本文 ...

  7. 【cartographer_ros】七: 主要配置参数说明

    上一节介绍了路标Landmark数据的订阅和发布,各类数据的发布和订阅基本阐述完毕. 本节会介绍cartographer的主要配置参数,研究这些参数的使用和对算法的影响. 目录 1,map_build ...

  8. [ERROR] Another process with pid 914 is using unix socket file.

    mysql启动报错 1.首先到mysql的配置文件中,确定socket文件路径 vim /etc/my.cnf 2.删除mysql.sock.lock 3.启动mysql

  9. C++ 处理类型名(typedef,auto和decltype)

    随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面.一是一些类型难于"拼写",它们的名字既难记又容易写错,还无法明确体现其真实目的和含义.二是有时候根本搞不 ...

  10. DQL分组查询和DQL分页查询

    分组查询: 1.语法:group by 分组字段: 2.注意: 分组之后查询的字符按:分组字段.聚合函数 where 和having 的区别 where再分组前进行限定,如果不满足条件则不参与分组.h ...