搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2013-10-27 12:01:51 | 显示全部楼层 |阅读模式
以下能驱动两相四线步进电机正转反转

按键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();
                        }
                }
        }
}

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

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

出0入0汤圆

发表于 2013-10-27 12:26:34 来自手机 | 显示全部楼层
加个中断试试

出0入0汤圆

 楼主| 发表于 2013-10-27 12:32:00 | 显示全部楼层
znxsjay 发表于 2013-10-27 12:26
加个中断试试

我编程是小白啊

出0入0汤圆

发表于 2013-10-27 15:04:06 | 显示全部楼层
找个定时器中断的例子,然后在中断内取反一个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) 时,再切换方向、清零变量

不明白只能是先看基础资料

出0入0汤圆

 楼主| 发表于 2013-10-28 11:09:51 | 显示全部楼层
rifjft 发表于 2013-10-27 15:04
找个定时器中断的例子,然后在中断内取反一个IO的电平, 像 CP = !CP;   再在中断放置一个变量计算脉 ...

这样就更复杂了,我看是理解不了了

出0入0汤圆

发表于 2013-10-28 14:42:47 | 显示全部楼层
      用单片机控制步进电机有些麻烦,很多时候理论值是这样的,但实际中因为干扰,负载过重等原因会出现丢步等现象,实际发出的脉冲不够,转不到位,这就要需要想办法去补偿,过多会走过头,过少又会不到位,非常头痛,现自己也在不断摸索学习中.

出0入0汤圆

发表于 2013-10-29 18:07:13 | 显示全部楼层
简单点的   用按键标志位

        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;                 

出0入0汤圆

 楼主| 发表于 2013-10-30 08:34:00 | 显示全部楼层
本帖最后由 luozyou 于 2013-10-30 08:41 编辑

谢谢大家的热情帮助 已经搞定了,原来可以这么用,现在把我写的贴出来请大家优化优化,现在都能正常使用了。

双键控制正反转且维持1秒左右:
#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){   
        int j=80;         //持续时间改目前我的板上大概一秒钟足够了
        A1=0;
        B1=0;
        EN=0;
        while(1) {
                if(Key1==0){
                        D_MS();
                if(Key1==0){
                {
                        for(;j>0;j--)           
                                  LLM();
                                if(j==0)
                                j=80;
                        else
                                {
                         j=j--;       
                         }
                        }
                        }
                         }
                                 if(Key2==0){
                        D_MS();
                if(Key2==0){
                        {
                        for(;j>0;j--)           
                        RRM();
                        if(j==0)
                        j=80;
                                else
                                {
                         j--;       
                         }
                        }
                        }
                         }
                }
                 }

下面的是单键控制正反转的按一下正转 再按一下反转

#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){   
        int j=80,count=0;         ///持续循环及按键计数
        A1=0;
        B1=0;
        EN=0;
        while(1) {
                if(Key1==0){
                        D_MS();
                if(Key1==0){
                        count = (count+1)%2;
                        switch(count)
                        {
                        case 0:;
                        {
                        for(;j>0;j--)           
                        RRM();
                        if(j==0)
                        j=80;
                                else
                                {
                         j--;       
                         }
                        }
       
                        break;
                        case 1:
                        {
                        for(;j>0;j--)           
                                  LLM();
                                if(j==0)
                                j=80;
                        else
                                {
                         j=j--;       
                         }
                        }
                        break;
                        count=0;
                       
                } }
        }  }}

现在暂时没有按键互锁,大家再支支招帮忙出出主意

出0入0汤圆

发表于 2013-10-30 08:44:58 | 显示全部楼层
额  楼主你的程序都写出来了加个中断也不难啊

或者你就一直死循环检查按键,检查到了就开始转动并且转动i次。。。。

出0入0汤圆

 楼主| 发表于 2013-10-30 09:58:15 | 显示全部楼层
曾家0762 发表于 2013-10-29 18:07
简单点的   用按键标志位

        if(Key1==0)

我后写的思路跟你的是一样的了,只是表达形式不一样感觉你这个比我的简洁得多,借鉴一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 17:17

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

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