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

1.需要实现的功能

  主要是控制滑块的运动,开始运动时需要加速,当稳定在最高速度时匀速运动,检测到下端限位信号时,开始减速直到停止,然后进行反向加速,匀速,检测到上端限位时停止运动。

  加速——匀速——减速——停止——反向——加速——匀速——停止

2.硬件部分

  本次电机为两相四线步进电机,两相:电机有两个线圈(绕组),四线:电机有四根线,一般是A+ A- B+ B-。有些电机不会标注出线的极性,其实可以用万用表测,短接的就是同一个绕组,或者短接之后电机转动很费力,也代表是同一个绕组。

  • 驱动

  电机的运动需要较大的电流,这取决于电机本身和负载,所以通常需要驱动芯片。而且驱动芯片可以实现许多附加的功能,包括细分、休眠、保护等。本次采用的是DRV8825驱动芯片模块。模块的介绍图如图所示:

  引脚介绍:

  1.ENABLE/:使能引脚,高电平停止工作,低电平正常工作;

  2.M0-M2:代表细分,最大可以达到32细分,这部分可以参考datasheet;

  3.RESET/  、SLEEP/:低电平会休眠和复位,因此电机正常工作时,两个引脚接高电平;

  4.STEP:最重要的引脚,通过单片机给这个引脚PWM信号,控制电机运动;

  5.DIR:0和1控制电机方向;

  6.VMOT:供电引脚,一般用12-20V就可以了;

  7.B2-A1:接电机四根线;

  8.FAULT/:接高电平工作;

  • 光电限位

  光电限位采用的反射型,型号为sy1200,感应距离为1-4mm,当没有遮挡时,输出低电平;有遮挡时,代表有光反射回来,输出高电平;测试过程中,发现最好采用白色的平面反射,效果更好。

3.软件部分

  软件主要就是通过stm32输出PWM脉冲,脉冲的频率决定了电机的速度。

  PWM通过定时器产生,决定频率的主要是arr重装载值,以及psc预分频值。最终输出的PWM频率为72000k/(arr*psc)。

  • 加减速

  由于需要做到加减速,也就意味着PWM的频率是改变的,因此arr的值需要改变。参考网上对于加减速的一些方法:主要有T型加减速和S型加减速,实现方法有公式法或者查表法。由于公式法比较麻烦,就直接采用了查表法。所以根据需要的频率,计算出不同频率下的arr值,写到数组里,就可以实现频率的改变。不过这种方法下,频率的改变是根据时间做线性或者S型变化,这种方法对吗?还是根据步数来改变?    

  S型加减速:

  T型加速就是匀加速,固定加速度。S型加速需要根据公式计算,详细说明如下:

其中Fcurrent代表某个点的频率:Fmin代表最小频率;Fmax代表最大频率;Flexible为S曲线区间系数,越大代表压缩的最厉害,中间(x坐标0点周围)加速度越大;越小越接近匀加速。理想的S曲线的取值为4-6;num:频率点/2;

例如想要从1kHz加速到40kHz,中间经过40个点,Fmin=1kHz,Fmax=40kHz,num=40/2=20,最后通过excel计算出各个频率值,可以发现在末端的加速是非常缓慢的,中间加速比较大。问题就是,初始速度并不是1khz了,他取决于系数的取值,取6时,初始速度就越小。

软件中实现:

采用定时器3输出PWM脉冲,定时器2用于计数中断(更精确的控制可以通过定时器2来计算出给出多少个脉冲,也就是电机运动的步数,那样的话就可以精确控制电机运动,形成开环反馈)

