A4988步进电机驱动模块测试:多模式控制逻辑全解析

  • 时间:
  • 浏览:141
  • 来源:中国微特电机网

这A4988控制逻辑简单,可背后原理和使用中的门道那可多,且听我慢慢道来!

睡眠与模式控制

话说这A4988驱动芯片,它主要几种模式控制可真是挺重要!像睡眠模式,它就安安静静的。特别是那正反转、复位、使能还有细分等模式,得好好了解才成。2024年,在一些实验电路里,工程师用到它的时候,对于这几种模式都是格外关注。一旦芯片复位,嘿,系统立马回到原始I/O端口控制状态,就跟重置起点似的!

步进电机电阻与连接

拿到步进电机了,该咋处理?2024上半年,实验室那位王师傅说要先检测电阻,就是电机两条线之间电阻。就好比在蠕动泵上测试到的,大概33Ω左右小电机驱动芯片,低电阻的这两条线就接4988的1A、1B端或者2A、2B端,而且把这两端顺序一换小电机驱动芯片,电机旋转方向就改变如此操作,在不少小型机械装置组装中都有用。

电流设置与配置

4988驱动电机跟尺寸关系不太有大影响,主要看工作电流。理论上,电流小于2A的步进电机都能驱动,不管是42还是57电机。只是4988芯片没加散热片的话,电流最好控制在1.2A以下。驱动板是用一个小电位器来配置输出电流,电位和电流是满足这个关系的——Vref = A*0.8 。就打个比方你想电机电流弄到1A ,那电位就得配到0.8V 。

细分模式奥秘

细分模式很讲究!就通过MS1、MS2、MS3来控制细分系数,A4988最小能分到1/16 。咱算一算,通过角度值能知道这最小细分角度是全步进角度的1/16。要是那步距角为1.8度的步进电机,16细分开来,能小到走0.1125度。在一些精密设备定位里可是能精确不少

电流调整手段

默认元件只能把电流调到1.5A,你想大一点就得改改R1。2024年夏天的改造中,工作人员把30K阻值改成20K(左右),就把电流调到2A附近了。Ramps上每个4988驱动还有ms1、ms2、ms3短路块来调细分。而且调节输出电流这活可离不开通过电位器慢慢摸索着设置。

步进电机抖动问题

步进电机抖动是咋回事?要么是接线一相没接好,比如在一台新组装加工仪器上遇到过。要么就是两相接错,电机没按正确顺序连。所以得重新按步骤连接。还有这电机,最小能走走步距角除以细分数的角度,并且停的时候还得通电,不然没准跳到物理步距角上。大家觉得在实际操作中还有啥A4988没提到的注意点没?顺手帮我点个赞分享下!

#include "a4988.h"
#include "delay.h"
/*
STEP1 PDout(15)
SDIR1 PGout(2)  
STEP2 PDout(14)
SDIR2 PGout(3)  
STEP3 PDout(13)
SDIR3 PGout(4)  
STEP4 PDout(12)
SDIR4 PGout(5)  
MSTEP PDout(15) //固定芯片步进STEP
MDIR  PGout(2)  //固定芯片步进DIR
CSTEP PDout(14) //磁铁步进STEP
CDIR  PGout(3)  //磁铁步进DIR
RSTEP PDout(13) //蠕动泵STEP
RDIR  PGout(4)  //蠕动泵DIR
USTEP PDout(12) //超声步进电机STEP
UDIR  PGout(5)  //超声步进电机DIR
*/
//方向脚初始化
void Step_DIR_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);   //使能PG端口时钟
    
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;  //端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //IO口速度为50MHz
 GPIO_Init(GPIOG, &GPIO_InitStructure);                  //根据设定参数初始化
 GPIO_SetBits(GPIOG,GPIO_Pin_2);                         
 GPIO_SetBits(GPIOG,GPIO_Pin_3);    
 GPIO_SetBits(GPIOG,GPIO_Pin_4);        
 GPIO_SetBits(GPIOG,GPIO_Pin_5);    
}
//脉冲初始化,公用定时器4,重映射,4路频率会被一起改变
void Step_Pulse_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //使能定时器4时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    
    GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射   
    
   //设置该引脚为复用输出功能,输出TIM4的PWM脉冲波形
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH4
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO
    
    //!!!!!配置完复用功能后,此时输出为低电平,似乎难以修改
    
   //初始化TIM4
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    //初始化TIM4 Channel_1234 PWM模式     
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //关闭比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
    //TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器
    
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
    //TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
    
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC3
    //TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR3上的预装载寄存器
    
    TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4
    //TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR4上的预装载寄存器
 
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    
    TIM_Cmd(TIM4, DISABLE);  //先不使能TIM4 
}
//芯片电机运动
void Mstep_move(u8 dir,u16 frequency)
{
    MDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare4(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);//开启TIM4通道4
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能
}
//芯片电机停止
void Mstep_stop(void)
{   
    TIM_SetCompare4(TIM4,0);    
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);
}
//磁铁电机运动
void Cstep_move(u8 dir,u16 frequency)
{
    CDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare3(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);//开启TIM4通道3
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能
}
//磁铁电机停止
void Cstep_stop(void)
{   
    TIM_SetCompare3(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);
}
//超声电机运动
void Ustep_move(u8 dir,u16 frequency)
{
    UDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare1(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);//开启TIM4通道1
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能
}
//超声电机停止
void Ustep_stop(void)
{   
    TIM_SetCompare1(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);//USTEP会随波形停在高或低
}
//蠕动泵抽取
void Rstep_move(u8 dir,u16 frequency)
{
    RDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare2(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Enable);//开启TIM4通道2
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能
}
//蠕动泵停止
void Rstep_stop(void)
{   
    TIM_SetCompare2(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);//RSTEP会随波形停在高或低
}

猜你喜欢

电气基础知识概述:常用低压电器及控制保护环节介绍

转换开关一般用于交流380V、直流220V,电流100A以下的电路中做电源开关。所以,继电器一般用于控制电路中。

2025-06-17

2024年上海电机学院研究生复试分数线及退役大学生士兵计划分数线公布

一、2024年上海电机学院研究生复试分数线二、2024年退役大学生士兵计划复试分数线三、2023年上海电机学院研究生复试分数线考生在备考上海电机学院研究生时,应重点关注复试分数线的变化趋势。

2025-06-17

没有三相电的地方如何用单相电机?其原理及常见类型介绍

没有三相电的地方,我们一般用单相电机,220V供电;定子上有两相绕组,起动绕组(也称为辅助绕组)和主绕组。1.小功率单相电机,如电风扇、洗衣机等,有如下原理图。3.如何用二值电容控制单相电机的正反转?双值电容器单相电气开关主绕组端子反转双值电容器单相电气开关对绕组端子反接

2025-06-17

2003 年办学的上海中华职业技术学院,2025 年将迎新校区

2003年,上海中华职业技术学院开启办学;2025年,学院迁入崇明现代化新校区,承载新的世纪使命,立足全球产业升级新需求,为本土及世界培养人工智能和现代服务领域高素质人才。

2025-06-17

第yi代 LS 变频器采用压频比标量控制,第二代有何不同?

首先是要控制励磁,所以又把矢量控制称为磁场定向控制。然而,由于无需安装速度编码器使用方便,无速度传感器矢量控制LS变频器仍受到用户的欢迎。强调转矩的直接控制效果,并不刻意追求输出的电流为正弦波形。从转矩调控要求看,磁链有点误差,并不会对转矩控制性能产生重大影响。

2025-06-17