找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2203|回复: 2
收起左侧

求大神帮我看看我的52单片机控制四相五线步进电机的启停程序为什么不行。球球

[复制链接]
ID:268462 发表于 2017-12-28 17:15 | 显示全部楼层 |阅读模式
P3口控制的矩阵键盘,P1口接的电机驱动模块,加减速用的中断,正反转也可以,问题是我的启动停止不会写。。。。
#include <reg52.h>
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed=10;
unsigned char run=0;

bit Flag;
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
}
}
/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_K3(void) interrupt 0            //减速
{

        if(K3==0)
        {
           DelayMs(10);//去抖动程序,防止按键抖动造成错误
           if(K3==0)
           while(K3==0);//等待按键释放
                {
             Speed++;   
            }
        }
}
void ISR_K4(void) interrupt 2          //加速
{
        if(K4==0)
        {
           DelayMs(10) ;
           if(K4==0)
           while(K4==0);
                {
                           Speed--;
                }
        }
}
/*-------------------程序调用--------------------------*/
void zhengfan()
{
        if(K2==0)
        DelayMs(10);
        if(K2==0)
        Flag=!Flag;
        while(!K2);
}
void run_stop()                                 //run%2==1 启动   run%2==0 停止
{
        if(K1==0)
        DelayMs(5);
        if(K1==0)
        while(K1==0);
                run++;
       
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
unsigned int i=512;//旋转一周时间

EA=1;          //全局中断开
EX0=1;
EX1=1;         //外部中断0,2开
IT0=1;         //1表示边沿触发
P3=0xcf;                // 1100         1111

while(1)
{
        run_stop();
        if(run%2==1)
        {
                                        Coil_OFF
                                        while((i--)&&(Flag))  //正向
                                        {
                                                run_stop();  
                                                zhengfan();
                                       

                                                Coil_A1      
                                                DelayMs(Speed);
                                                Coil_AB1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
                                                DelayMs(Speed);         //改变这个参数可以调整电机转速 ,数字越小,转速越大,力矩越小                       
                                                Coil_B1      
                                                DelayMs(Speed);
                                                Coil_BC1
                                                DelayMs(Speed);
                                                Coil_C1      
                                                DelayMs(Speed);
                                                Coil_CD1
                                                DelayMs(Speed);
                                                Coil_D1      
                                                DelayMs(Speed);
                                                Coil_DA1
                                                DelayMs(Speed);
                                       
                                               
               
                                        }


                                        Coil_OFF
                       
                                        i=512;
                                        while((i--)&&(!Flag))//反向
                                        {
                                            run_stop();  
                                                zhengfan();


                                                Coil_A1      
                                                DelayMs(Speed);
                                                Coil_DA1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
                                                DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                                                                //数字越小,转速越大,力矩越小
                                                 Coil_D1      
                                                DelayMs(Speed);
                                                Coil_CD1
                                                DelayMs(Speed);
                                                 Coil_C1      
                                                DelayMs(Speed);
                                                Coil_BC1
                                                DelayMs(Speed);
                                                 Coil_B1      
                                                DelayMs(Speed);
                                                Coil_AB1
                                                DelayMs(Speed);
                                               
                                       
                                        }


        }

}
}
回复

使用道具 举报

ID:164602 发表于 2017-12-29 09:35 | 显示全部楼层
启停非常简单啊。
只要想办法通过按键,将脉冲信号停掉,电机就停了。
恢复脉冲信号,电机就转动。
回复

使用道具 举报

ID:78322 发表于 2017-12-29 11:20 | 显示全部楼层
看到这个程序我无从评价,一次循环竟然能延时85ms以上,MCU 99.9%的时间再做延时处理,代码量有50%是延时,这样程序走起来真累,而且按键肯定不会灵敏,好好找个例子学下怎么处理延时。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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