目的:学习使用STM32+电机驱动器+步进电机,进行电机运动精确控制。
测试环境:
- MCU主控芯片STM32F103RCT6 ;
- A4988步进电机驱动器模块;
- 微型2相4线步进电机10mm丝杆滑台,金属丝杆安装有滑块。
10mm二相四线微型步进电机电机的输入接线是4个引脚,需要自己焊线,相电阻53欧,步进角度估计18度,丝杆滑块行程32mm,丝杆转一圈铜滑块大约移动行程0.4mm。步进电机重约7.3g。
主要模块之间的连接如下:
一. 电机和A4988之间的连接
导线 | 电机 | 驱动模块 | |
黄 | A+ | 1A | |
黑 | B+ | 2A | |
绿 | A- | 1B | |
红 | B- | 2B |
二 . MCU和A4988之间的连接:
PD2 MCU --> MOTOR1_EN
PB3 MCU --> MOTOR1_MS1
PB4 MCU --> MOTOR1_MS2
PB5 MCU --> MOTOR1_MS3
PB0 MCU --> MOTOR1_STEP
PB6 MCU --> MOTOR1_DIR
软件设计的关键设置: 使用TIM1作为脉冲步进输出:
关键代码: 在脉冲计数的回调函数对数据脉冲数量进行控制。
uint32_t gMotor1stPluseMax=0;
uint32_t gMotor2ndPluseMax=0;
uint32_t gMotor1stPwmCnt=0;
uint32_t gMotor2ndPwmCnt=0;
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)//MOTOR1
{
if((HVAPI_OUTPUT_REG & 0x0002)==0) //电机DIR
MOTOR1_POS+=1;//电机CCW旋转
else
MOTOR1_POS-=1;//电机CW旋转
gMotor1stPwmCnt+=1;
if(gMotor1stPwmCnt>gMotor1stPluseMax){
HAL_TIMEx_PWMN_Stop_IT(&htim1, TIM_CHANNEL_2);//Motor1st 停止PWM
gMotor1stPwmCnt=0;
gMotor1stPluseMax=0;
gMotor1stPluseCnt=0;
}
}
if(htim->Instance == TIM3)//MOTOR2//电机DIR
{
if((HVAPI_OUTPUT_REG & 0x0200)==0)
MOTOR2_POS+=1;//电机CCW旋转
else
MOTOR2_POS-=1;//电机CW旋转
gMotor2ndPwmCnt+=1;
if(gMotor2ndPwmCnt>gMotor2ndPluseMax){
HAL_TIM_PWM_Stop_IT(&htim3, TIM_CHANNEL_2);//Motor2nd 停止PWM
gMotor2ndPluseMax=0;
gMotor2ndPwmCnt=0;
gMotor2ndPluseCnt=0;
}
}
}
测试结果:
在步进电机不堵转的情况下,可以实现移动距离的精确控制。
TIPs:
1. 主程序设置电机的启动、停机、运动方向、运动的步数。
2. 在回调函数中计算步数,当步数达到的时候,停止脉冲输出。
3. 安全考虑:控制脉冲的最大输出数量,持续脉冲输出的时间。这样可以保护电机和滑台。