黄工无刷电机学习
直播中

半导体开发

10年用户 851经验值
擅长:可编程逻辑
私信 关注
[问答]

请问89c51单片机如何控制两个步进电机正反转加减速?

请问89c51单片机如何控制两个步进电机正反转加减速?

回帖(1)

杨帆

2021-10-27 14:57:28
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)





  • /*******************************************************************************



  • * 实 验 名: 步进电机实验



  • * 使用的IO: 电机用P1口,键盘使用P2.0、P2.1、P2.2、P2.3、P2.4、P2.5



  • * 按键功能:K1;正转  K2;反转  K3;低速转动  K4;高速转动  K5:电机切换  K6;停止



  • * 实验效果: 按下K1键,顺时针转,按下K2键,逆时针转,按下K3键,低速,按下K4键,高速。

  •                         按下K5键,转动的电机停止,并切换到控制另一个电机

  •                         按下K6键,转动的电机停止,按下K1或K2时,刚才停止的电机继续转动





  • *******************************************************************************/



  • #include "reg52.h"





  • //电机IO



  • #define GPIO_MOTOR P1            //宏定义 对端口进行操作,定义电机接口为P1



  • //***it F1 = P1^0;



  • //***it F2 = P1^1;



  • //***it F3 = P1^2;



  • //***it F4 = P1^3;



  • //***it F5 = P1^4;



  • //***it F6 = P1^5;



  • //***it F7 = P1^6;



  • //***it F8 = P1^7;                //另种操作,位操作,定义电机接口为P1.0~p1.7



  • //按键IO



  • ***it K1=P2^0;          //正转



  • ***it K2=P2^1;          //反转



  • ***it K3=P2^2;          // 减速



  • ***it K4=P2^3;          // 加速



  • ***it K5=P2^4;          // 电机切换



  • ***it K6=P2^5;          // 停止



  • unsigned char code FFW_X[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //X反转顺序



  • unsigned char code FFZ_X[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //X正转顺序



  • unsigned char code FFW_Y[8]={0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f}; //Y反转顺序



  • unsigned char code FFZ_Y[8]={0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}; //Y正转顺序



  • unsigned char Direction,Speed,X_Y=0,stop=0;           //  Direction  转向标志位,Speed 延时函数的参数,通过改变它大小来控制电机转速

  •                                                                                            //X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机

  • void Delay(unsigned int t);                                           //stop为控制电机停止的标志位,但它为1时,电机停止



  • void Motor();                                                                   //电机旋转函数





  • /*******************************************************************************



  • * 函 数 名 : main



  • * 函数功能 : 主函数



  • * 输    入 : 无



  • * 输    出 : 无



  • *******************************************************************************/





  • void main(void)



  • {



  • unsigned char i;



  • Speed=30;                   //Speed 延时函数的参数,通过改变它大小来控制电机转速



  • while(1)



  • {



  • /********************检测按键K1是否按下***********************/

  • if(K1==0) //检测按键K1是否按下



  • {



  • Delay(1); //消除抖动



  • if(K1==0)



  • {



  • Direction=1;           //Direction 转向标志位,为1时为正转

  • stop=0;                   //按下K1时,对stop停止标志位清零,如果之前按下停止键,清零之后才能启动



  • }



  • while((i<200)&&(K1==0))//检测按键是否松开



  • {



  • Delay(1);



  • i++;



  • }



  • i=0;



  • }



  • /********************检测按键K2是否按下***********************/



  • if(K2==0) //检测按键K2是否按下



  • {



  • Delay(1); //消除抖动



  • if(K2==0)



  • {



  • Direction=2;                  //Direction 转向标志位,为2时为反转

  • stop=0;                          //按下K1时,也对stop停止标志位清零,如果之前按下停止键,清零之后才能启动



  • }



  • while((i<200)&&(K2==0))//检测按键是否松开



  • {



  • Delay(1);



  • i++;



  • }



  • i=0;



  • }



  • /********************检测按键K3是否按下***********************/

  • if(K3==0)//检测按键K3是否按下



  • {



  • Delay(1);//消除抖动



  • if(K3==0)



  • {



  • Speed=60;                                   //Speed 延时函数的参数,通过改变它大小来控制电机转速

  •                                                    //87行代码定义Speed=30;但按键K3按下后,Speed=60,这时转速就会降下来

  • }



  • while((i<200)&&(K3==0))//检测按键是否松开



  • {



  • Delay(1);



  • i++;



  • }



  • i=0;



  • }





  • /********************检测按键K3是否按下***********************/



  • if(K4==0) //检测按键K4是否按下



  • {



  • Delay(1); //消除抖动



  • if(K4==0)



  • {



  • Speed=20;                         //Speed 延时函数的参数,通过改变它大小来控制电机转速

  •                                                    //87行代码定义Speed=30;但按键K4按下后,Speed=20,这时转速就会降下来升上去

  • }



  • while((i<200)&&(K4==0))//检测按键是否松开



  • {



  • Delay(1);



  • i++;



  • }



  • i=0;



  • }



  •   if(K5==0)//检测按键K1是否按下



  • {



  • Delay(1);//消除抖动



  • if(K5==0)



  • {

  •    Direction=0;                                   //X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机

  •    if(X_Y==0)                                   //当切换电机时,对Direction=0;对标志位清零,防止上个电机的转向影响本次所控电机

  •        X_Y=1;

  •    else

  •        X_Y=0;



  • }



  • while((i<200)&&(K5==0))//检测按键是否松开



  • {



  • Delay(1);



  • i++;



  • }



  • i=0;



  • }



  •    if(K6==0)//检测按键K1是否按下



  • {



  • Delay(1);//消除抖动



  • if(K6==0)



  • {

  •    stop=1;                                   //stop为控制电机停止的标志位,但它为1时,电机停止



  • }



  • while((i<200)&&(K6==0))//检测按键是否松开



  • {



  • Delay(1);



  • i++;



  • }



  • i=0;



  • }



  • Motor();



  • }



  • }



  • /*******************************************************************************



  • * 函 数 名: Motor



  • * 函数功能: 电机旋转函数



  • * 输    入: 无



  • * 输    出: 无



  • *******************************************************************************/





  • void Motor()



  • {



  • unsigned char i;



  • for(i=0;i<8;i++)



  • {



  • if(Direction==1&&X_Y==0&&stop==0)                 //正转&Y电机&电机没按下停止



  • GPIO_MOTOR = FFW_Y&0xf0;//取数据,‘&’按位与



  • if(Direction==2&&X_Y==0&&stop==0)                 //反转&Y电机&电机没按下停止



  • GPIO_MOTOR = FFZ_Y&0xf0;



  •   if(Direction==1&&X_Y!=0&&stop==0)                 //正转&X电机&电机没按下停止



  • GPIO_MOTOR = FFW_X&0x0F;//取数据



  • if(Direction==2&&X_Y!=0&&stop==0)                 //反转&X电机&电机没按下停止



  • GPIO_MOTOR = FFZ_X&0x0f;



  • Delay(Speed); //调节转速



  • }



  • }



  • /*******************************************************************************



  • * 函 数 名  : Delay



  • * 函数功能  : 延时



  • * 输    入  : t



  • * 输    出  : 无



  • *******************************************************************************/



  • void Delay(unsigned int t)



  • {



  • unsigned int k;



  • while(t--)



  • {



  • for(k=0; k<80; k++)



  • { }



  • }



  • }



举报

更多回帖

×
20
完善资料,
赚取积分