控制步进电机方向

2019-08-16 21:40发布

通过一个驱动器来控制步进电机,但是我想要电机反转时,DIR=~DIR;  和 DIR=!DIR; 都不行,必须赋值0 或 1
请问这是为什么?LED闪烁,不也是IO口取反吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
mingyuegx
1楼-- · 2019-08-16 23:56
那你看过DIR的宏定义吗?LED是宏定义了地址,然后再通过置输入或输出的0或1来控制灯亮,我不知道这个DIR是怎么样的。
创世神
2楼-- · 2019-08-17 02:22
void xu1(u8 a1,u8 b1,u8 c1,u8 d1)
{
        A1(a1);B1(b1);C1(c1);D1(d1);
}
void xu2(u8 a2,u8 b2,u8 c2,u8 d2)
{
        A2(a2);B2(b2);C2(c2);D2(d2);
void forward(u16 tt)//7.2度
{
        xu1(1,0,0,0);
        xu2(1,0,0,0);
        delay_us(tt*100);
        xu1(0,1,0,0);
        xu2(0,1,0,0);
        delay_us(tt*100);
        xu1(0,0,1,0);
        xu2(0,0,1,0);               
        delay_us(tt*100);
        xu1(0,0,0,1);
        xu2(0,0,0,1);       
        delay_us(tt*100);       
}
void backwards(u16 tt)
{
        xu1(0,0,0,1);
        xu2(0,0,0,1);
        delay_us(tt*100);
        xu1(0,0,1,0);
        xu2(0,0,1,0);
        delay_us(tt*100);
        xu1(0,1,0,0);
        xu2(0,1,0,0);               
        delay_us(tt*100);
        xu1(1,0,0,0);
        xu2(1,0,0,0);       
        delay_us(tt*100);       
}

void turn_left(u16 tt)   
{
        xu1(0,0,0,0);
        xu2(1,0,0,0);
        delay_us(tt*100);
        xu2(0,1,0,0);
        delay_us(tt*100);
        xu2(0,0,1,0);               
        delay_us(tt*100);
        xu2(0,0,0,1);       
        delay_us(tt*100);       
}
void turn_left_2(u16 tt)
{
        xu1(0,0,0,1);
        xu2(0,0,0,0);
        delay_us(tt*100);
        xu1(0,0,1,0);
        delay_us(tt*100);
        xu1(0,1,0,0);
        delay_us(tt*100);
        xu1(1,0,0,0);
        delay_us(tt*100);       
}
void turn_right(u16 tt)
{
       
        xu1(1,0,0,0);
        xu2(0,0,0,0);
        delay_us(tt*100);
        xu1(0,1,0,0);
        delay_us(tt*100);
        xu1(0,0,1,0);
        delay_us(tt*100);
        xu1(0,0,0,1);
        delay_us(tt*100);       
}
void turn_right_2(u16 tt)
{
        xu1(0,0,0,0);
        xu2(0,0,0,1);
        delay_us(tt*100);
        xu2(0,0,1,0);
        delay_us(tt*100);
        xu2(0,1,0,0);               
        delay_us(tt*100);
        xu2(1,0,0,0);       
        delay_us(tt*100);       
}

/*变量n为旋转角度参数,需根据实际情况调节*/
void turn_left_15(u16 tt)    //左转15度
{
        u8 n;
        for(n=0;n<4;n++)
        {
                xu1(0,0,0,1);
                xu2(1,0,0,0);               
          delay_us(tt*100);               
                xu1(0,0,1,0);
                xu2(0,1,0,0);                       
          delay_us(tt*100);               
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);               
        }
}
void turn_right_15(u16 tt)    //右转15度   目的:使物块放置的更靠中心些
{
        u8 n;
        for(n=0;n<3;n++)   
        {
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(0,0,1,0);
                xu2(0,1,0,0);
          delay_us(tt*100);
                xu1(0,0,0,1);
                xu2(1,0,0,0);       
          delay_us(tt*100);
        }
}
void turn_left_45(u16 tt)    //左转45度
{
        u8 n;
        for(n=0;n<12;n++)
        {
                xu1(0,0,0,1);
                xu2(1,0,0,0);               
          delay_us(tt*100);               
                xu1(0,0,1,0);
                xu2(0,1,0,0);                       
          delay_us(tt*100);               
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);               
        }
}
void turn_right_45(u16 tt)    //左转45度
{
        u8 n;
        for(n=0;n<12;n++)   
        {
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(0,0,1,0);
                xu2(0,1,0,0);
          delay_us(tt*100);
                xu1(0,0,0,1);
                xu2(1,0,0,0);       
          delay_us(tt*100);
        }
}
void turn_left_90(u16 tt)    //左转转90度
{
        u8 n;
        for(n=0;n<29;n++)
        {
                xu1(0,0,0,1);
                xu2(1,0,0,0);               
          delay_us(tt*100);               
                xu1(0,0,1,0);
                xu2(0,1,0,0);                       
          delay_us(tt*100);               
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);       
        }
}
void turn_right_90(u16 tt)    //右转90度
{
        u8 n;
        for(n=0;n<29;n++)
        {
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(0,0,1,0);
                xu2(0,1,0,0);
          delay_us(tt*100);
                xu1(0,0,0,1);
                xu2(1,0,0,0);       
          delay_us(tt*100);
        }
}
void turn_left_135(u16 tt)   //左转135度
{
        u8 n;
        for(n=0;n<41;n++)
        {
                xu1(0,0,0,1);
                xu2(1,0,0,0);               
          delay_us(tt*100);               
                xu1(0,0,1,0);
                xu2(0,1,0,0);                       
          delay_us(tt*100);               
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);               
        }

}
void turn_right_135(u16 tt)   //右转135度
{
        u8 n;
        for(n=0;n<42;n++)
        {
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(0,0,1,0);
                xu2(0,1,0,0);
          delay_us(tt*100);
                xu1(0,0,0,1);
                xu2(1,0,0,0);       
          delay_us(tt*100);
        }

}
void turn_left_180(u16 tt)    //左转180度
{
        u8 n;
        for(n=0;n<56;n++)
        {
                xu1(0,0,0,1);
                xu2(1,0,0,0);               
          delay_us(tt*100);               
                xu1(0,0,1,0);
                xu2(0,1,0,0);                       
          delay_us(tt*100);               
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);       
        }
}


