找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2329|回复: 5
收起左侧

关于STM32单片机矩阵键盘+步进电机模拟电梯运行的问题求助

[复制链接]
ID:955316 发表于 2021-8-10 09:35 | 显示全部楼层 |阅读模式
使用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);               
    }
      
}


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

使用道具 举报

无效楼层,该帖已经被删除
ID:958755 发表于 2021-8-10 17:00 | 显示全部楼层
也是一样,原理都懂,就是转不起来
回复

使用道具 举报

ID:234075 发表于 2021-8-10 17:33 | 显示全部楼层
应该是while(1)内循环逻辑问题,最后为什么“beg = dir;  //默认楼层为当前按键按下的楼层”,dir只是判断正反转的变量,应该是“beg = des;  //默认楼层为当前按键按下的楼层”吧。
回复

使用道具 举报

ID:234075 发表于 2021-8-10 17:48 | 显示全部楼层
调用别人的程序最好先验证程序是否在你的硬件环境能够正常运行,设置不同的键值,分别验证调用程序能否正常正反转和停止;再使用printf输出打印验证你的while(1)运行输出参数是否正确,最后再加入调用的动作函数;有些问题需要自己进行判断和查找bug
回复

使用道具 举报

ID:161164 发表于 2021-8-10 17:51 | 显示全部楼层
                    beg = dir;  //默认楼层为当前按键按下的楼层
???
dir 不是方向吗?
应该是beg = des;  //默认楼层为当前按键按下的楼层
回复

使用道具 举报

ID:188940 发表于 2021-10-8 15:55 | 显示全部楼层
你有矩阵键盘的程序吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表