步进电机相关知识 以及 TMC2660 步进电机驱动芯片驱动步进电机

news2024/9/28 1:26:02

步进电机相关知识 以及 TMC2660 步进电机驱动芯片驱动步进电机

    • 前言
      • 一、步进电机基础知识
        • 1、电机常用概念
        • 2、步进电机小知识
        • 3、步进电机分类
        • 4、步进电机工作原理
          • 细分驱动步进电机
        • 5、使用的步进电机型号以及相关参数
      • 二、步进电机驱动芯片 TMC2660 和MCU端
        • 步进电机驱动芯片TMC2660
        • 1、TMC2660端
            • 输入
            • 输出
        • 2、MCU端
          • SPI接口
          • 电机控制接口
      • 三、步进电机速度控制
          • 1、PWM模式
          • 2、输出比较模式
          • 3、翻转模式下如何修改频率
      • 四、步进电机定位控制
        • 1、PWM模式驱动
        • 2、输出比较翻转模式
      • 五、部分demo
      • 六、源代码
      • 七、参考

前言

这是前段时间项目中使用到的电机驱动芯片,拥有标准SPI和STEP/DIR两种接口模式,很好用,具备内部细分,很好用的一款步进电机驱动芯片。

这也是一款典型的SPI接口的步进电机驱动芯片,时序简单。

本文主要是针对 步进电机的相关理论知识和TMC2660 驱动芯片做一个总结。


一、步进电机基础知识

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

步进电机,结构简单,驱动方便,没有累积误差,但是可能因为存在丢步的现象,常用于对精度要求不高的场合

1、电机常用概念

① 转速:电机输出轴的速度,一般单位是 r/min(转每分钟),也常用 RPM 表示。② 输出扭矩:表示了电机输出轴可以输出力的大小,单位一般为 N· m 或者 kg· cm。③ 工作电压:电机正常工作的电压。④ 额定电流:电机正常工作时的电流。⑤ 堵转电流:电机负载过大,驱动力不足,发生堵转时的电流。

2、步进电机小知识


每输入一个脉冲信号,转子就转动一个角度或者前进一步
输出的角位移或线位移 与 输入的脉冲数成正比
转速和脉冲频率成正比
在非超载且不超频的情况下,电机旋转位置只取决于脉冲个数,转速只取决于脉冲信号频率
步进电机调速

  • 控制电机的脉冲频率,来控制电机的转速或者加速度

驱动控制

  • 基础的旋转或者换向控制
3、步进电机分类
  1. 按磁激励划分
  • 永磁式
  • 反应式(磁阻式)
  • 混合式步进电机

  1. 以极性划分
  • 单极性步进电机
  • 双极性步进电机

4、步进电机工作原理

步进电机核心部件

  • 定子
  • 转子
  • 定子上的绕组

步进电机的工作原理

控制定子绕组周期性、交替得电,使定子产生磁场,进而控制步进电机转子一步一步的运动起来
分类可以分为单极性和双极性的步进电机

而我使用的步进电机一般是双极性步进电机,这个步进电机有四根线,双极性步进电机通过改变电流方向来改变每磁场的方向

  • A+
  • A-
  • B+
  • B-

单向极性步进电机,这个不同的是多了一根公共端

  • AB相,四相
  • 公共端一直通电
  • ABCD相交替得电

双极性的双向激励驱动步进电机,整步驱动
分为单向激励和双向激励
双向激励通电顺序

  • AB、A+,B+接正
  • AB、 A-,B+接正
  • AB、A-,B-接正
  • AB、A+,B+接正
细分驱动步进电机

通过改变定子的电流比例,就可以控制转子在一个整步中的不同位置,即可以将一个整步分为多个小步来运行
如果驱动器的细分能力很强,可以将其细分成32细分,64细分
这样就提高了步进电机旋转的流畅度并且提高了每步的精度

5、使用的步进电机型号以及相关参数

