标题: 分享个简易的步进电机S加减速 [打印本页]

作者: lx911gt    时间: 2016-11-4 09:28
标题: 分享个简易的步进电机S加减速
以前自己有研究过S曲线加减速,步进电机尽量都跑这种曲线,原因就是当电机驱动器给电机一个较高的频率的时候,步进电机很可能反应不过来,造成堵转,或者这个频率变化的斜率太大刚由低频起转突然就变到高频了一样会造成堵转、失步等等。

S曲线就是为了让电机由低速到高速有个比较平滑的过度,能顺利让步进电机运行到要求的状态,其实就是我们常说的缓起缓停,直流电机也一样,突然启停电机都有非常大的冲动,如果不消除这种冲动是无法玩位置定位的

那么我就传一份比较简单的查表式的S曲线启停咯,具体S曲线讲究非常多,百度也有很多文章,大家可自行去了解,高难的我也不会,因为确实用不到,但是有机会一样要学,大家一起学,我先抛个砖,站在前排的都小心点哈,砸死你哦!!

查表我是直接扒别人的,自己算和实验目前还没有时间,大家先自己下来玩耍一番,有好的东西一起分享下
简易步进电机S加减速.rar (306.43 KB, 下载次数: 417)


作者: qinhfm    时间: 2016-11-8 09:48
/*

    * 步进电机S曲线加减速
   
    * 若发现启动后电机有堵转的情况请增大数组中的数值,简单的方法是在调用的时候直接乘个倍数
   
*/

下面是楼主的PWM.c文件:
  1. #include "PWM.h"

  2. static void TIM_GPIO_Config(void)
  3. {
  4.   GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

  6.         /* PA0(TIM2_CH1) PA1(TIM5_CH2) PA6(TIM3_CH1) */
  7.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6;
  8.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  9.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  10.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  11.        
  12.         /* PB6(TIM4_CH1) */
  13.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  14.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  16.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  17. }

  18. static void TIM2_Mode_Config(void)
  19. {
  20.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  21.         TIM_OCInitTypeDef  TIM_OCInitStructure;        
  22.        
  23.         /* TIM2 开启时钟 */
  24.         //PCLK1经过2倍频后作为TIM2的时钟源等于72MHz
  25.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  26.   /* TIM2基本配置 */                 
  27.   TIM_TimeBaseStructure.TIM_Period = 1000;
  28.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //设置预分频:不预分频,即为72MHz
  29.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //设置时钟分频系数:不分频
  30.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上计数模式

  31.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  32.        
  33.   /* PWM2模式通道1 */
  34.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                                    //配置为PWM模式2
  35.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //使能比较输出
  36.   TIM_OCInitStructure.TIM_Pulse = 200;                                                                                                           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  37.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //当定时器计数值小于CCR1_Val时为高电平

  38.   TIM_OC1Init(TIM2, &TIM_OCInitStructure);                                                                                                 //使能通道1

  39.   TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

  40.   TIM_ARRPreloadConfig(TIM2, ENABLE);                                                                                                                         // 使能TIM3重载寄存器ARR
  41.        
  42.   TIM_Cmd(TIM2, DISABLE);                                                                                                                                                                        //使能TIM3
  43. }

  44. static void TIM3_Mode_Config(void)
  45. {
  46.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  47.         TIM_OCInitTypeDef  TIM_OCInitStructure;        
  48.        
  49.         /* TIM3 开启时钟 */
  50.         //PCLK1经过2倍频后作为TIM3的时钟源等于72MHz
  51.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  52.   /* TIM3基本配置 */                 
  53.   TIM_TimeBaseStructure.TIM_Period = 1000;
  54.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //设置预分频:不预分频,即为72MHz
  55.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //设置时钟分频系数:不分频
  56.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上计数模式

  57.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  58.        
  59.   /* PWM2模式通道1 */
  60.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                                    //配置为PWM模式2
  61.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //使能比较输出
  62.   TIM_OCInitStructure.TIM_Pulse = 200;                                                                                                           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  63.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //当定时器计数值小于CCR1_Val时为高电平

  64.   TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                                                                                 //使能通道1

  65.   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  66.   TIM_ARRPreloadConfig(TIM3, ENABLE);                                                                                                                         // 使能TIM3重载寄存器ARR
  67.        
  68.   TIM_Cmd(TIM3, DISABLE);                                                                                                                                                                        //使能TIM3
  69. }

  70. static void TIM4_Mode_Config(void)
  71. {
  72.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  73.         TIM_OCInitTypeDef  TIM_OCInitStructure;        
  74.        
  75.         /* TIM4 开启时钟 */
  76.         //PCLK1经过2倍频后作为TIM3的时钟源等于72MHz
  77.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  78.   /* TIM4基本配置 */                 
  79.   TIM_TimeBaseStructure.TIM_Period = 1000;
  80.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //设置预分频:不预分频,即为72MHz
  81.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //设置时钟分频系数:不分频
  82.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上计数模式

  83.   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  84.        
  85.   /* PWM2模式通道1 */
  86.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                                    //配置为PWM模式2
  87.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //使能比较输出
  88.   TIM_OCInitStructure.TIM_Pulse = 200;                                                                                                           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  89.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //当定时器计数值小于CCR1_Val时为高电平

  90.   TIM_OC1Init(TIM4, &TIM_OCInitStructure);                                                                                                 //使能通道1

  91.   TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

  92.   TIM_ARRPreloadConfig(TIM4, ENABLE);                                                                                                                         // 使能TIM4重载寄存器ARR
  93.        
  94.   TIM_Cmd(TIM4, DISABLE);                                                                                                                                                                        //使能TIM4
  95. }

  96. static void TIM5_Mode_Config(void)
  97. {
  98.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  99.         TIM_OCInitTypeDef  TIM_OCInitStructure;        
  100.        
  101.         /* TIM5 开启时钟 */
  102.         //PCLK1经过2倍频后作为TIM3的时钟源等于72MHz
  103.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

  104.   /* TIM5基本配置 */                 
  105.   TIM_TimeBaseStructure.TIM_Period = 1000;
  106.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //设置预分频:不预分频,即为72MHz
  107.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //设置时钟分频系数:不分频
  108.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上计数模式

  109.   TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
  110.        
  111.   /* PWM2模式通道1 */
  112.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                                    //配置为PWM模式2
  113.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //使能比较输出
  114.   TIM_OCInitStructure.TIM_Pulse = 200;                                                                                                           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  115.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //当定时器计数值小于CCR1_Val时为高电平

  116.   TIM_OC2Init(TIM5, &TIM_OCInitStructure);                                                                                                 //使能通道1

  117.   TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);

  118.   TIM_ARRPreloadConfig(TIM5, ENABLE);                                                                                                                         //使能TIM5重载寄存器ARR

  119.   TIM_Cmd(TIM5, DISABLE);                                                                                                                                                                        //使能TIM5
  120. }

  121. void TIM_Config(void)
  122. {
  123.         TIM_GPIO_Config();
  124.         TIM2_Mode_Config();
  125.         TIM3_Mode_Config();
  126.         TIM4_Mode_Config();
  127.         TIM5_Mode_Config();
  128. }