void turn_right_180(u16 tt)    //右转180度
{
        u8 n;
        for(n=0;n<56;n++)
        {
                xu1(1,0,0,0);
                xu2(0,0,0,1);       
          delay_us(tt*100);
                xu1(0,1,0,0);
                xu2(0,0,1,0);       
          delay_us(tt*100);
                xu1(0,0,1,0);
                xu2(0,1,0,0);
          delay_us(tt*100);
                xu1(0,0,0,1);
                xu2(1,0,0,0);       
          delay_us(tt*100);
        }
}
void stop(void)
{
        xu1(0,0,0,0);
        xu2(0,0,0,0);

这是小车的左右两个步进电机的控制程序,(仅供参考),,,要想更直观的观察A  B  C  D四个相的0  1变化  可通过L298N电机驱动板(绿板)上面的四个指示灯来看。
MOMO233
3楼-- · 2019-08-17 06:49
 精彩回答 2  元偷偷看……
我是路人甲
4楼-- · 2019-08-17 06:57
~DIR是按位取反,应该不行。!DIR照理应该可以吧,LED就是这样的
MOMO233
5楼-- · 2019-08-17 08:33
我是路人甲 发表于 2017-7-13 14:28
~DIR是按位取反,应该不行。!DIR照理应该可以吧,LED就是这样的

两个都不行。。。。我用if来判断,进而直接赋值成与之前值相反的逻辑都不行。。。。
不知道那里出了问题

一周热门 更多>