下方是我使用的步进电机的型号以及相关参数。
http://www.szrongmai.com/products_detail/productId=124.html

  • 型号:SST43D1125
  • 步距角:1.8 一般一个完整的脉冲可以驱使步进电机旋转一步,如果不使用细分的话,对于步距角为1.8°步距角的步进电机,一次脉冲即可旋转1.8°
  • 额定电流:1.7
  • 电阻:1.35
  • 电感:2.3
  • 保持转矩 260

二、步进电机驱动芯片 TMC2660 和MCU端

步进电机驱动芯片TMC2660

步进电机电机驱动芯片TMC2660,下面是电机驱动芯片资料
TMC2660C-PA 电机驱动器及控制器 Trinamic 封装LQFP44 (10x10) 批次21+ (baidu.com)
参考
基于TMC2660驱动芯片的步进电机驱动设计-电子发烧友网 (elecfans.com)
这里的TMC2660芯片,TMC2660芯片
TMC2660驱动器提供了业界领先的功能集,包括高分辨率微步、无传感器机械负载测量、负载自适应功率优化和低共振斩波操作。

  1. 拥有标准SPISTEP/DIR两种接口模式。
  2. 集成功率MOSFET处理电机电流高达2.2A。
  3. 集成的保护和诊断功能支持稳健和可靠的运行。

TMC2660参数配置通过SPI接口实现,TMC2660具有5个配置和控制寄存器,通过SPI接口来访问这些寄存器

所有的寄存器都是20位,在最高的2位或者3位表示的是寄存器地址也称之为操作码
**根据具体的寄存器选择不同的操作码实现对寄存器的写操作,而每一个写操作都会有一个20位的数据返回。**返回数据的内容可以通过修改配置寄存器来设置,具体格式如下

TMC2660允许通过SPI接口完全控制所有配置参数和模式位。在电机运行之前需要进行初始化。SPI接口也允许回读状态值和位
SPI接口访问方式

从机通过芯片上的低电平选择输入CSN来启用SPI事务。比特传输与总线时钟SCK是同步的,从机在SCK的上升沿上锁存来自SDI的数据,并沿着下降沿将数据驱动到SDO。首先发送最高有效位。与TMC2660的总线事务至少需要20个SCK时钟周期。
如果驱动的时钟超过20个,那么移到SDI的额外位在a之后在SDO上移出,通过内部移位寄存器的20时钟延迟。这可以用于菊花链多个芯片。
在整个总线事务期间,CSN必须是低的。当CSN变高时,内部移位寄存器的内容被锁存到内部控制寄存器中,并被识别为从主设备到从设备的命令。如果发送超过20位,则只将CSN上升沿之前接收到的最后20位识别为命令。
时序图
image.png

1、TMC2660端

芯片上的SPI接口----配置电机参数

  • SCK SPI时钟线
  • SDI SPI主机输出,从机输入
  • SDO SPI主机输入,从机输出
  • CSN CS,SPI片选,从机选择

起始条件

  • CS从高电平切换到低电平

终止条件

  • CS从低电平切换到高电平

在从机的整个选择过程中,CS始终都是低电平
下降沿是通信的开始,上升沿是通信的结束
芯片的输出接口----控制电机

输入
  • STEP
  • DIR
  • ENN
  • CS
  • SCK
  • SDI
  • SDO
  • CS
输出
  • VCC
  • GND
  • OA1 ------>A+
  • OA2 ------>A-
  • OB1 ------>B+
  • OB2 ------>B-
2、MCU端
SPI接口

使用SPI3资源,使用SPI3对TMC2660端寄存器发送数据,控制电机参数

  • SCK ------> SPI_CLK
  • SDI ------> SPI_MOSI
  • SDO ------> SPI_MISO
  • CS ------> SPI_CS
电机控制接口

这里以单个步进电机为例,MCU IO引脚

  • STEP ------> PE5 TIM9_CH1
  • DIR ------> PA8
  • ENN ------> PC9
  • CS ------> PD0

三、步进电机速度控制

有两种模式,学习中使用到的有两种模式

  • PWM模式
  • 输出比较翻转模式
1、PWM模式

image.png

2、输出比较模式

image.png

