使用STM32简单控制TMC5160驱动步进电机

首先先来了解一下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数据手册根据自己的需求进行设置。初始化程序如下:
void tmc5160_init3(void) //模式三独立模式{ gpio_inittypedef gpio_initure; __hal_rcc_gpiob_clk_enable(); //开启gpiob时钟 __hal_rcc_gpioa_clk_enable(); //开启gpioa时钟 gpio_initure.pin=gpio_pin_5|gpio_pin_6|gpio_pin_7|gpio_pin_8; gpio_initure.mode=gpio_mode_output_pp; //推挽输出 gpio_initure.pull=gpio_pullup; //上拉 gpio_initure.speed=gpio_speed_freq_high; //高速 hal_gpio_init(gpioa,&gpio_initure); gpio_initure.pin=gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_12|gpio_pin_13|gpio_pin_14|gpio_pin_15; gpio_initure.mode=gpio_mode_output_pp; //推挽输出 gpio_initure.pull=gpio_pullup; //上拉 gpio_initure.speed=gpio_speed_freq_high; //高速 hal_gpio_init(gpiob,&gpio_initure); hal_gpio_writepin(gpioa,gpio_pin_6|gpio_pin_5,gpio_pin_set); hal_gpio_writepin(gpioa,gpio_pin_7,gpio_pin_reset); hal_gpio_writepin(gpiob,gpio_pin_14|gpio_pin_13|gpio_pin_12|gpio_pin_1,gpio_pin_set); hal_gpio_writepin(gpiob,gpio_pin_15|gpio_pin_2|gpio_pin_0,gpio_pin_reset); } 然后pa8需要输出pwm方波,方波的频率决定电机转动速度,可以用pwm通道的方式搞定,也可以用定时器中断来做,这边采用定时器中断的方法,
例如,stm32f103的时钟频率为72m,分频设为72,装载值设为500,每0.5ms中断一次,pa8电平取反,1khz的方波就完成了。频率可以改变。程序如下:
void hal_tim_periodelapsedcallback(tim_handletypedef *htim){ if(htim==(&tim3_handler)) { count++; a8=~a8; if(count>=6400) { //hal_nvic_disableirq(tim3_irqn); led=1; //转一圈,停2s后继续 delay_ms(2000); led=0; count=0; } }} 实现的功能是让电机转1圈后停2s后继续。
采用四相电机,脉冲数控制电机转多少,电机步距角位1.8°,一个脉冲转1.8°,200个脉冲一圈,采用16细分,那么一圈就需要3200个脉冲。
电机转动的速度就由脉冲频率决定,可以根据细分及脉冲频率来换算电机实际转速。


Java中的多态有哪些表现形式
DS28C36安全认证器的安全引导和安全下载
我国家电回收处理方面的法律法规需完善,才能让山寨家电彻底消亡
MCU在家电设计中的应用
国产CPU有哪些品牌?六大国产CPU大比拼!
使用STM32简单控制TMC5160驱动步进电机
洲明LED显示产品及一体化解决方案全方位为上和组织峰会保驾护航
无线电磁阀控制器:现代农业灌溉的骄阳
哈电集团研制出首台应用于高温气冷堆核电站的主氦风机
华虹半导体推出12位SAR ADC IP助力超低功耗MCU平台
物联网的发展现状及物联网有哪些基础道德问题
电容耦合电路的特点
如何利用ST MCSDK实现直流无刷电机控制
中国技术前沿站之新能源与智能网联
应用在智能洗衣机触摸屏上的电容式触摸芯片
应用精彩纷呈 电子行业将成石墨烯最大应用市场
无处不在的嵌入式系统由哪些元素组成?
太阳电池热斑形成的原因分析
英特尔黑科技加持,腾讯应用宝登陆电脑:安卓应用完美移植PC 更有神器辅助
基于fx2n系列的按时间原则控制的plc程序的编写方法浅析