完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用简单的状态机仿真实现一个电机正反转。
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.14159265SimulationSMB 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;} 程序执行结果,打印出角度和圈数值。 |
|
|
|
只有小组成员才能发言,加入小组>>
576浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 12:04 , Processed in 0.475119 second(s), Total 42, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号