C语言逻辑求助

本文探讨了如何改进一个使用步进电机和霍尔传感器的程序,以防止电机停止时霍尔传感器被卡住导致的程序死锁。通过调整检测逻辑和添加适当的时间检查,作者寻求解决当电机未转动时按键操作导致的while循环停滞问题。
摘要由CSDN通过智能技术生成

 此代码为main函数中的while循环,

有两个步进电机,每个步进电机上都有霍尔信号传感器,电机转动过程中转过霍尔传感器的上方时对应的引脚电平输入为零,否则电平为1。电机转动5次,每次转一圈记录对应的时间(霍尔信号从0到1再到0为一圈),后四圈比较每圈的时间。

主要问题在于如果电机停止时上方磁铁刚好在霍尔传感器上方,那么此时再次按动按键使电机转动时,程序将死在while(HR1L==0);

该怎样改程序才能避免这个问题,求大佬帮忙回答!万分感谢!

while(1)
    {
        scankey();//按键函数,按下一个按键步进电机开始转动
        if(HR1L==0)//检测到霍尔变量
            {
  
                TIM4->CNT=0;//计时器清零
                while(HR1L==0);//死在这
                while(HR1L==1);//
                tmp1=TIM4->CNT;//
                 //***数码管显示函数***//
                dispbuf[4]=tmp1/1000;
                dispbuf[5]=(tmp1/100)%10;
                dispbuf[6]=(tmp1%100)/10;
                dispbuf[7]=tmp1%10;
                disp();
                //********************//
                HR1Lflag++;
                HR1L_tmp1[j++]=tmp1;
                printf("HR1L_tmp1[%d]  =        %d\r\n",j-1,  HR1L_tmp1[j-1]);
            }
        if(HR3L==0)//检测到霍尔变量
        {


            tmp3=TIM3->CNT;//记录当前时间
            TIM3->CNT=0;//计时器清零
            while(HR3L==0);//没有检测到霍尔变量
            while(HR3L==1);
            tmp3=TIM3->CNT;//
//            tmp3=600000/tmp3;//
        
            dispbuf[0]=tmp3/1000;
            dispbuf[1]=(tmp3/100)%10;
            dispbuf[2]=(tmp3%100)/10;
            dispbuf[3]=tmp3%10;
            disp();
            HR3Lflag++;
            HR3L_tmp3[i++]=tmp3;
            printf("HR3L_tmp3[%d]  =  %d\r\n",i-1,  HR3L_tmp3[i-1]);
        }
        
        
            if((HR1Lflag==5)&&(HR3Lflag==5))
            {
                GPIOA->BRR=GPIO_Pin_2;
                for(k=1;k<4;k++)
                {
                    if ((abs(HR1L_tmp1[k]-HR1L_tmp1[k+1])<=10)||(abs(HR3L_tmp3[k+1]-HR3L_tmp3[k])<=10))
                    {
                        test++;
//                        LED2_GREEN_ON;
//                        BEEPON;
//                        delay_ms(500);
//                        BEEPOFF;
                    }
                    else
                    {
                        LED1_RED_ON;
                        BEEPON;
                        delay_ms(60000);
                        BEEPOFF;
                    }
                }
                
                HR1Lflag=0;
                HR3Lflag=0;
                k=0;i=0;j=0;
                memset(HR1L_tmp1,'\0',sizeof(HR1L_tmp1));
                memset(HR3L_tmp3,'\0',sizeof(HR3L_tmp3));
            }
        if(test==3)
        {
            LED2_GREEN_ON;
            BEEPON;
            delay_ms(5000);
            BEEPOFF;
            test = 0;
        }
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颈部者

感谢您对我的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值