需要对步进电机的脉冲进行调节,不能太快,太快可能会出现丢步或者堵转的现象

1、初始化定时器
设置ARR、PSC,计数方式以及脉冲输出模式,使能定时器以及中断,设置优先级分组等
2、初始化IO
初始化定时器通道IO、方向引脚、脱机使能引脚
3、逻辑实现
改变转速:修改比较值的大小,改变方向:修改方向引脚高低电平
改变脉冲的频率
4、编写中断服务函数
设置比较值,控制运行的速度

3、翻转模式下如何修改频率

比较值的增量大小

假设定时器,设置的ARR值是1000

那么计数到1000后,又重新开始计数

假如设置CCRX每250次翻转一次,那么此时的增量值就是250
250、500、750、1000时翻转
250时,从高电平变成低电平,

设置CCRX每500翻转一次
500、1000时翻转

周期更长,频率就更低

只需要修改增量值的大小,增量值越小,代表频率越快,速度就越快
增量值越大,频率就越小,速度就越慢


四、步进电机定位控制

其中TMC2660驱动芯片,X,Y轴的电机设置的是16细分
image.png
这个步进电机步距角为1.8°,不细分的情况下,旋转一圈360°需要200个脉冲。为了让旋转更加流畅,使用16细分,实际的输出的步距角就是1.8/16 = 0.1125
所以旋转360°需要3200个脉冲数

可以将角度转换成脉冲数,然后通过控制脉冲个数,驱动步进电机旋转到指定位置停止

实现脉冲计数,当达到指定的脉冲数后就关闭PWM输出或脉冲输出(输出比较模式)

PWM模式,进入一次更新中断,输出一个脉冲,发生一个中断对应一个完整脉冲
输出比较模式需要进入两次输出中断才为一个完整的脉冲

1、PWM模式驱动

image.png

2、输出比较翻转模式

image.png


五、部分demo

下面展示输出比较模式的部分demo

#include "bsp_tim.h"
#include "bsp_uart.h"
#include <stdio.h>
#include <string.h>

STEPPER_MOTOR g_stepper = {0};

// 开启
void bsp_tim_init(void)
{
	// 置低电平
	// ENN  PC9
	// DIR  PA8

	MOTOR1_EN(EN_OFF); // 初始时刻电机EN脚失能

	LL_TIM_CC_EnableChannel(TIM9, LL_TIM_CHANNEL_CH1); /*TIM9 CCR1 通道使能*/
	LL_TIM_EnableAllOutputs(TIM9);					   /*全输出使能*/
	LL_TIM_DisableCounter(TIM9);					   // 计数使能
}

// 开启pwm输出  电机启动
void stepper_star(uint8_t dir)
{
	MOTOR1_EN(EN_ON);			// 使能EN
	MOTOR1_DIR(dir);			// DIR引脚
	LL_TIM_EnableCounter(TIM9); // CNT计数使能

	LL_TIM_EnableIT_UPDATE(TIM9); // 使能更新中断
}

// 失能PWM输出   电机失能
void stepper_stop(void)
{
	MOTOR1_EN(EN_OFF); // 失能EN
	LL_TIM_DisableIT_UPDATE(TIM9);
	LL_TIM_DisableCounter(TIM9); // CNT计数失能
}

void stepper_set_angle(uint16_t angle, uint8_t dir)
{
	g_stepper.pulse_count = angle / MAX_STEP_ANGLE;
	if (g_stepper.pulse_count == 0)
	{
		stepper_stop();
	}
	else
		stepper_star(dir);
}

// 定时器9中断回调函数
uint16_t g_run_flag = 0;
void bsp_tim9_callback(void)
{
	g_run_flag = 1;
	g_stepper.pulse_count--; // 每一个完整的脉冲就--
	printf("%d\r\n", g_stepper.pulse_count);
	if (g_stepper.dir == CW)
	{
		g_stepper.add_pulse_count++; /*顺时针 绝对位置++*/
		printf("++ %d \r\n", g_stepper.add_pulse_count);
	}
	else
	{
		g_stepper.add_pulse_count--; /*绝对位置--*/
		printf("-- %d \r\n", g_stepper.add_pulse_count);
	}
	/*当脉冲数等于0时,代表要发送的脉冲个数已经完成 停止定时器输出*/
	if (g_stepper.pulse_count <= 0)
	{
		stepper_stop();
		g_run_flag = 0;
	}
}

