在TMC2209开箱贴中,已经介绍了驱动模块每一个引脚的作用,这样贴出来再看一下:


首先,我需要快速验证一下我所购买的步进电机滑台丝杆是否可以正常的驱动,秉承着接最少的线让电机先转起来的原则,总共连接了11根线,连接示意图如下:



大致可以分为三类:
1、电机(A+、A-、B+、B-)
2、电源(电机供电、信号线电平)
3、信号线(EN、DIR、STEP)
这样应该就可以转动电机,开始敲代码,将上一章“MCU环境搭建”中的LED翻转Copy过来,再添加三个GPIO即可,完成后如下:
#include <stdio.h>#include "driver/gpio.h"#define USR_LED_IO GPIO_NUM_3#define TMC_EN_IO GPIO_NUM_4#define TMC_STEP_IO GPIO_NUM_5#define TMC_DIR_IO GPIO_NUM_20void TMC_SET_EN(uint8_t en){ gpio_set_level(TMC_EN_IO, !en);}void TMC_SET_DIR(uint8_t dir){ gpio_set_level(TMC_DIR_IO, dir);}void GPIO_Init(void){ gpio_config_t gpio_conf = {0}; gpio_conf.pin_bit_mask = 1ull << USR_LED_IO; gpio_conf.mode = GPIO_MODE_OUTPUT; gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; gpio_conf.pull_up_en = GPIO_PULLUP_DISABLE; gpio_conf.intr_type = GPIO_INTR_DISABLE; gpio_config(&gpio_conf); gpio_conf.pin_bit_mask = 1ull << TMC_EN_IO; gpio_config(&gpio_conf); gpio_conf.pin_bit_mask = 1ull << TMC_STEP_IO; gpio_config(&gpio_conf); gpio_conf.pin_bit_mask = 1ull << TMC_DIR_IO; gpio_config(&gpio_conf);}void app_main(void){ GPIO_Init(); TMC_SET_EN(1); TMC_SET_DIR(1); while(1) { gpio_set_level(GPIO_NUM_3, 1); gpio_set_level(GPIO_NUM_5, 1); vTaskDelay(500); gpio_set_level(GPIO_NUM_3, 0); gpio_set_level(GPIO_NUM_5, 0); vTaskDelay(500); }}我擦,为什么灯每个500ms再闪烁,而电机为什么不会500ms转动一点呢?是我线接错了还是代码写错了?应该排除发现将vTaskDelay中的参数修改成1,电机就开始转动了。
欸,不对啊。我所购买的步进电机滑台丝杆是:输出190个脉冲,白色塑料转动360°,那么一整步大约就是1.95°。按理说1.95°的变化应该是可以看到的,为什么会看不出来呢?
这就跟部分活动的TMC2209的驱动有关系了,都是它在"捣鬼"!这里有两个名词整步和微步。
先来介绍一下概念:
整步:这是步进电机的基础物理单位。普通的步进电机(如1.8°步距角电机)默认情况下,每接收1个脉冲,就会转动 1.8度。转完一整圈(360度)需要 200 个脉冲。
微步:这是一种通过驱动器实现的电子技术。它把原本的一个“整步”(比如那 1.8度),人为地切分成很多个极小的步骤。常见的细分倍数有 1/2、1/4、1/16、1/32 等。
假设将驱动器设置成了 1/16 微步模式。原本的整步角度:1.8°,现在的微步角度:1.8° ÷ 16 = 0.1125°。此时,控制器发出的每一个脉冲,只会让电机转动极其微小的 0.1125度。想要电机转满一圈,就需要 200 × 16 = 3200 个脉冲。

我要赚赏金
