因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验

利用stm32控制步进电机

尝试用42系步进电机做倒立摆,总结步进电机控制

  • stm32f407控制
  • Microstep Driver驱动器

一、Miocrostep Driver驱动

高精度系列二相混合式步进电机多细分驱动器

1、使用说明:

1、VCC&GND:20~40V DC;
2、A+A- B+B-:接二相混合式步进电机的2相;
3、工作额定电流:3A;
4、拨码开关SW1~SW8:下拨代表ON(驱动器上有文字指示),上拨代表OFF;
5、拨码开关SW4~SW6:选择下拨(ON)或(OFF)时,M403列对应电流值;
6、拨码开关SW1~SW3:ON和OFF选择对应细分数;
7、Ena- Ena+:使能信号输入;(拉低使能
8、Pul- Pul+:脉冲信号输入;
9、Dir- Dir+:方向信号输入; (从正面看,拉高逆时针,拉低正时针

2、特性:

1、外壳上标注参数直观清晰;
2、单/双脉冲输入兼容;
3、双极恒流斩波方式驱动、微步控制、电源损耗低效率高;;
4、直流宽电压范围供电,DC20~40V;
5、最大驱动电流3A/相;
6、高细分:最高可定制为256细分;
7、所有控制信号光电隔离;
8、输入脉冲频率最大400KHz;
9、驱动器外壳与地电绝缘。
10、静止时锁定电流可在0~100%范围内选择。
11、可通过调节改善电机振动。
12、输入信号TTL兼容,同时可接受差分信号输入;
13、20KHz斩波频率;
14、高可靠性:采用多层板和表面贴封,功率器件留有足够裕量;

二、控制

步进电机通过发送脉冲信号控制,每收到一个脉冲就转一个步进角,因此,在细分数数一定的情况下

  • 加大(减小)脉冲频率,可以加(减)转速
  • 加大(减小)改变脉冲频率的速率,可以加(减)加速度

1、初始化设置

脉冲生成有3种方法:延时PWM中断,后两种可靠性较高,这里采用定时器中断生成脉冲

1、使能i/o

void DJ_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //DRIVER_DIR/DRIVER_OEGPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOE, &GPIO_InitStructure);//--------------------------------------------------------------   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //STEP_PULSEGPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;GPIO_Init(GPIOB, &GPIO_InitStructure);//---------------------------------------------------------------GPIO_SetBits(GPIOE,GPIO_Pin_5);//拉高,正转GPIO_ResetBits(GPIOE,GPIO_Pin_6);//拉低,使能
}

2、定时器配置

void TIM4_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); TIM_TimeBaseInitStructure.TIM_Period = arr; TIM_TimeBaseInitStructure.TIM_Prescaler=psc; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM4,ENABLE);
}

配置中断周期为10us

TIM4_Int_Init(10-1,84-1);    //84M/84=1Mhz(10^6)计数频率,计数10次为10us  (生成脉冲)

2、控制转速

我们利用中断生成脉冲,思想如下:从第一次进中断开始计数,进指定次数为一个周期,前若干次输出高电平,其余输出低电平。控制中断次数判断即可控制周期(转速)和高电平持续时间。

程序截选如下

//全局变量-------------------------------------------------------------------
u8 Start_Flag=0; //电机启动/锁定标志
u16 Pluse_High=10; //脉冲高电平中断次数      1->10us
u16 Pluse_Period=100;//脉冲周期中断次数 (转速)//脉冲中断服务函数------------------------------------------------------------
u32 TimeCount=0;//进中断计数
void TIM4_IRQHandler(void)//10us
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)//溢出中断{      if(Start_Flag==0)GPIO_SetBits(GPIOE,GPIO_Pin_6);//motor_disable;else if(Start_Flag==1){GPIO_ResetBits(GPIOE,GPIO_Pin_6);//motor_enable;TimeCount++;if(TimeCount<Pluse_High)//脉冲高电平GPIO_SetBits(GPIOB,GPIO_Pin_8);else if(TimeCount>Pluse_High)GPIO_ResetBits(GPIOB,GPIO_Pin_8);if(TimeCount>Pluse_Period)//周期控制(转速控制)TimeCount=0}}TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //Çå³ýÖжϱê־λ
}

注意到中断周期为:T=Pluse_Period * t
则脉冲频率为:f=1/T=1/(Pluse_Period * t), 注意此值与速度成正比
因此,虽然可以简单地通过控制全局变量Pluse_Period控制转速,但是此值与转速成反比例关系,不适合控制;

较好的方法是,设全局变量temp_x ,使Pluse_Period=1000/temp_x (1000可以为任意常数)
则脉冲频率为:f=1/T=1/(Pluse_Period * t)=temp_x/(1000*t)
此时全局变量temp_x 与转速成正比,适于控制

3、加速度控制

使用temp_x修改速度控制后,可以方便地进行加速度控制,按一定中断次数均匀地使temp_x递增(减)即可
程序修改如下:

#define MaxSpeed 20
//全局变量-------------------------------------------------------------------
float temp_x=1;
float Acc=1.5;//加速度
u32 TimeCount=0;
u32 AccCount=0;
//加速度控制函数--------------------------------------------------------------
void acc(float a)
{temp_x+=a;if(temp_x>0)//temp_x==0时发生换向{GPIO_ResetBits(GPIOE,GPIO_Pin_5);Pluse_Period=1000/temp_x;}else{GPIO_SetBits(GPIOE,GPIO_Pin_5);Pluse_Period=-1000/temp_x;}if(Pluse_Period<MaxSpeed )//控制速度上限,防止电机抱死Pluse_Period=MaxSpeed ;
}//修改后的脉冲中断服务函数------------------------------------------------------------
u32 TimeCount=0;//进中断计数
void TIM4_IRQHandler(void)//10us
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)//溢出中断{      if(Start_Flag==0)GPIO_SetBits(GPIOE,GPIO_Pin_6);//motor_disable;else if(Start_Flag==1){GPIO_ResetBits(GPIOE,GPIO_Pin_6);//motor_enable;TimeCount++;AccCount++;if(TimeCount<Pluse_High)//脉冲高电平GPIO_SetBits(GPIOB,GPIO_Pin_8);else if(TimeCount>Pluse_High)GPIO_ResetBits(GPIOB,GPIO_Pin_8);if(TimeCount>Pluse_Period)//周期控制(转速控制)TimeCount=0}if(AccCount>1000)AccCount=0,acc(ACC);}TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //Çå³ýÖжϱê־λ
}

经测试,上述代码可以很好地执行步进电机的 速度&加速度 控制任务

三、完整代码下载

就像文章开头说的,这个代码是我那天下午研究完步进电机用法后快速写的测试程序,写的很快,所以程序结构比较混乱,仅供参考

  • github下载地址:https://github.com/wxc971231/stm32F4-Stepper_Motor_Test
  • 百度云:https://pan.baidu.com/s/1ciTir1q-HgDOw-9PcTfPPg 密码ubn3

利用stm32控制步进电机 速度加速度控制相关推荐

  1. 如何控制步进电机速度(即,如何计算脉冲频率):

    两相步进电机介绍: 实际步进电机控制很简单,应用都是傻瓜了,厂家做好步进电机的驱动器,步进电机如何工作由驱动器来控制,我们不需要对步进电机做深入的了解,只要知道步进电机驱动器的应用方法即可.当然简单的 ...

  2. PCM开发板模块实验指导--触摸屏控制步进电机速度实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         64---触摸屏控制步进电机速度实验:           ...

  3. 【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

    本篇文章包含的内容 一.步进电机的结构和工作原理 1.1 步进控制系统的组成 1.2 步进电机简介 1.3 步进电机的分类 1.4 步进电机的工作原理 1.4.1 单极性步进电机(5线4相) 1.4. ...

  4. 使用普中科技ESV2.0开发板控制步进电机

    使用普中科技ESV2.0开发板驱动步进电机 文章目录 使用普中科技ESV2.0开发板驱动步进电机 前言 一.步进电机的驱动原理 工作原理 二.如何让步进电机转起来 相数 驱动方法 注意图中接线顺序,不 ...

  5. PCM开发板模块实验指导--触摸屏控制步进电机位置实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         65---触摸屏控制步进电机位置实验:           ...

  6. 【C语言】STM32控制步进电机——一种S形加减速曲线的推导与实现

    目录 1 前言 2 理论分析 2.1 选择曲线 2.2 计算函数方程 2.3 单位分析 2.4 模拟验证 3 两种代码实现 3.1 速度与时间关系 3.1.1 原理 3.1.2 优点 3.1.3 缺点 ...

  7. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  8. stm32控制步进电机加减速

    实习公司项目需要控制步进电机,电机方面主要包括控制运动.加减速.限位. 下面介绍一下在电机控制方面的心得,由于对于电机的控制不需要很精确,并且自身能力有限,相比于大牛有很大的差距. 1.需要实现的功能 ...

  9. STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序

    STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...

最新文章

  1. python中的正则表达式语法_Python基础教程之正则表达式基本语法以及re模块
  2. delphi android动态权限,DELPHI安卓动态权限申请
  3. 工业互联网智能智造-工业企业大数据汇聚通道-产品设计
  4. 查询公司资产数据库中的主机是否在zabbix的监控中
  5. 微星P55-主板是怎样造出来的
  6. 解决2345劫持主页的办法--火绒2345专杀
  7. ds18b20工作原理和测温原理介绍
  8. android6.0重力工具箱,真正免root的重力工具箱详细使用教程
  9. 16个最佳WordPress登录页面插件
  10. 物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)
  11. 39、Docker(镜像命令)
  12. String 去掉空格回车等符号
  13. Android获取通讯录联系人,右侧字母滑动索引
  14. 彻底解决EMI问题,只需8秒
  15. Java连接MySQL数据库并进行简单查询
  16. 从宜人贷系统架构看互联网高并发对金融系统架构的挑战
  17. Android 控件view的可见,不可见,隐藏的设置和区别
  18. 已知命题公式(¬p→q)→(¬q∨p)
  19. 大龄程序媛的一路风景
  20. 代码示例:使用Java以编程方式拆分PDF文件

热门文章

  1. 《大话设计模式》读书总结
  2. 计算机硬件经常使用十六,[单选,A型题] 桂枝在桂枝加桂汤、桂苓五味甘草汤中的主要作用是()...
  3. 微盟“删库”144小时:痛的不是股价,是信任
  4. 2021-12-3 温故而知新-JavaScript隐式转换
  5. 光猫显示isp服务器断开,光猫连接isp服务器超时
  6. Witt向量简介 §2.2:Witt向量的代数背景
  7. 计算软件测试数据流图独立路径,软件测试技术(2)
  8. C#BS通过ActiveX控件及制作CAB包来调CS
  9. 甘特图控件VARCHART XGantt的功能亮点
  10. 在线报表设计器如何制作多表单填报(报表工具efreport.com)