zywh 发表于 2011-2-9 12:42:14

发个步进电机的程序,顺便问一下问题。

#define Motor_PORT        P3                //定义步进电机控制端口为P2 如果修改此端口,必须也同时修改初始化端口,(默认为低四位,也可由地下A_Line来控制)
#define A_Line        4                        //A相接端口0
#define B_Line        5                       //B相接端口1
#define C_Line        6                        //C相接端口2
#define D_Line        7                        //D相接端口3

unsigned char code Rotation = {0xE0,0xA0,0xB0,0x90,0xD0,0x50,0x70,0x60};                //步进电机旋转编码表

//----------------------------------------------------------------
//        dir = 1 正转,dir = 0 反转
//        步进电机单步正反转函数
//----------------------------------------------------------------
void Step_Motor(unsigned char dir)                //步进电机单步正反转函数
{
        static unsigned char Motor_Num = 0;                //静态变量步进电机走了几步
        if(dir == 1)                //正转
        {
                if(Motor_Num >= 7)
                        Motor_Num = 0;
                else
                        Motor_Num ++ ;
        }
        else                                        //反转
        {
                if(Motor_Num == 0)
                        Motor_Num = 7;
                else
                        Motor_Num -= 1;
        }
        Motor_PORT =(Motor_PORT & ~((1 << A_Line) | (1 << B_Line) |(1 << C_Line)|(1 << D_Line))) | Rotation ;       //屏蔽ABCD三项以外的端口,并且把编码赋值给步进电机
}



因为P3口接步进电机,同时也接串口1,当步进电机工作的时候,串口1就无法正常工作,
纠其原因,发现问题出现在
        Motor_PORT =(Motor_PORT & ~((1 << A_Line) | (1 << B_Line) |(1 << C_Line)|(1 << D_Line))) | Rotation ;       

把这句替换成下面这个就好了。
        switch(Motor_Num)
        {
                case 0:
                        Step_A = 0;
                        Step_B = 1;
                        Step_C = 1;
                        Step_D = 1;
                        break;
                case 1:
                        Step_A = 0;
                        Step_B = 1;
                        Step_C = 0;
                        Step_D = 1;
                        break;
                case 2:
                        Step_A = 1;
                        Step_B = 1;
                        Step_C = 0;
                        Step_D = 1;
                        break;
                case 3:
                        Step_A = 1;
                        Step_B = 0;
                        Step_C = 0;
                        Step_D = 1;
                        break;
                case 4:
                        Step_A = 1;
                        Step_B = 0;
                        Step_C = 1;
                        Step_D = 1;
                        break;
                case 5:
                        Step_A = 1;
                        Step_B = 0;
                        Step_C = 1;
                        Step_D = 0;
                        break;
                case 6:
                        Step_A = 1;
                        Step_B = 1;
                        Step_C = 1;
                        Step_D = 0;
                        break;
                case 7:
                        Step_A = 0;
                        Step_B = 1;
                        Step_C = 1;
                        Step_D = 0;
                        break;               
        }       


问题:如果用查表法,怎样屏蔽那几个不是接步进电机的接口。

jrcsh 发表于 2011-2-9 13:43:27

Step_A = 1;
Step_B = 1;
Step_C = 0;
Step_D = 1;


................用Px=0x?? 不是更快

zhanglu1990 发表于 2011-2-9 17:46:21

就是写成相位数组了 很简单的

zywh 发表于 2011-2-10 10:11:38

回复【1楼】jrcsh邪恶的小会会
-----------------------------------------------------------------------
俺这个就是数组啊
unsigned char code Rotation = {0xE0,0xA0,0xB0,0x90,0xD0,0x50,0x70,0x60};       //步进电机旋转编码表
然后这个就是px=0x啊
Motor_PORT =(Motor_PORT & ~((1 << A_Line) | (1 << B_Line) |(1 << C_Line)|(1 << D_Line))) | Rotation ;       

但是问题就出现在这一句啊。。。步进电机可以动,但是串口的收发会出现问题。
请问我这句写错了嘛???

xjzxl 发表于 2011-2-10 16:59:53

Aluken 发表于 2011-2-11 23:17:09

学习学习前辈们的经验!!!

winkle 发表于 2011-2-12 11:54:01

发帖子之前建议搜索一下,坛子中这样的问题很多,并且都有高人做了回答;
页: [1]
查看完整版本: 发个步进电机的程序,顺便问一下问题。