微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于单片机的步进电机控制程序(有没有玩过这块的大神,帮帮我这个菜鸟)

基于单片机的步进电机控制程序(有没有玩过这块的大神,帮帮我这个菜鸟)

时间:10-02 整理:3721RD 点击:
这里只粘贴了部分代码,但是基本上能看出作用。这个代码的作用是根据定义的四个独立按键来控制电机的正转,反转,加速和减速。现在我做的比较简单(因为是新手,还在逐渐摸索中)。我采用的定时中断对键盘进行实时扫描,但是出现了一个问题,按下一个键,比如K1的时候,如果不放的话程序就会停止运行,这就意味着电机在这个时候不会转。哪位大神帮我看看,这个问题怎么解决?
/*****************独立键盘按键扫描函数**********************/
void Key_Selfscan()
        {
                if(K1==0)                //检测按键K1是否按下
                {
                        Delay(2);        //消除抖动
                        if(K1==0)
                        {
                                Direction = 1;                //正转方向标识
                        }       
                        while((i<50)&&(K1==0))         //检测按键是否松开
                        {
                                Delay(2);
                                i++;
                        }
                        i=0;
                }               
                if(K2==0)                         //检测按键K2是否按下
                {
                        Delay(2);
                        if(K2==0)
                        {
                                Direction = 2;           //反转方向标识
                        }
                        while((i<50)&&(K2==0))
                        {
                                Delay(2);
                                i++;
                        }
                        i=0;
                }                       
                if(K3==0)                                //检测按键K3是否按下
                {
                        Delay(2);
                        if(K3==0)
                        {
                   Speed = Speed+2;                //加速               
                        }
                        while((i<50)&&(K3==0))
                        {
                                Delay(2);
                                i++;
                        }
                        i=0;
                }
                       
                if(K4==0)                                        //检测按键K4是否按下
                {
                        Delay(2);
                        if(K4==0)
                        {
               Speed = Speed-2;                  //减速
                           }
                        while((i<50)&&(K4==0))
                        {
                                Delay(2);
                                i++;
                        }
                        i=0;
                }
        }
/*******************电机旋转函数****************/
void Motor_Whirl()
{     for(i=0;i<4;i++)
      {  if(Direction==1)
             {Motor = Double_pos[i];          //取正转链表
                  if(Direction==2)
                  { Motor = Double_rev[i];        //取反转链表}
                Delay(Speed);   //调节转速
}        }
/******************定时中断****************/
void Timer_Configuration()
{   TMOD = 0x01;//选择工作方式1
    TH0 = 0x3c; //设置初始值,定时50ms
        TL0 = 0xb0;
        EA =1;         //打开总中断
        ET0 = 1; //打开定时器0中断
        TR0 = 1;//启动定时器0
        }
void Timer0() interrupt 1
{   TH0 = 0x3c;
    TL0 = 0xb0;
        Key_Selfscan();
}                       
/***************主函数********************/
void main(void)
{         Speed=100;
   P2=0xf0; //电机端口初始化
   Timer_Configuration();
  while(1)
{  
          Motor_Whirl();
}
}

问题出在while()上,它的意思就是判断你是否释放按键,也就是你没释放按键将停留在此处。几个办法,第一,把你电机的驱动程序写进中断里,优先级最高高于按键的定时器中断。第二,就是去掉while(),但是前面的延时加稍微长一点点。第三,去掉while,增加释放按键消抖。

改成!K1试试。

你这个是 按键松手 的问题,可以看看其他大神 怎么写的按键 扫描程序!

while(K1==0);

谢谢啊,问题就是出在while()上,取消掉while之后,就没出现这个问题了

今天也遇到这个问题了,谢谢小编

mark

学习中,望一起

对对对

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top