// 加减速实现部分
void TIM2_IRQHandler(void) //
{ if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // time++;
if(time>=35)//
{ time=0; //每x个周期进入定时后,对time进行清零,然后重新进行累加 if(jiasu==1) //加速状态
{
n=n+1;
fre=freq[n]; } if(jiasu==0) //减速状态,检测到下端的限位后进行减速,此时的n应该等于加速之后的最大值,也就是频率最大的时候,接下来进行递减,速度降低
{
n=n-1;
fre=freq[n]; } if(n>=38)//
{
n=38; }
if(n<=0) //根据前面速度递减,当减到第一个数时,速度已经降到了1k,可以让电机开始停止然后转向
{ GPIO_SetBits(GPIOC,GPIO_Pin_6); // 拉高步进电机的enable,停止运动 DIR0=!DIR0; //转向
delay_ms(100);
n=0;
fre=freq[n];
jiasu=1;
GPIO_ResetBits(GPIOC,GPIO_Pin_6); // 转向之后拉低电机的enable,开始运动 }
TIM3_PWM_Init(fre,9);
TIM_SetCompare4(TIM3,fre/2);// 改变TIM3的输出频率,从而改变电机的速度
}
}
}

  

stm32控制步进电机加减速的更多相关文章

  1. STM32 控制步进电机 28BYJ-48

    STM32 控制步进电机 28BYJ-48  http://blog.chinaunix.net/uid-12664992-id-300272.html 步进电机驱动最简化的逻辑: //四相八拍:A- ...

  2. 步进电机加减速S曲线算法

    一.Sigmoid 函数 1.1 Sigmoid函数原型 1.2 sigmoid函数波形: 由图形可看出在-10时已经接近于0,一般取值区间在[-5,5]. 1.3 sigmoid函数的导数 转载CS ...

  3. STM32串口控制步进电机(原创)

    用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...

  4. 使用STM32控制TMC5160驱动步进电机

    首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...

  5. 用STM32定时器中断产生PWM控制步进电机

    控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...

  6. STM32控制永磁同步电机 | FOC电机控制算法概述

    1. FOC基本概念 参考:https://www.sohu.com/a/432103720_120929980 FOC(field-oriented control)为磁场导向控制,又称为矢量控制( ...

  7. Spring使用环境变量控制配置文件加载

    项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...

  8. Spring使用环境变量控制配置文件加载(转)

    项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...

  9. MPU6050工作原理及STM32控制MPU6050

    源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍

随机推荐

  1. XSS详解【1】---基本概念和攻击原理

    这节主要讲述XSS的基本概念和攻击原理. 一 XSS基本概念 人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style She ...

  2. java基础之 java注释

    JAVA里有2中注释风格. 一种以 "/*" 开始以 "*/" 结尾,另一种是以 "//" 起头的. 被注释的内容不会被java虚拟机编译, ...

  3. Manacher算法求最长回文串模板

    #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...

  4. 【网站】 简单通用微信QQ跳转浏览器打开代码

    使用方法: 将代码全部复制 粘贴到 网站根目录下index.php文件的顶端 注意:不要覆盖了 index.php里面的原代码,原代码保留 使用说明: 手机QQ内打开,会自动跳转浏览器: 微信内打开, ...

  5. html 动态生成

    function func_creatediv(item, index, input) { var ip = document.createElement("div"); ip.n ...

  6. socks5代理服务器搭建

    1.首先,编译安装SS5需要先安装一些依赖组件 yum -y install gcc gcc-c++ automake make pam-devel openldap-devel cyrus-sasl ...

  7. 后台执行linux命令

    /** * * 方法说明:移植执行linux命令 * * @param cmdStr 需要执行的linux命令 * @return 执行命令后的输出(如果是启动一个进程,则可能一直无法返回) * @t ...

  8. java-日期取特定值

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author G ...

  9. Django 基本使用及目录结构

    1.安装 pip3 install django 默认为最新版 2.创建Django项目 在即将创建的Django项目,目录下运行命令 1.django-admin startproject my_p ...

  10. linux安装Zookeeper及redis集群

    亲测有效: 1.linux下安装zookeeper:https://www.cnblogs.com/zuolun2017/p/8186254.html 2.linux下安装redis集群:https: ...