步进电机驱动 高手进来帮忙了

2020-01-26 12:50发布

以下能驱动两相四线步进电机正转反转

按键1正转 键2反转   功能正常
我想让按键按下后能转且持续2秒转动后停止。最好两键能互锁。

小白能力有限 望各位高手不吝赐教。 特此感谢了

#include <reg52.h>
sbit EN=P1^6;                       //使能   
sbit A1=P1^7;
sbit B1=P1^5;
sbit Key1=P3^7;                     //按键!
sbit Key2=P3^5;                     //按键!

void D_MS(void){
        unsigned int i=80;         //速度
        for(;i>0;i--)           
                ;               
}

void RRM(void){                                   //正转
        EN=1;  
        A1=1;
        D_MS();
        B1=1;
        D_MS();
        A1=0;
        D_MS();
        B1=0;
        D_MS();       
        EN=0;
}

void LLM(void){                                  //反转
        EN=1;
        B1=0;
        D_MS();
        A1=0;
        D_MS();
        B1=1;
        D_MS();
        A1=1;
        D_MS();
        EN=0;

}

void main(void){
        A1=0;
        B1=0;
        EN=0;
        while(1){
               
                if(Key1==0){
                        D_MS();
                        while(Key1==0){
                                RRM();
                        }
                }
                if(Key2==0){
                        D_MS();
                        while(Key2==0){
                                LLM();
                        }
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
znxsjay
1楼-- · 2020-01-26 17:08
加个中断试试
luozyou
2楼-- · 2020-01-26 21:44
znxsjay 发表于 2013-10-27 12:26
加个中断试试

我编程是小白啊
rifjft
3楼-- · 2020-01-27 00:21
找个定时器中断的例子,然后在中断内取反一个IO的电平, 像 CP = !CP;   再在中断放置一个变量计算脉冲数量,每入一次中断计算一次
1.8度的电机,每秒一转,8细分,就是1600个脉冲,要转两圈就是3200个脉冲。中断内变量计数就是6400次
如在中断内:
if(CP_count < 6400)
{
    CP = !CP;
    CP_count++;
}

初始化时,CP 和 CP_count 先清零。 另外 sbit CP = P1^7

在方向控制中清零脉冲变量,要转2圈才能切换方向,可加判断 if(CP_count== 6400) 时,再切换方向、清零变量

不明白只能是先看基础资料
luozyou
4楼-- · 2020-01-27 04:00
 精彩回答 2  元偷偷看……
lryxr2507
5楼-- · 2020-01-27 09:04
      用单片机控制步进电机有些麻烦,很多时候理论值是这样的,但实际中因为干扰,负载过重等原因会出现丢步等现象,实际发出的脉冲不够,转不到位,这就要需要想办法去补偿,过多会走过头,过少又会不到位,非常头痛,现自己也在不断摸索学习中.
曾家0762
6楼-- · 2020-01-27 09:15
简单点的   用按键标志位

        if(Key1==0)
        {
                D_MS();
                while(Key1==0)
                {
                        flag=1;        //电机正转标志
                }
        }
       
        if(Key2==0)
        {
                D_MS();
                while(Key2==0)
                {
                        flag=2;//电机反转标志
                }
        }
       
        if(flag==1)
        {
                for(i=0;i<1000;i++)//改1000的值就能改电机持续转的时间了,不够的话用两层for循环
                {
                        RRM();
                }
        }
        else if(flag==2)
        {
                for(i=0;i<1000;i++)
                {
                        LLM();
                }
        }
        flag=0;                 

一周热门 更多>