搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 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[8] = {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 [Motor_Num];         //屏蔽ABCD三项以外的端口,并且把编码赋值给步进电机
}



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

把这句替换成下面这个就好了。
        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;               
        }       


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-2-9 13:43:27 | 显示全部楼层
Step_A = 1;
Step_B = 1;
Step_C = 0;
Step_D = 1;


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

出0入0汤圆

发表于 2011-2-9 17:46:21 | 显示全部楼层
就是写成相位数组了 很简单的

出0入0汤圆

 楼主| 发表于 2011-2-10 10:11:38 | 显示全部楼层
回复【1楼】jrcsh  邪恶的小会会
-----------------------------------------------------------------------
俺这个就是数组啊
unsigned char code Rotation[8] = {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 [Motor_Num];       

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

出0入0汤圆

发表于 2011-2-10 16:59:53 | 显示全部楼层

出0入0汤圆

发表于 2011-2-11 23:17:09 | 显示全部楼层
学习学习前辈们的经验!!!

出0入0汤圆

发表于 2011-2-12 11:54:01 | 显示全部楼层
发帖子之前建议搜索一下,坛子中这样的问题很多,并且都有高人做了回答;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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