完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用简单的状态机仿真实现一个电机正反转。
1. 电机角度从0开始,每一个循环增加一个值,角度到360度时电机圈数值加1,角度又从0开始递增。 2.当电机圈数达到指定的圈数时,电机反转,角度从360度开始递减,递减到0时,圈数减1. 3.当电机圈数递减到一个给定的值时,电机正转,角度从0开始递增,以此循环。 #include "stdafx.h" #include #include /*电机状态定义*/ 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; } 程序执行结果,打印出角度和圈数值。 |
|
|
|
只有小组成员才能发言,加入小组>>
2435 浏览 0 评论
9100 浏览 4 评论
36773 浏览 19 评论
5026 浏览 0 评论
24745 浏览 34 评论
1528浏览 2评论
1743浏览 1评论
2193浏览 1评论
1553浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:36 , Processed in 1.131413 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号