/**
 * @brief  The application entry point.
 * @retval int
 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM9_Init();
  MX_SPI3_Init();
  /* USER CODE BEGIN 2 */
  bsp_spi3_init();
  bsp_tim_init();                        // 定时器输出以及step、dir位初始化
  motor_driver_xy_init(STEPPER_MOTOR_1); // 电机驱动初始�???

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  // stepper_star(CW);
  g_stepper.dir = CW;
  stepper_set_angle(165, g_stepper.dir); // 145
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    // stepper_stop();
    // printf(" hello world!\r\n");
  }
  /* USER CODE END 3 */
}

六、源代码

由于涉及项目代码,后续将会把TMC2660 驱动步进电机的两种方式 开源至我的gitee上

包括

  • 步进电机基础驱动
    • PWM模式驱动
    • 输出比较模式驱动
  • 步进电机定位控制
    • PWM 模式驱动
    • 输出比较模式驱动
  • 步进电机梯形加减速

七、参考

大家可以参考 正点原子 电机驱动教程,里面讲的非常清楚,可以自己亲身实践一下,遇到困难解决困难

也可以在评论区里留言,大家一起解决

多看几次就明白了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins忘记admin密码

jenkins忘记admin密码&#xff0c;重置密码&#xff1a; 1.找打jenkins目录下面的config.xml [rootVM-0-15-centos .jenkins]# find ./* -name config.xml ./config.xml [rootVM-0-15-centos .jenkins]# pwd /root/.jenkins删除下面的这部分内容&#xff1a; [rootVM-0-15-c…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-8 可观测性与分离原理

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-8 可观测性与分离原理

前端远原生js爬取数据的小案例

使用方法 注意分页的字段需要在代码里面定制化修改&#xff0c;根据你爬取的接口&#xff0c;他的业务规则改代码中的字段。比如我这里总条数叫total&#xff0c;人家的不一定。返回的数据我这里是data.rows&#xff0c;看看人家的是叫什么字段&#xff0c;改改代码。再比如我这…

Rust-语句和表达式

if-else Rust中if-else表达式的作用是实现条件分支。if-else表达式的构成方式为&#xff1a;以if关键字开头&#xff0c;后面跟上条件表达式&#xff0c;后续是结果语句块&#xff0c;最后是可选的else块。条件表达式的类型必须是bool。 if-else结构还可以当表达式使用 loop …

JavaScript-3

Web API 基本认知 作用和分类 作用&#xff1a;就是使用 JS 去操作 html 和 浏览器分类&#xff1a;DOM ( 文档对象模型 )、BOM ( 浏览器对象模型 ) DOM 是什么 DOM ( Document Object Model —— 文档对象模型 )它是用来呈现以及与任意 HTML 或 XML 文档交互的 API通俗的说…

数据分析求职-知识脑图

今天和大家聊聊数据分析求职常见面试题&#xff0c;这是这个系列的第一篇文章&#xff0c;但是我不想开始就直接罗列题目&#xff0c;因为这样的文章实在太多了&#xff0c;同学们的兴趣程度肯定一般。所以&#xff0c;我想先和大家聊聊在准备面试题时候通常遇到的困扰&#xf…

部署 LVS-DR 群集

本章内容&#xff1a; -了解LVS-DR群集的工作原理 -会构建LVS-DR负载均衡群集 2.1 LVS-DR 集群 LVS-DR &#xff08; Linux Virtual Server Director Server &#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 2.1.1 &#xff0e; LVS-DR 工作原理 …

【C++】基础:STL字符串库string

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍STL字符串库string。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

【Maven】004-基于 IDEA 构建 Maven 工程

