本文主要实现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定时器主从模式输出精准脉冲个数.一文中后面的部分。
本文主要实现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定时器主从模式输出精准脉冲个数.一文中后面的部分。
举报