其他分享
首页 > 其他分享> > 模拟电机正反转产生得到角度和圈数

模拟电机正反转产生得到角度和圈数

作者:互联网

使用简单的状态机仿真实现一个电机正反转。

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

程序执行结果,打印出角度和圈数值。

标签:angle,电机,反转,圈数,角度,LIMIT,SMBdata,REVCNT
来源: https://blog.csdn.net/cz2085007221/article/details/104803031