标题: 关于STM32单片机矩阵键盘+步进电机模拟电梯运行的问题求助 [打印本页]

作者: cidiy-biu    时间: 2021-8-10 09:35
标题: 关于STM32单片机矩阵键盘+步进电机模拟电梯运行的问题求助
使用stm32f103c8t6最小系统板控制步进电机正反转函数:  //此函数来自某位大佬写的,不是我写的。就是传入方向和角度来控制它正反转以及旋转角度。然后我写了一个主函数,获取矩阵键盘的键值,设置默认楼层为1楼,当按键按下,比较按下的楼层与默认楼层的大小,大于就是正转,小于反转,此时默认楼层变为当前按下的楼层,等待下次按键输入,在进行比较。之后烧录代码的时候,发现步进电机会一直转动,不会停下来,按下按键是,可以到达相应角度,但之后又继续超正方向转动,求大佬讲解一下为什么会这样,小白一个,求大佬不吝赐教。大哭!!!!
void Motor_Ctrl_Direction_Angle(int direction, int angle)
{
        u16 j;
        if(direction == 1)
        {
                for(j=0;j<64*angle/45;j++)
                {
                        MotoRccw();//正转
                }
                 MotorStop();//停止
  }
        else
        {
                for(j=0;j<64*angle/45;j++)
                {
                        MotoRcw();//反转
                }
                 MotorStop();//停止
        }
}

写了一个主函数:
int main(void)
{
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
         uart_init(9600);            
   Key_Init();  //矩阵键盘初始化
   Moto_Init();//步进电机初始化      
   delay_init();
   int beg = 1; //设置默认楼层为1
   int des ;
   int dir;
   int ang;      
        while(1)
        {
                des = Key_Scan();   //获取按下矩阵键盘的键值               
    if (des > beg){
                         dir = 1;  
       //print("电机正转")                       
                   ang = (des - beg)*45;  //电机旋转角度
                }
                else if(des == beg){
                         //print("无需移动");
                   continue;
                       
                }
                else{
                    dir = 0;
                          //printf("电机反转")  
                          ang = (beg - des)*45;  //电机旋转角度
                }
                    beg = dir;  //默认楼层为当前按键按下的楼层
        Motor_Ctrl_Direction_Angle(dir,ang);  // 启动电机
        // printf("当前楼层为:%d",beg);               
    }
      
}


烧录之后,发现步进电机一直旋转,按下按键后,它可以旋转规定的角度,但是旋转完成后,它继续往正方向旋转。哪位大佬帮我解释一下为什么会这样,感激不尽

作者: 姜Sir    时间: 2021-8-10 17:00
也是一样,原理都懂,就是转不起来
作者: zhb2004xp    时间: 2021-8-10 17:33
应该是while(1)内循环逻辑问题,最后为什么“beg = dir;  //默认楼层为当前按键按下的楼层”,dir只是判断正反转的变量,应该是“beg = des;  //默认楼层为当前按键按下的楼层”吧。
作者: zhb2004xp    时间: 2021-8-10 17:48
调用别人的程序最好先验证程序是否在你的硬件环境能够正常运行,设置不同的键值,分别验证调用程序能否正常正反转和停止;再使用printf输出打印验证你的while(1)运行输出参数是否正确,最后再加入调用的动作函数;有些问题需要自己进行判断和查找bug
作者: lkc8210    时间: 2021-8-10 17:51
                    beg = dir;  //默认楼层为当前按键按下的楼层
???
dir 不是方向吗?
应该是beg = des;  //默认楼层为当前按键按下的楼层
作者: Coolguyisme    时间: 2021-10-8 15:55
你有矩阵键盘的程序吗?





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1