找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2454|回复: 18
打印 上一主题 下一主题
收起左侧

51单片机控制步进电机的问题

  [复制链接]
跳转到指定楼层
楼主
ID:797796 发表于 2020-7-25 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
150黑币
关于用51单片机控制步进电机速度和直线位移的问题,要求用定时器产生脉冲,还要先设置好运动的速度再运行,新手没用单片机控制过电机,按照以下要求应该怎么去实现呢?

电机.PNG (101.95 KB, 下载次数: 41)

电机.PNG

步进.PNG (80.72 KB, 下载次数: 51)

步进.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:789121 发表于 2020-7-26 01:13 | 只看该作者
所以是你要让别人帮你做这个项目么?
回复

使用道具 举报

板凳
ID:797796 发表于 2020-7-26 07:36 | 只看该作者
不要黑 发表于 2020-7-26 01:13
所以是你要让别人帮你做这个项目么?

提供下思路
回复

使用道具 举报

地板
ID:797796 发表于 2020-7-26 07:56 | 只看该作者
不要黑 发表于 2020-7-26 01:13
所以是你要让别人帮你做这个项目么?

主要是不知道怎么控制电机转速固定,比如每秒转2.5圈
回复

使用道具 举报

5#
ID:797796 发表于 2020-7-26 09:20 | 只看该作者

我写的这个程序电机转不起来,大佬们帮我看下哪里出问题了好吗
#include <reg51.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uint unsigned int
#define uchar unsigned char
uchar tab[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
sbit OUT=P2^2;    //定义OUT输出端口
unsigned char count,i;
void Init_Timer0(void)
{
        TMOD |= 0x01;                      //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
        TH0=(65535-12000)/256;                 
        TL0=(65535-12000)*256;
        EA=1;                         //总中断打开
        ET0=1;                        //定时器中断打开
        TR0=1;                        //定时器开关打开
}
main()
{
        Init_Timer0();
        OUT=0;
        while(1)
        {
                ;
        }
}

void Timer0_isr(void) interrupt 1
{

        TH0=(65535-20000)/256;                  //重新赋值 12M晶振计算,指令周期1uS,
        TL0=(65535-20000)*256;         
        count++;
        if(count==20)
        {
        count=0;
        OUT=~OUT;
                {i++;if(i>7)i=0;P0=tab;}                     //用示波器可看到方波输出
        }
}
回复

使用道具 举报

6#
ID:782419 发表于 2020-7-26 10:09 | 只看该作者
我觉得你的P0可能是步进电机的驱动端口吧,所以P0=tab[i];你是不是少写了什么?
如果步进电机真的还是不能动,你可以看下步进电机的工作参数,是不是频率什么的不符合电机的要求。
回复

使用道具 举报

7#
ID:789121 发表于 2020-7-26 11:32 | 只看该作者
Irvingzong 发表于 2020-7-26 09:20
我写的这个程序电机转不起来,大佬们帮我看下哪里出问题了好吗
#include //包含头文件,一般情况不需要 ...

建议先看一下步进电机的驱动方式 接线 原理
回复

使用道具 举报

8#
ID:808485 发表于 2020-7-27 18:33 | 只看该作者
我看不见你上传的图片,但根据程序可以推断一二:
1。单片机P0^0到P0^3对应步进电机的4根线(中间经过功率放大)
2。单片机P2^2应该是接了个LED之类的东西,用来指示电机运转状态,闪烁表示在转


程序分析:
你仔细看这个 tab[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
共8个数,把数据用二进制表示:
0001
0011
0010
0110
0100
1100
1000
1001
这4位二进制数,从P0^0到P0^3送出到电机的4根线:我们假设是 A B C D 四根线。




先讲解一下二相四线步进电机工作原理:
我画一个示意图,@@@@表示线圈,AB是一伙,CD是一伙,NNN+SSS是磁铁:


DBCA=0001,电流从A流向B,磁铁N极指向1号线圈方向
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |       N       | |
      | |       N       | |
      @ |       +       | @
      2 |       S       | 4
      @ |       S       | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0011,电流从A流向B,但同时C到D也有电流,这时磁铁N极同时被1号2号线圈吸引,只好处于中间位置
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |   N           | |
      | |     N         | |
      @ |       +       | @
      2 |         S     | 4
      @ |           S   | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0010,电流从C流向D,磁铁N极指向2号线圈
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |               | |
      | |               | |
      @ |               | @
      2 | NNNN  +  SSSS | 4
      @ |               | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0110,电流从C流向D,同时B流向A,磁铁N极同时被2号3号线圈吸引
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |           S   | |
      | |         S     | |
      @ |       +       | @
      2 |     N         | 4
      @ |   N           | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0100,电流从B流向A,磁铁N极指向3号线圈
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |       S       | |
      | |       S       | |
      @ |       +       | @
      2 |       N       | 4
      @ |       N       | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+


看出规律了吧?就这样继续转下去,转一圈,刚好共8个方向,刚好对应 tab[]里面8个数。
如果上面的示意图明白了,那让电机反转,只要从最后一张图往上看起就好了,在程序中更爽,++变--搞定。


你的程序该有的都有了,看得出来,是从别处搬来的,只是tab抄漏了个[ i]呵呵,别生气。[ i]
程序只有一处错误:
{i++;if(i>7)i=0;P0=tab[ i];}                     //用示波器可看到方波输出
回复

使用道具 举报

9#
ID:808485 发表于 2020-7-27 19:23 | 只看该作者
网站设计的不够好,回帖字体无效。试试图片吧。


另外来个附加题,如果P2^2不是接LED,那可能是做什么的?
答:真要那样的话,那这方案设计者,是个合格的电子工程师。
1。众所周知,步进电机走的时候,电能转换为机械能出去了,但停的时候呢?上面那个tab[]表,只有8个数,没有0000的存在,就是说,电机会停到其中一个位置,线圈一直通着电,没有机械能输出,那电能就全部转化为热能了,电机变烧鸡。
2。解决上述问题,有几个技术层次:
1).停机时,输出全0000或者全1111,就没电流消耗了
2).以上考虑不周,有时电机停车时需要有一个保持力矩,不能断电,但这时仍有两种选择,停车在两相线圈都通电状态,力大发热也大,停在一相线圈通电状态发热小,可以看需要选择。
3).进阶的,当电机再次启动时,由静止到运动,需要克服一个额外的静摩擦力,这时需要更大的力,也就是双相驱动,所以程序设计中,就需要在上次停车时,让电机停在单相通电状态。因为电机转动是一二一二一二的顺序,这样就可以实现用二启动了。
4).继续进阶,如果程序员不懂电子,不懂电机,是个新手,做为硬件工程师怎么做?有办法,加个单稳电路,像看门狗一样,看着电机,让程序员在电机程序里面喂狗,一旦程序死机了,跑飞了,进断点了,刷固件了的时候,硬件看门狗切断电机电源,防止电机烧毁。单稳电路没多复杂,一个“通交隔直”的电容接个三极管就OK了。
这也就是P2^2的另一种用途猜想。

