概述
TMC2300驱动电压2-11V,QFN3*3 20PIN。具有两种驱动方式(1.脉冲+方向引脚 2.单线串口),可实现无感负载测量,通过负载测量可实现电机的防丢步设计。
典型应用框架及引脚说明
典型应用框架
引脚说明
详细可见数据手册2.2
简要说明:
STEP: 脉冲输入引脚
DIR :方向控制引脚
MODE:0:单线串口控制模式 1:脉冲+方向控制模式
AD0、AD1:在脉冲+方向模式下配置驱动细分,在单线串口模式下是硬件通讯地址。
DIAG:在单线串口模式下,可配置为脉冲输出,电机每步进一步输出一个脉冲。也可配置为丢步输出,当检测即将丢步时输出一个脉冲。
详细说明:
1 | OA2 | 电机线圈A输出2 |
2 | VCP | 充电泵电压。可通过1nF至100nF电容连接到VS,也可以使用内部电容器不连接 |
3 | DIR | 方向输入 |
4 | STEP | 脉冲输入 |
5 | MS1_AD0 | 细分数配置(UART模式下,用于选择寄存器地址,AD0=LSB,AD1=MSB) MS2,MS1: 00:1/8 01:1/32 10:1/64 11:1/16 |
6 | MS2_AD1 | |
7 | EN | 使能输入,高电平使能 |
8 | STEPPER | 模式选择输入 STEPPER,MODE: 10:单线串口模式 11:独立步进模式 |
9 | MODE | |
10 | PDN_UART | UART输入/输出;在独立步进模式下,反向断电控制输入(低电平有效) |
11 | VIO/NSTDBY | 供电引脚(1.8V至5V),若接GND时,进入待机模式并复位 |
12 | DIAG | 诊断输出;当驱动程序错误或故障时输出高电平。EN拉低时复位 |
13 | 1.8VOUT | 内部1.8V稳压器输出;为了达到最佳性能,用尽可能短的回路通过100nF电容连接到GND即可 |
14 | GND | |
15 | OB2 | 电机线圈B输出2 |
16 | BRB | 线圈B的感测电阻连接 |
17 | OB1 | 电机线圈B输出1 |
18 | VS | 电机供电电压 |
19 | OA1 | 电机线圈A输出1 |
20 | BRA | 线圈A的感测电阻连接 |
21 | Exposed die pad | 接GND |
独立步进模式
引脚配置
EN:高电平、STEPPER:高电平、MODE:高电平、DIR:配置普通IO、STEP:配置定时器PWM输出脉冲
电机左右(前后)动作代码示例
/***********************************************************
以STM32F103C8T6为例
PB13------EN
PB14------STEP
PB15------DIR
************************************************************/
#define DIR_Long GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define DIR_Short GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define Motor_EN GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define Motor_UNEN GPIO_ResetBits(GPIOB,GPIO_Pin_13)
//电机引脚初始化
void Motor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct1;
GPIO_InitTypeDef GPIO_InitStruct2;
GPIO_InitTypeDef GPIO_InitStruct3;
GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct1.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct1);
GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct2.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct2);
GPIO_InitStruct3.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct3.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOB,&GPIO_InitStruct3);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
}
//定时器初始化
void TIM1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=4320-1;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 10;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ (TIM1_UP_IRQn);
TIM_Cmd(TIM1, ENABLE);
}
//TIM1更新中断服务函数
void TIM1_UP_IRQHandler(void)
{
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
count++;
if(count >= 37790)
{
count = 0;
flag++;
}
if(flag%2)
{
DIR_Short;
}
else
{
DIR_Long;
}
}