找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16605|回复: 27
打印 上一主题 下一主题
收起左侧

分享个简易的步进电机S加减速

  [复制链接]
跳转到指定楼层
楼主
ID:93106 发表于 2016-11-4 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前自己有研究过S曲线加减速,步进电机尽量都跑这种曲线,原因就是当电机驱动器给电机一个较高的频率的时候,步进电机很可能反应不过来,造成堵转,或者这个频率变化的斜率太大刚由低频起转突然就变到高频了一样会造成堵转、失步等等。

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

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

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

评分

参与人数 2黑币 +90 收起 理由
wfliu + 10 赞一个!
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:146204 发表于 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. }

复制代码



回复

使用道具 举报

板凳
ID:147443 发表于 2016-11-14 15:06 | 只看该作者
好东西 谢谢分享
回复

使用道具 举报

地板
ID:138686 发表于 2017-1-20 17:29 | 只看该作者
非常感谢分享
回复

使用道具 举报

5#
ID:163545 发表于 2017-2-8 10:08 | 只看该作者
非常感谢分享
回复

使用道具 举报

6#
ID:167942 发表于 2017-3-3 17:13 | 只看该作者
没金币
回复

使用道具 举报

7#
ID:167942 发表于 2017-3-3 17:14 | 只看该作者
再来个
回复

使用道具 举报

8#
ID:171429 发表于 2017-3-17 08:22 | 只看该作者
我想下载,没金币
回复

使用道具 举报

9#
ID:171429 发表于 2017-3-17 08:24 | 只看该作者
查表呀, 有没有直接计算的
回复

使用道具 举报

10#
ID:185687 发表于 2017-4-4 22:24 | 只看该作者
谢谢分享
回复

使用道具 举报

11#
ID:164719 发表于 2017-4-5 14:24 | 只看该作者
非常感谢分享
回复

使用道具 举报

12#
ID:160249 发表于 2017-6-28 09:24 | 只看该作者
特别想看,我也没金币了
回复

使用道具 举报

13#
ID:163679 发表于 2017-7-3 15:25 | 只看该作者
谢谢分享~
回复

使用道具 举报

14#
ID:224742 发表于 2017-8-4 16:36 | 只看该作者
多谢楼主分享
回复

使用道具 举报

15#
ID:239850 发表于 2017-10-16 11:24 | 只看该作者
没有积分,没办法下载啊
回复

使用道具 举报

16#
ID:265731 发表于 2017-12-23 17:13 | 只看该作者

多谢楼主分享
回复

使用道具 举报

17#
ID:265966 发表于 2017-12-25 11:41 | 只看该作者
可以参考一下
回复

使用道具 举报

18#
ID:270571 发表于 2018-1-3 09:21 | 只看该作者
感谢分享
回复

使用道具 举报

19#
ID:138017 发表于 2018-1-15 22:31 | 只看该作者

非常感谢分享
回复

使用道具 举报

20#
ID:282536 发表于 2018-2-6 10:53 | 只看该作者
感谢分享,
回复

使用道具 举报

21#
ID:286642 发表于 2018-3-1 15:51 | 只看该作者
好东西 谢谢分享
回复

使用道具 举报

22#
ID:317012 发表于 2018-4-26 14:41 | 只看该作者
谢谢分享
回复

使用道具 举报

23#
ID:82014 发表于 2018-4-26 19:38 | 只看该作者
借鉴一下楼主的简易算法
回复

使用道具 举报

24#
ID:77110 发表于 2018-5-4 12:42 | 只看该作者
好东西 谢谢分享
回复

使用道具 举报

25#
ID:316433 发表于 2018-6-6 22:33 | 只看该作者
最近在学习电机相关知识,希望能得到帮助
回复

使用道具 举报

26#
ID:389520 发表于 2018-10-17 17:01 | 只看该作者
有没有人知道这个程序怎么接线,对方向和脉冲控制的接口没看太明白
回复

使用道具 举报

27#
ID:141486 发表于 2019-8-12 21:07 | 只看该作者
收下了,慢慢研究一下
回复

使用道具 举报

28#
ID:364137 发表于 2020-11-11 09:38 | 只看该作者
谢谢分享,下载研究一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表