stm32控制步进电机加减速

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

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的输出频率,从而改变电机的速度
            }
      }
    }

复制代码

  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是c51单片机控制步进电机正反转实验报告: 实验目的: 1. 理解步进电机的原理和控制方法; 2. 掌握c51单片机控制步进电机正反转的原理和方法; 3. 实现步进电机的正反转控制。 实验器材: 1. c51单片机开发板; 2. 步进电机; 3. 电源; 4. 电路连接线。 实验原理: 步进电机是一种将电信号转化为角位移的电机。步进电机主要由步进角、步数、步距角、相数和驱动方式等五个方面来描述。 c51单片机控制步进电机正反转的原理是:根据步进电机的特性,通过改变电机两相之间的相序,就可以实现电机的正反转。c51单片机可以通过输出脚控制电机两相之间的相序,从而实现电机的正反转。 实验步骤: 1. 按照电路图连接电路,将步进电机的四个线连接到开发板的P1口; 2. 在Keil C51中编写程序代码,实现电机的正反转控制; 3. 将程序代码下载到c51单片机开发板中; 4. 打开电源,观察步进电机的运动情况。 实验代码: ```C #include <reg52.h> sbit A1 = P1^0; sbit A2 = P1^1; sbit B1 = P1^2; sbit B2 = P1^3; void main() { int i; while(1) { for(i=0; i<100; i++) { A1 = 0; A2 = 0; B1 = 1; B2 = 0; delay(2); A1 = 0; A2 = 1; B1 = 0; B2 = 0; delay(2); A1 = 1; A2 = 0; B1 = 0; B2 = 0; delay(2); A1 = 0; A2 = 0; B1 = 0; B2 = 1; delay(2); } for(i=0; i<100; i++) { A1 = 0; A2 = 1; B1 = 0; B2 = 0; delay(2); A1 = 1; A2 = 0; B1 = 0; B2 = 0; delay(2); A1 = 0; A2 = 0; B1 = 0; B2 = 1; delay(2); A1 = 0; A2 = 0; B1 = 1; B2 = 0; delay(2); } } } void delay(int n) { int i, j; for(i=0; i<n; i++) { for(j=0; j<200; j++); } } ``` 实验结果: 通过编写程序代码,c51单片机可以控制步进电机在正反转之间切换,并且步进电机可以按照预期的方式运动。 实验结论: 通过本实验,我们掌握了c51单片机控制步进电机正反转的原理和方法,实现了步进电机的正反转控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_20312079

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值