[应用相关] SPI与DRV8889串行通讯,驱动步进电机

[复制链接]
2296|20
 楼主| tfqi 发表于 2021-9-4 14:28 | 显示全部楼层 |阅读模式
一、前言
DRV8889其实就是一款步进驱动器芯片,由大名鼎鼎的TI制造。这款步进驱动芯片体积相当小,比1元的硬币还要小一点。我用DRV8889设计了一款1托2的步进电机驱动器(使用两个DRV8889即可),整个项目的软件与硬件都自己完成,最后发现其效果还不错。值得注意的是,这个步进驱动芯片不集成步进电机的加减速算法。例如梯形速度曲线算法,S型速度曲线算法都需要自己实现。为什么需要速度曲线算法?说白了就是为了避免步进电机丢步。

后续我会更新梯形速度曲线算法的源代码与教程,还有S型速度曲线算法的源代码与教程。老实说,S型曲线算法比较复杂一些,大部分的应用使用梯形运动曲线即可。

这篇博文主要介绍使用我编写的DRV8889驱动代码(bsp_DRV8889.h与bsp_DRV8889.c),使得MCU与DRV8889通过SPI接口正常通讯,完成写入DRV8889的寄存器与读取DRV8889寄存器的功能,为驱动步进电机做好准备。以下是DRV8889-Q1的功能介绍。

Note : 并不是说有了DRV8889驱动代码就不需要看datasheet了,一定要多看datasheet(虽然是英文版,也要多看),尤其是寄存器章节。



watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg

 楼主| tfqi 发表于 2021-9-4 14:30 | 显示全部楼层
二、硬件设计
简单介绍一下硬件设计。

2.1、PCB原理图设计
DRV8889提供了原理图的参考设计,直接使用就好了。

MCU_SLEEP接到MCU的PH2
MCU_DRVOFF接到MCU的PH3
MCU_DIR接到MCU的PH4
MCU_STEP接到MCU的PA2
SPI1_SCK接到MCU的PA5
SPI1_MISO接到MCU的PA6
SPI1_MOSU接到MCU的PA7
SPI1_NSS接到MCU的PA4
MCU_FAULT接到MCU的PC4

458556133123af4003.png
2.2、PCB Layout
电容尽量接近IC,还有注意一下IC底部散热孔的设计。

3350761331240a626e.png

 楼主| tfqi 发表于 2021-9-4 14:31 | 显示全部楼层
三、CubeMX
3.1、RCC

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:32 | 显示全部楼层
3.2、DEBUG

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:33 | 显示全部楼层
3.3、Clock Configuration

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:34 | 显示全部楼层
3.4、SPI配置

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:35 | 显示全部楼层
3.5、GPIO配置

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:36 | 显示全部楼层
3.6、TIM

先用定时器产生PWM波,控制步进电机转起来。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:37 | 显示全部楼层
3.7、Project Manager

生成代码。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:38 | 显示全部楼层
四、Keil
4.1、Target

我最近做项目都是使用V6.14,同学们也可以继续使用V5。Use MicroLIB一定要勾选!!!!
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:39 | 显示全部楼层
4.2、Output

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:40 | 显示全部楼层
4.3、C/C++(AC6)

我的优化等级一般选择3级,这个按大家的习惯来就好了。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:41 | 显示全部楼层
4.4、Debug配置

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:42 | 显示全部楼层
4.5、添加DRV8889驱动代码

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:43 | 显示全部楼层
4.6、添加include路径

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:44 | 显示全部楼层
五、代码

我是使用MDK的中间件EventRecorder来重定向printf,也可以使用USART来重定向printf都可以的。一定要实现printf重定向。

5.1、main.h

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:45 | 显示全部楼层
5.2、bsp_DRV8889.c

一般情况下,用户只需要修改相电流,脉冲细分数,还有转向。

当前我设置相电流是18.75%,脉冲细分数1/8(最大支持1/255),电机正转(CW)。其实电机的转向是根据DIR引脚决定的,这里只是封装了一下。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:46 | 显示全部楼层
5.3、tim.c

使用定时器17的定时器溢出来翻转STEP引脚,从而产生PWM脉冲给步进驱动器IC,当前使用的是一种调试手段,实际项目需要使用定时器的PWM模式输出PWM脉冲给步进驱动器IC。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:47 | 显示全部楼层
5.4、main.c

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


 楼主| tfqi 发表于 2021-9-4 14:48 | 显示全部楼层
六、DEBUG
6.1、观察实时变量

TRQ_DAC = 0x0D表示相电流设置了18.75%。
MICROSTEP_MODE = 0x05表示脉冲细分数为1/8。表示写入DRV8889寄存器成功了。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

3317

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部