找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19133|回復(fù): 27
收起左側(cè)

分享個(gè)簡易的步進(jìn)電機(jī)S加減速

  [復(fù)制鏈接]
ID:93106 發(fā)表于 2016-11-4 09:28 | 顯示全部樓層 |閱讀模式
以前自己有研究過S曲線加減速,步進(jìn)電機(jī)盡量都跑這種曲線,原因就是當(dāng)電機(jī)驅(qū)動器給電機(jī)一個(gè)較高的頻率的時(shí)候,步進(jìn)電機(jī)很可能反應(yīng)不過來,造成堵轉(zhuǎn),或者這個(gè)頻率變化的斜率太大剛由低頻起轉(zhuǎn)突然就變到高頻了一樣會造成堵轉(zhuǎn)、失步等等。

S曲線就是為了讓電機(jī)由低速到高速有個(gè)比較平滑的過度,能順利讓步進(jìn)電機(jī)運(yùn)行到要求的狀態(tài),其實(shí)就是我們常說的緩起緩?fù),直流電機(jī)也一樣,突然啟停電機(jī)都有非常大的沖動,如果不消除這種沖動是無法玩位置定位的

那么我就傳一份比較簡單的查表式的S曲線啟?唧wS曲線講究非常多,百度也有很多文章,大家可自行去了解,高難的我也不會,因?yàn)榇_實(shí)用不到,但是有機(jī)會一樣要學(xué),大家一起學(xué),我先拋個(gè)磚,站在前排的都小心點(diǎn)哈,砸死你哦!

查表我是直接扒別人的,自己算和實(shí)驗(yàn)?zāi)壳斑沒有時(shí)間,大家先自己下來玩耍一番,有好的東西一起分享下
簡易步進(jìn)電機(jī)S加減速.rar (306.43 KB, 下載次數(shù): 417)

評分

參與人數(shù) 2黑幣 +90 收起 理由
wfliu + 10 贊一個(gè)!
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:146204 發(fā)表于 2016-11-8 09:48 | 顯示全部樓層
/*

    * 步進(jìn)電機(jī)S曲線加減速
   
    * 若發(fā)現(xiàn)啟動后電機(jī)有堵轉(zhuǎn)的情況請?jiān)龃髷?shù)組中的數(shù)值,簡單的方法是在調(diào)用的時(shí)候直接乘個(gè)倍數(shù)
   
*/

下面是樓主的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;                    // 復(fù)用推挽輸出
  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;                    // 復(fù)用推挽輸出
  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 開啟時(shí)鐘 */
  24.         //PCLK1經(jīng)過2倍頻后作為TIM2的時(shí)鐘源等于72MHz
  25.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  26.   /* TIM2基本配置 */                 
  27.   TIM_TimeBaseStructure.TIM_Period = 1000;
  28.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
  29.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //設(shè)置時(shí)鐘分頻系數(shù):不分頻
  30.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上計(jì)數(shù)模式

  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;                                                                                                           //設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(shí),電平發(fā)生跳變
  37.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1_Val時(shí)為高電平

  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 開啟時(shí)鐘 */
  50.         //PCLK1經(jīng)過2倍頻后作為TIM3的時(shí)鐘源等于72MHz
  51.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  52.   /* TIM3基本配置 */                 
  53.   TIM_TimeBaseStructure.TIM_Period = 1000;
  54.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
  55.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //設(shè)置時(shí)鐘分頻系數(shù):不分頻
  56.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上計(jì)數(shù)模式

  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;                                                                                                           //設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(shí),電平發(fā)生跳變
  63.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1_Val時(shí)為高電平

  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 開啟時(shí)鐘 */
  76.         //PCLK1經(jīng)過2倍頻后作為TIM3的時(shí)鐘源等于72MHz
  77.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  78.   /* TIM4基本配置 */                 
  79.   TIM_TimeBaseStructure.TIM_Period = 1000;
  80.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
  81.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //設(shè)置時(shí)鐘分頻系數(shù):不分頻
  82.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上計(jì)數(shù)模式

  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;                                                                                                           //設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(shí),電平發(fā)生跳變
  89.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1_Val時(shí)為高電平

  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 開啟時(shí)鐘 */
  102.         //PCLK1經(jīng)過2倍頻后作為TIM3的時(shí)鐘源等于72MHz
  103.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

  104.   /* TIM5基本配置 */                 
  105.   TIM_TimeBaseStructure.TIM_Period = 1000;
  106.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                                                    //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
  107.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                                //設(shè)置時(shí)鐘分頻系數(shù):不分頻
  108.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                  //向上計(jì)數(shù)模式

  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;                                                                                                           //設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(shí),電平發(fā)生跳變
  115.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                          //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1_Val時(shí)為高電平

  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. }

