当前位置: 首页 > news >正文

STM32精确控制步进电机

目的:学习使用STM32+电机驱动器+步进电机,进行电机运动精确控制。

测试环境

  1. MCU主控芯片STM32F103RCT6 ;
  2. A4988步进电机驱动器模块;                                                                    
  3. 微型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) //电机DIRMOTOR1_POS+=1;//电机CCW旋转else MOTOR1_POS-=1;//电机CW旋转gMotor1stPwmCnt+=1;if(gMotor1stPwmCnt>gMotor1stPluseMax){HAL_TIMEx_PWMN_Stop_IT(&htim1, TIM_CHANNEL_2);//Motor1st 停止PWMgMotor1stPwmCnt=0;gMotor1stPluseMax=0;gMotor1stPluseCnt=0;}}if(htim->Instance == TIM3)//MOTOR2//电机DIR{if((HVAPI_OUTPUT_REG & 0x0200)==0)MOTOR2_POS+=1;//电机CCW旋转elseMOTOR2_POS-=1;//电机CW旋转gMotor2ndPwmCnt+=1;if(gMotor2ndPwmCnt>gMotor2ndPluseMax){											                                            HAL_TIM_PWM_Stop_IT(&htim3, TIM_CHANNEL_2);//Motor2nd 停止PWMgMotor2ndPluseMax=0;gMotor2ndPwmCnt=0;gMotor2ndPluseCnt=0;}}
}

测试结果

        在步进电机不堵转的情况下,可以实现移动距离的精确控制。

TIPs

        1. 主程序设置电机的启动、停机、运动方向、运动的步数。

        2. 在回调函数中计算步数,当步数达到的时候,停止脉冲输出。

        3. 安全考虑:控制脉冲的最大输出数量,持续脉冲输出的时间。这样可以保护电机和滑台。


http://www.mrgr.cn/news/38730.html

相关文章:

  • 广州C++信奥老师解 1915:【01NOIP普及组】最大公约数与最小公倍数
  • 【深度学习基础模型】稀疏自编码器 (Sparse Autoencoders, SAE)详细理解并附实现代码。
  • LINUX--调度未来任务
  • 面试中顺序表常考的十大题目解析
  • Oracle Data Guard备库清理归档脚本
  • WIN10升级WIN11可能遇到的问题及解决方案
  • STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器
  • SVG 滤镜:探索图形设计的无限可能
  • shp-write.js 导出shp数据:原理介绍及示例代码
  • FTP访问方式详解
  • C++ | Leetcode C++题解之第445题两数相加II
  • Java | Leetcode Java题解之第443题压缩字符串
  • 基于PI控制器的车辆行驶控制系统simulink建模与仿真
  • C++入门基础知识88(实例)——实例13【求一个数的阶乘】
  • 一天认识一个硬件之音响与音箱
  • Golang | Leetcode Golang题解之第445题两数相加II
  • tar命令:压缩、解压的好工具
  • undeclared identifier ‘UNITY_PREV_MATRIX_M‘ - Unity Shader自己写URP,引用内部 hlsl
  • linux环境下使用sqlplus访问远程oracle数据库
  • DAY17||654.最大二叉树 |617.合并二叉树 |700.二叉搜索树中的搜索 |