黄工无刷电机学习
直播中

王桂兰

8年用户 1273经验值
私信 关注
[问答]

怎么实现S形加减速算法?

怎么实现S形加减速算法?

回帖(1)

刘浩

2021-10-9 11:14:59
本文主要实现S形加减速算法。
原理/思路




  • 步进电机有启动频率这一概念。在启动时有一个最大启动频率,在低于最大启动频率的速度下开始运行,然后通过逐渐加速而达到较高的运行速度,减速亦然。
  • S形加减速算法,也可以通过提前设置速度表或通过输入参数计算出速度表,这两种方式来实现。上一篇梯形加减速算法中我提前设置的速度表,所以这篇我将通过计算的方式得到速度表。
  • S形加减速算法的原型是Sigmoid函数,这部分理论 “pengzhihui2012”的步进电机S型曲线加减速算法与实现.中讲解得比较详细,也感谢这篇文章的作者。我也是主要基于这篇文章做了一个复现。

代码实现




  • X_Step_Motor.h和X_Step_Motor.c,是一个步进电机的控制。
  • X_Step_Motor.h:


#ifndef __X_STEP_MOTOR_H
#define __X_STEP_MOTOR_H


#include "sys.h"
#include "math.h"                                // exp()
#include
#include "delay.h"


// Motor Parameter
typedef struct{
        float X_Step;
        float X_Fre_Min;
        float X_Fre_Max;
        float X_Jerk;
}X_SpeedList_TypeDef;
#define                X_TIM3_FREQ                                                (84000000 / X_TIM3_Prescaler)                // 2MHz
#define                X_TIM3_Pulse                                        (X_TIM3_FREQ / 500)
#define                X_Accel_Step                                        100.0f
#define                X_SpeedList_LEN                                        ((u8)X_Accel_Step)
#define                X_FREQ_MIN                                                500.0f
#define                X_FREQ_MAX                                                5000.0f
#define                X_JERK                                                        4.0f


// Motor State
#define                X_ACCEL                                                        1                                                // acceleration
#define                X_COSTT                                                        2                                                // constant
#define           X_DECEL                                 3                                                // deceleration
#define                X_UNIFM                                                        4                                                // uniform
#define                X_STOP                                                        0                                                // stop


#define                TRUE                                                        1
#define                FALSE                                                        0


// X - TIM3: CH1 - PA6, DIR - PA7
#define                X_TIM3_Prescaler                                42
#define                X_TIM3_Period                                        0xFFFF
#define                X_TIM3_IRQHandler                                TIM3_IRQHandler


// Calculate
void X_Calculate_SpeedList(u32 X_PulseNum);


// X
void X_GPIO_Init(void);                        //GPIO
void X_TIM3_Config(void);                // TIM
void X_PWM_S_Output_Left(void);
void X_PWM_S_Output_Right(void);
void X_Uniform_Output_Left(u32 X_PulseNum);
void X_Uniform_Output_Right(u32 X_PulseNum);
void X_Stop(void);
void X_TIM3_IRQHandler(void);


#endif        /* __X_STEP_MOTOR_H */


/****************************END OF FILE****************************/
实现效果






小结




  • 以上就是S形加减速算法的简单实现。此段代码,加速/减速过程为100步,每个频率走1步。这个部分可以通过调整宏定义进行修改。
  • 我这里使用的是TIM3,如果是使用TIM1TIM8等高级定时器,注意在配置定时器时添加下面这句,详细可查看 STM32:F103/F407定时器主从模式输出精准脉冲个数.一文中后面的部分。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分