復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:147443 發(fā)表于 2016-11-14 15:06 | 顯示全部樓層
好東西 謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:138686 發(fā)表于 2017-1-20 17:29 | 顯示全部樓層
非常感謝分享
回復(fù)

使用道具 舉報(bào)

ID:163545 發(fā)表于 2017-2-8 10:08 | 顯示全部樓層
非常感謝分享
回復(fù)

使用道具 舉報(bào)

ID:167942 發(fā)表于 2017-3-3 17:13 | 顯示全部樓層
沒金幣
回復(fù)

使用道具 舉報(bào)

ID:167942 發(fā)表于 2017-3-3 17:14 | 顯示全部樓層
再來個(gè)
回復(fù)

使用道具 舉報(bào)

ID:171429 發(fā)表于 2017-3-17 08:22 | 顯示全部樓層
我想下載,沒金幣
回復(fù)

使用道具 舉報(bào)

ID:171429 發(fā)表于 2017-3-17 08:24 | 顯示全部樓層
查表呀, 有沒有直接計(jì)算的
回復(fù)

使用道具 舉報(bào)

ID:185687 發(fā)表于 2017-4-4 22:24 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:164719 發(fā)表于 2017-4-5 14:24 | 顯示全部樓層
非常感謝分享
回復(fù)

使用道具 舉報(bào)

ID:160249 發(fā)表于 2017-6-28 09:24 | 顯示全部樓層
特別想看,我也沒金幣了
回復(fù)

使用道具 舉報(bào)

ID:163679 發(fā)表于 2017-7-3 15:25 | 顯示全部樓層
謝謝分享~
回復(fù)

使用道具 舉報(bào)

ID:224742 發(fā)表于 2017-8-4 16:36 | 顯示全部樓層
多謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:239850 發(fā)表于 2017-10-16 11:24 | 顯示全部樓層
沒有積分,沒辦法下載啊
回復(fù)

使用道具 舉報(bào)

ID:265731 發(fā)表于 2017-12-23 17:13 | 顯示全部樓層

多謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:265966 發(fā)表于 2017-12-25 11:41 | 顯示全部樓層
可以參考一下
回復(fù)

使用道具 舉報(bào)

ID:270571 發(fā)表于 2018-1-3 09:21 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:138017 發(fā)表于 2018-1-15 22:31 | 顯示全部樓層

非常感謝分享
回復(fù)

使用道具 舉報(bào)

ID:282536 發(fā)表于 2018-2-6 10:53 | 顯示全部樓層
感謝分享,
回復(fù)

使用道具 舉報(bào)

ID:286642 發(fā)表于 2018-3-1 15:51 | 顯示全部樓層
好東西 謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:317012 發(fā)表于 2018-4-26 14:41 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:82014 發(fā)表于 2018-4-26 19:38 | 顯示全部樓層
借鑒一下樓主的簡易算法
回復(fù)

使用道具 舉報(bào)

ID:77110 發(fā)表于 2018-5-4 12:42 | 顯示全部樓層
好東西 謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:316433 發(fā)表于 2018-6-6 22:33 | 顯示全部樓層
最近在學(xué)習(xí)電機(jī)相關(guān)知識,希望能得到幫助
回復(fù)

使用道具 舉報(bào)

ID:389520 發(fā)表于 2018-10-17 17:01 | 顯示全部樓層
有沒有人知道這個(gè)程序怎么接線,對方向和脈沖控制的接口沒看太明白
回復(fù)

使用道具 舉報(bào)

ID:141486 發(fā)表于 2019-8-12 21:07 | 顯示全部樓層
收下了,慢慢研究一下
回復(fù)

使用道具 舉報(bào)

ID:364137 發(fā)表于 2020-11-11 09:38 | 顯示全部樓層
謝謝分享,下載研究一下。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表