复制代码




作者: dmgy343    时间: 2016-11-14 15:06
好东西 谢谢分享
作者: ml5780    时间: 2017-1-20 17:29
非常感谢分享
作者: xcvzbff    时间: 2017-2-8 10:08
非常感谢分享
作者: dop101    时间: 2017-3-3 17:13
没金币
作者: dop101    时间: 2017-3-3 17:14
再来个
作者: anqir621    时间: 2017-3-17 08:22
我想下载,没金币
作者: anqir621    时间: 2017-3-17 08:24
查表呀, 有没有直接计算的
作者: xin4633    时间: 2017-4-4 22:24
谢谢分享
作者: minlee    时间: 2017-4-5 14:24
非常感谢分享
作者: ximenzi1314    时间: 2017-6-28 09:24
特别想看,我也没金币了

作者: phil8199    时间: 2017-7-3 15:25
谢谢分享~
作者: syh960805    时间: 2017-8-4 16:36
多谢楼主分享
作者: apay2004    时间: 2017-10-16 11:24
没有积分,没办法下载啊

作者: yinhong    时间: 2017-12-23 17:13

多谢楼主分享
作者: carlyvin    时间: 2017-12-25 11:41
可以参考一下
作者: bsksk    时间: 2018-1-3 09:21
感谢分享
作者: ty_gdl    时间: 2018-1-15 22:31

非常感谢分享
作者: ycgxy1650601    时间: 2018-2-6 10:53
感谢分享,
作者: geekerjune    时间: 2018-3-1 15:51
好东西 谢谢分享
作者: tiansa521    时间: 2018-4-26 14:41
谢谢分享
作者: wwchang    时间: 2018-4-26 19:38
借鉴一下楼主的简易算法
作者: 1056247163    时间: 2018-5-4 12:42
好东西 谢谢分享
作者: cjyueyue    时间: 2018-6-6 22:33
最近在学习电机相关知识,希望能得到帮助
作者: 雀巢咖啡    时间: 2018-10-17 17:01
有没有人知道这个程序怎么接线,对方向和脉冲控制的接口没看太明白
作者: lcsled    时间: 2019-8-12 21:07
收下了,慢慢研究一下
作者: y1z2f4    时间: 2020-11-11 09:38
谢谢分享,下载研究一下。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1