使用简单的状态机仿真实现一个电机正反转。
1. 电机角度从0开始,每一个循环增加一个值,角度到360度时电机圈数值加1,角度又从0开始递增。
2.当电机圈数达到指定的圈数时,电机反转,角度从360度开始递减,递减到0时,圈数减1.
3.当电机圈数递减到一个给定的值时,电机正转,角度从0开始递增,以此循环。
#include "stdafx.h"
#include <iostream>
#include <windows.h>
/*电机状态定义*/
typedef enum MotorMode {
STOP,
POSTURN,
NEGTURN,
}MotorMode;
/*定义一个结构体存储电机的角度值,圈数,正弦值,余弦值*/
typedef struct imulationSMB{
double angle;
double x;
double y;
int revcnt;
}SimulationSMB;
#define REVCNT_LIMIT_POS 10 /*电机正转圈数限值*/
#define REVCNT_LIMIT_NEG -10 /*电机反转圈数限值*/
#define MOTOR_STEP 1 /*电机角度递增值*/
#define PI 3.14159265
SimulationSMB SMBdata = {0};
SimulationSMB calSMBdata = { 0 };
MotorMode motorMode = STOP;
/*模拟电机转动的简单状态机,包含停止,正转和反转三种状态
停止状态会跳转到正转状态
在正转状态时,电机角度从0度开始,每循环一次递增MOTOR_STEP,角度到360时,圈数值增加1,,然后角度值又从0开始递增
在反转状态时,电机角度从360度开始,每循环一次递减MOTOR_STEP,角度减到0度时,圈数值减1,然后角度值又从360度开始递减
电机圈数到达REVCNT_LIMIT_POS时,电机切换到反转状态
电机圈数到达REVCNT_LIMIT_NEG时,电机切换到正转状态*/
void FuncSimulationSMB()
{
switch (motorMode)
{
case STOP:
if (SMBdata.revcnt > REVCNT_LIMIT_NEG && SMBdata.revcnt < REVCNT_LIMIT_POS)
{
motorMode = POSTURN;
}
break;
case POSTURN:
SMBdata.angle = SMBdata.angle + MOTOR_STEP;
SMBdata.x = cos(SMBdata.angle*PI/180);
SMBdata.y = sin(SMBdata.angle*PI/180);
if (SMBdata.angle >= 360)
{
SMBdata.revcnt = SMBdata.revcnt + 1;
if (SMBdata.revcnt == REVCNT_LIMIT_POS)
{
motorMode = NEGTURN;
}
else
{
SMBdata.angle = 0;
}
}
break;
case NEGTURN:
SMBdata.angle = SMBdata.angle - MOTOR_STEP;
SMBdata.x = cos(SMBdata.angle*PI / 180);
SMBdata.y = sin(SMBdata.angle*PI / 180);
if (SMBdata.angle <= 0)
{
SMBdata.revcnt = SMBdata.revcnt - 1;
if (SMBdata.revcnt == REVCNT_LIMIT_NEG)
{
motorMode = POSTURN;
}
else
{
SMBdata.angle = 360;
}
}
break;
default:
break;
}
}
int main()
{
while (1)
{
FuncSimulationSMB();
Sleep(400);
std::cout << "SMBdata.angle = "<< SMBdata.angle << std::endl;
std::cout << "SMBdata.revcnt = " << SMBdata.revcnt << std::endl;
}
return 0;
}
程序执行结果,打印出角度和圈数值。