S7曲线

电机S7曲线加加速 匀加速 减加速 匀速 加减速 匀减速 减减速代码
#include <iostream>
#include <cmath>
// 定义电机参数
const double maxSpeed = 100.0; // 最大速度
const double acceleration = 10.0; // 加速度
const double deceleration = 10.0; // 减速度
// S7曲线加加速
void s7CurveAcceleration(double targetSpeed) {
double currentSpeed = 0.0;
double time = 0.0;
while (currentSpeed < targetSpeed) {
currentSpeed += acceleration * time;
if (currentSpeed > targetSpeed) {
currentSpeed = targetSpeed;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
}
// S7曲线匀加速
void s7CurveUniformAcceleration(double targetSpeed) {
double currentSpeed = 0.0;
double time = 0.0;
while (currentSpeed < targetSpeed) {
currentSpeed += acceleration * time;
if (currentSpeed > targetSpeed) {
currentSpeed = targetSpeed;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
while (currentSpeed > 0) {
currentSpeed -= deceleration * time;
if (currentSpeed < 0) {
currentSpeed = 0;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
}
// S7曲线减加速
void s7CurveDeceleration(double targetSpeed) {
double currentSpeed = targetSpeed;
double time = 0.0;
while (currentSpeed > 0) {
currentSpeed -= deceleration * time;
if (currentSpeed < 0) {
currentSpeed = 0;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
}
// S7曲线匀速
void s7CurveUniformSpeed(double targetSpeed) {
double currentSpeed = targetSpeed;
std::cout << "Current Speed: " << currentSpeed << std::endl;
}
// S7曲线加减速
void s7CurveAccelerationDeceleration(double targetSpeed) {
double currentSpeed = 0.0;
double time = 0.0;
while (currentSpeed < targetSpeed / 2) {
currentSpeed += acceleration * time;
if (currentSpeed > targetSpeed / 2) {
currentSpeed = targetSpeed / 2;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
while (currentSpeed > 0) {
currentSpeed -= deceleration * time;
if (currentSpeed < 0) {
currentSpeed = 0;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
}
// S7曲线匀减速
void s7CurveUniformDeceleration(double targetSpeed) {
double currentSpeed = targetSpeed / 2;
double time = 0.0;
while (currentSpeed > 0) {
currentSpeed -= deceleration * time;
if (currentSpeed < 0) {
currentSpeed = 0;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
}
// S7曲线减减速
void s7CurveDecelerationDeceleration(double targetSpeed) {
double currentSpeed = targetSpeed;
double time = 0.0;
while (currentSpeed > 0) {
currentSpeed -= deceleration * time;
if (currentSpeed < 0) {
currentSpeed = 0;
}
std::cout << "Current Speed: " << currentSpeed << std::endl;
time += 0.1;
}
}
int main() {
double targetSpeed = maxSpeed; // 设置目标速度
// S7曲线加加速
s7CurveAcceleration(targetSpeed);
// S7曲线匀加速
s7CurveUniformAcceleration(targetSpeed);
// S7曲线减加速
s7CurveDeceleration(targetSpeed);
// S7曲线匀速
s7CurveUniformSpeed(targetSpeed);
// S7曲线加减速
s7CurveAccelerationDeceleration(targetSpeed);
// S7曲线匀减速
s7CurveUniformDeceleration(targetSpeed);
// S7曲线减减速
s7CurveDecelerationDeceleration(targetSpeed);
return 0;
}
改进后的
#include <iostream>
#include <cmath>
#include <windows.h>
const double maxSpeed = 30.0;
const double acceleration = 2.0;
const double deceleration = 3.0;
double s7CurveAcceleration(double targetSpeed) {
static double currentSpeed = 0.0;
static double time = 0.0;
static double current_acceleration = 0;
currentSpeed = currentSpeed + current_acceleration * time;
current_acceleration += 0.1;
if(current_acceleration > acceleration)
{
return currentSpeed;
}
if (currentSpeed > targetSpeed) {
currentSpeed = targetSpeed;
}
std::cout << "S7曲线加加速1 Current Speed: " << currentSpeed << " current_acceleration:" <<current_acceleration << std::endl;
time += 0.1;
return currentSpeed;
}
double s7CurveUniformAcceleration(double currentSpeed, double targetSpeed) {
static double time = 0.0;
currentSpeed += acceleration * time;
if (currentSpeed > targetSpeed) {
currentSpeed = targetSpeed;
}
std::cout << "S7曲线匀加速1 Current Speed: " << currentSpeed << std::endl;
time += 0.1;
return currentSpeed;
}
double s7CurveDeceleration(double currentSpeed, double targetSpeed) {
static double time = 1;
static double acceleration_ = acceleration;
currentSpeed += acceleration_ * time;
acceleration_ -= 0.5;
if (acceleration_ < 0) {
acceleration_ = 0;
std::cout << "S7曲线减加速 Current Speed: " << currentSpeed << " deceleration_:" << acceleration_ << std::endl;
return currentSpeed;
}
if (currentSpeed > targetSpeed) {
currentSpeed = targetSpeed;
}
std::cout << "S7曲线减加速 Current Speed: " << currentSpeed << std::endl;
time -= 0.1;
return currentSpeed;
}
double s7CurveUniformSpeed(double targetSpeed)
{
double currentSpeed = targetSpeed;
std::cout << "S7曲线匀速 Current Speed: " << currentSpeed << std::endl;
return currentSpeed;
}
double s7CurveAccelerationDeceleration(double currentSpeed, double targetSpeed) {
static double time = 0.0;
static double current_deceleration = 0;
currentSpeed = currentSpeed + current_deceleration * time;
if(currentSpeed < -targetSpeed)
{
currentSpeed = -targetSpeed;
return currentSpeed;
}
current_deceleration -= 0.5;
if(current_deceleration > -deceleration)
{
current_deceleration = -deceleration;
std::cout << "S7曲线加减速1 Current Speed: " << currentSpeed << " current_deceleration:" <<current_deceleration << std::endl;
return currentSpeed;
}
std::cout << "S7曲线加减速1 Current Speed: " << currentSpeed << std::endl;
time += 0.1;
return currentSpeed;
}
double s7CurveUniformDeceleration(double currentSpeed, double targetSpeed) {
static double time = 1;
currentSpeed = currentSpeed - deceleration * time;
if (currentSpeed < -targetSpeed) {
currentSpeed = -targetSpeed;
return currentSpeed;
}
std::cout << "S7曲线匀减速 Current Speed: " << currentSpeed << std::endl;
return currentSpeed;
}
double s7CurveDecelerationDeceleration(double currentSpeed, double targetSpeed) {
static double time = 1;
static double deceleration_ = -deceleration;
currentSpeed = currentSpeed + deceleration_ * time;
deceleration_ += 0.5;
if (deceleration_ > deceleration) {
deceleration_ = deceleration;
std::cout << "S7曲线减减速 Current Speed: " << currentSpeed << "deceleration_:" << deceleration_ << std::endl;
}
if (currentSpeed < -targetSpeed) {
currentSpeed = -targetSpeed;
return currentSpeed;
}else if (currentSpeed > 0) {
currentSpeed = 0;
}
std::cout << "S7曲线减减速 Current Speed: " << currentSpeed << "deceleration_:" << deceleration_ << std::endl;
return currentSpeed;
}
int main()
{
double targetSpeed = maxSpeed;
double nowSpeed = 0.0;
double process = 0.0;
while(1)
{
Sleep(33);
process += 0.1;
if(process > 10)
{
printf("break line:%d process:%f\n", __LINE__, process);
break;
}
printf("line:%d process:%f\n", __LINE__, process);
if(process >= 0 && process <= 2)
{
nowSpeed = s7CurveAcceleration(targetSpeed);
}
else if(process > 2 && process <= 3)
{
nowSpeed = s7CurveUniformAcceleration(nowSpeed, targetSpeed);
}
else if(process > 3 && process <= 4)
{
nowSpeed = s7CurveDeceleration(nowSpeed, targetSpeed);
}
else if(process > 4 && process <= 6)
{
nowSpeed = s7CurveUniformSpeed(nowSpeed);
}
else if(process > 6 && process <= 7)
{
nowSpeed =s7CurveAccelerationDeceleration(nowSpeed, targetSpeed);
}
else if(process > 7 && process <= 8)
{
nowSpeed = s7CurveUniformDeceleration(nowSpeed, targetSpeed);
}
else if(process > 8 && process <= 10)
{
nowSpeed = s7CurveDecelerationDeceleration(nowSpeed, targetSpeed);
}
}
return 0;
}