【Maven】004-基于 IDEA 构建 Maven 工程 文章目录 【Maven】004-基于 IDEA 构建 Maven 工程一、概述1、项目构建2、命令方式项目构建命令war 包打包插件和 jdk 版本不匹配 二、项目构建1、命令方式2、IDEA 可视化方式3、构建产物 一、概述 1、项目构建 项目构建是将软件开发…

数据结构初探:揭开数据结构奥秘

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 数组结构起源二. 基本概念和术语2.1 数据2.2 数据元素2.3 数据项2.4 …

点的旋转变换

情形一&#xff08;active or alibi transformation主动变换&#xff09; 在坐标系 x − y x-y x−y中&#xff0c;点 p 1 p_1 p1​逆时针旋转 α \alpha α后到达点 p 2 p_2 p2​。 p 1 p_1 p1​在 x − y x-y x−y中的表示与 p 2 p_2 p2​在 x ′ − y ′ x-y x′−y′中的表…

C# Cad2016二次开发HelloWorld(一)

1 新建类库 二 引用 acdbmgd.dll、acmgd.dll、accoremgd.dll 三 HelloWorld代码 public class Class1{/// <summary>/// 程序入口标识/// </summary>[CommandMethod("HelloWorld")]public void HelloWorld(){Document adoc Autodesk.AutoCAD.Applicatio…

将WAP网站封装成App体验的全新策略

一、传统的App封装方式 传统的App封装技术通常依赖于WebView组件&#xff0c;将WAP内容嵌入到一个原生App框架中。这种方法虽然可以快速实现WAP到App的转换&#xff0c;但存在着明显的缺陷&#xff1a;首先&#xff0c;WebView的性能和用户体验都无法与原生组件相提并论&#x…

STM32H5培训(一)总览

文章目录 1. 前言2. STM32H5系列MCU的特点和新功能包括性能提升、新外设和安全功能等3. STM32H5系列型号之间的区别和关键资源对比4. 性能和功能亮点6. 开发生态参考&#xff1a; 1. 前言 本篇主要介绍STM32H5系列MCU的特点和新功能&#xff0c;包括全新的M33内核、250M主频处…

【GNN2】PyG完成图分类任务,新手入门,保姆级教程

上次讲了如何给节点分类&#xff0c;这次我们来看如何用GNN完成图分类任务&#xff0c;也就是Graph-level的任务。 【GNN 1】PyG实现图神经网络&#xff0c;完成节点分类任务&#xff0c;人话、保姆级教程-CSDN博客 图分类就是以图为单位的分类&#xff0c;举个例子&#xff1…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

150套简约流行国内外优秀网页模板打包 /个人主页网站html模板 /html+css网页设计源码(分享)

这里把自己收藏的最新150套简约流行国内外优秀网页模板打包分享给大家&#xff0c;如果有用请点赞收藏&#xff0c;无密源码&#xff0c;直接拿来就可以用的。它是htmlcss网页设计源码&#xff0c;html5网页静态模板。 我分了品类&#xff0c;按行业或应用场景&#xff0c;不但…

unity C#深拷贝、浅拷贝、直接赋值区别与经典实例

文章目录 浅拷贝深拷贝浅拷贝和直接赋值有啥区别 在C#中&#xff0c;浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是两种不同级别的对象复制方式。它们的区别主要体现在处理引用类型字段时的行为。 浅拷贝 浅拷贝是指复制对象时&…

git修改历史(非最新)提交信息

二、修改最近第二次或更早之前的commit信息 当前有三次提交&#xff0c;从近到远分别为1、2、3 以修改第2次提交为例&#xff08;从最新往前数&#xff09; 1、使用命令git rebase -i HEAD~2 按i进入编辑模式&#xff0c;将对应的pick改为edit&#xff0c;然后ctrlc退出。最…

如何用ChatGPT写教案设计?以“沁园春雪”为例

1. 引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT已成为教育领域的一大创新工具。ChatGPT不仅能够模拟人类对话&#xff0c;还可以帮助设计互动丰富、内容丰富的教案。本文将探索如何利用ChatGPT进行教案教学设计&#xff0c;特别是通过“沁园春雪”这一案例&#xff0…