回复

使用道具 举报

10#
ID:801878 发表于 2020-7-28 09:59 | 只看该作者
PWN控制,程序里面可以设置speed
回复

使用道具 举报

11#
ID:808700 发表于 2020-7-28 10:08 | 只看该作者
对一下手册,
回复

使用道具 举报

12#
ID:797796 发表于 2020-7-28 10:25 | 只看该作者
gbchang 发表于 2020-7-27 19:23
网站设计的不够好,回帖字体无效。试试图片吧。

非常感谢大佬的耐心解答!我能够理解了基本原理,只是还有一个问题是我只需要简单实现这个二相电机以10mm/s的线速度运行,也就是每秒转2.5圈,而电机的步距角是0.9度,所以我的想法是每400ms定时一次转一圈,可我仿真时把电机设为0.9度之后发现电机只在小幅度范围转动,几乎不动,不知道是不是定时的方式不对呢?程序如下,希望大佬能帮忙看下,十分感谢!
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar tab[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};   
unsigned char count,i;
void Init_Timer0(void)
{
        TMOD |= 0x01;                                         
        TH0=(65535-20000)/256;         
        TL0=(65535-20000)%256;
        EA=1;                         //总中断打开
        ET0=1;                        //定时器中断打开
        TR0=1;                        //定时器开关打开
}
main()
{
        Init_Timer0();
        while(1)
        {
                ;
        }
}

void Timer0_isr(void) interrupt 1
{

        TH0=(65535-20000)/256;                 
        TL0=(65535-20000)%256;            
        count++;
        if(count==20)
        {
        count=0;
                {i++;if(i>7)i=0;P0=tab;}
        }
}
回复

使用道具 举报

13#
ID:797796 发表于 2020-7-28 10:27 | 只看该作者
图片如下

电机.PNG (63.89 KB, 下载次数: 42)

电机.PNG
回复

使用道具 举报

14#
ID:797796 发表于 2020-7-28 15:16 | 只看该作者
Irvingzong 发表于 2020-7-28 10:25
非常感谢大佬的耐心解答!我能够理解了基本原理,只是还有一个问题是我只需要简单实现这个二相电机以10mm ...

有的,只是复制不上来,现在电机能转了,主要是0.9步距角转的很慢,不能实现每秒2.5圈,但修改定时器时长又导致失步,应该怎么修改呢?
回复

使用道具 举报

15#
ID:808485 发表于 2020-7-28 16:31 | 只看该作者
Irvingzong 发表于 2020-7-28 10:25
非常感谢大佬的耐心解答!我能够理解了基本原理,只是还有一个问题是我只需要简单实现这个二相电机以10mm ...

。。。,也就是每秒转2.5圈,而电机的步距角是0.9度,所以我的想法是每400ms定时一次转一圈,。。。

进一次中断只转一步,转一步是0.9度。

如果要每秒转2.5圈,就是 2.5圈*360度=900度,
900度/0.9度每步 = 1000步,
所以,你需要每秒中断1000次,刚好是 1ms 一次中断

另外你的源码可能由于字体等原因,在网站显示不正常,我重新抄一遍给你:
count++;
if(count == 20)
{
    count = 0;
    P0 = tab[i++];
    i &= 0x07;
}
回复

使用道具 举报

16#
ID:750684 发表于 2020-9-7 08:26 | 只看该作者
参考手册资料
回复

使用道具 举报

17#
ID:106821 发表于 2020-9-15 14:44 | 只看该作者
电机转速控制取决于定时器产生的脉冲
回复

使用道具 举报

18#
ID:737842 发表于 2020-9-16 11:29 | 只看该作者
脉冲的频率控制速度,脉冲的数量控制位移
回复

使用道具 举报

19#
ID:276685 发表于 2020-9-16 20:34 | 只看该作者
51黑论坛_s型加减速.rar (1.97 MB, 下载次数: 6)
附录资料.pdf (152.63 KB, 下载次数: 7)

希望这些可以帮到你
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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