skype 发表于 2018-7-18 16:04:57

步进电机细分驱动学习记录

因为项目需要,也是刚接触步进电机,所以对细分的概念也不懂,网上找了些资料,说真的,没有看懂,没办法,那就从最基本的开始学。

第一步,了解电机是怎么驱动的,这简单,资料多也能看懂。


上图就是一样最简单的步进电机驱动,就4拍,第1拍A+(A)通电,第2拍B+ (B)通电,第3拍A- (C)通电,第4拍B- (D)通电,每拍走90度,
这种驱动没人看不明白吧,我们写出来:
ABCD
1000                //第一拍
0100                //第二拍
0010                //第三拍
0001                //第四拍

skype 发表于 2018-7-18 16:28:03

接下来,我们再看看8拍是怎么驱动的,

8拍:
ABCD
1000
1100
0100
0110
0010
0011
0001
1001


从节拍上看出,4拍的第一拍(1000)和第二拍(0100)之间加了一拍(1100),每拍本来走90度角现在成了45度角
4拍:


8拍的第二拍



看样子,在4拍是插入一拍角度就变成45度了,那么我们可否插入N拍来获取更小的角度呢?下面就是我想到的细分方法:
/*
细分方法:

beat 节拍-4拍
fraction 细分数-16细分

基础4拍

ABCD
1000
0100
0010
0001

A和B之间插入16拍,0x00
B和C之间插入16拍 0x10
C和D之间插入16拍 0x20
D和A之间插入16拍 0x30
A和B之间插入16拍,0x40

*/


今天就写到这吧,快下班了,而且贴子的标题不知道对不对,会不会封号。明天有空再写吧

hkjabcd 发表于 2018-7-18 23:27:28

前排就座,听老师讲课啦

fdcnuaa 发表于 2018-7-18 23:37:58

maek学习一下

lnso 发表于 2018-7-19 07:19:36

还有脉冲的驱动芯片,破一下

skype 发表于 2018-7-19 08:55:08


电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,AB相线通上电,电机转了45度角,
可不可以说,AB绕组在相同的电压下做了相同的功?即然只要两相绕组加上电压相等直流就可以让转子向A(A-B)和B (B-A)各转向45度,直
流可以,那么加上脉冲(PWM)直流呢,是不是也有同样效果,下面来测试下:

从上图可以看出,用PWM也行。而且直流改成PWM后,功率变小了,但结果还是一样的。基于以上测试,如果VA = VB的电压,转子转到了
AB绕组中间的角度,如果VA>VB呢?

soos 发表于 2018-7-19 08:59:32

开课啦               

skype 发表于 2018-7-19 09:14:40


A相的驱动PWM占空比大于B相的驱动PWM占空比,转子向A偏移了,VA<VB是不是转会向B偏移呢?

好了,那我知道了,改变AB两相驱动PWM的占空比就能改就转子转动的角度,这就是我做细分的基本理论。

今天就先写到这里吧,因为下面要写的内容先要做个实验,确认了以后再往下写。

mangolu 发表于 2018-7-19 10:39:52

路过学习,教程不错!

skype 发表于 2018-7-19 11:14:58


如果我们把电机转子旋转一周分成4个象限,基础4拍只要一拍就跑完一个象限角度。细分就是在每个象限中划分出N个区域。

所以要细分的话我们必须要在每个象限中插入多个节拍,插入节拍越多,细分数就越大,电机转动的角度就越小。
/*
细分方法:
beat 节拍-4拍
fraction 细分数-16细分
基础4拍
ABCD
1000
0100
0010
0001
A和B之间插入16拍,0x00
B和C之间插入16拍 0x10
C和D之间插入16拍 0x20
D和A之间插入16拍 0x30
A和B之间插入16拍,0x40
*/

#define MAX 16        //在基础4拍的16细分,一周4拍变成64拍,角度每一拍变成了原来的1/16.

#define AQ RA0
#define BQ RA1
#define CQ RA2
#define DQ RC0


//beat节拍,fraction细分分数,
void motor_drive(unsigned char beat, unsigned char fraction)
{
        static unsigned char index;
        switch (beat)       
        {
                case 0:        //1#象限
                        if (index<MAX-fraction)
                                AQ = 1;
                        else
                                AQ = 0;
                       
                        if (index < fraction)
                                BQ = 1;
                        else
                                BQ = 0;

                        if (++index>=MAX)
                                index=0;
                        CQ = 0; DQ = 0;
                break;
                case 1:
                        if (index<MAX-fraction)
                                BQ = 1;
                        else
                                BQ = 0;
                       
                        if (index < fraction)
                                CQ = 1;
                        else
                                CQ = 0;

                        if (++index>=MAX)
                                index=0;
                        AQ = 0; DQ = 0;
                break;
                case 2://2#象限
                        if (index<MAX-fraction)
                                CQ = 1;
                        else
                                CQ = 0;
                       
                        if (index < fraction)
                                DQ = 1;
                        else
                                DQ = 0;

                        if (++index>=MAX)
                                index=0;
                        AQ = 0; BQ = 0;
                break;
                case 3:
                        if (index<MAX-fraction)
                                DQ = 1;
                        else
                                DQ = 0;
                       
                        if (index < fraction)
                                AQ = 1;
                        else
                                AQ = 0;

                        if (++index>=MAX)
                                index=0;
                        BQ = 0; CQ = 0;
                break;
                default:        break;
               
        }
}


//那么我们可以电机的驱动频率周期性的调用motor_drive()函数就可以让电机走步或停止在一定的角度


        p = xf>>4;                        //xf节拍,如16拍,P是象限,x是细分角度对应节拍
        x = xf &0x0f;
        motor_drive(p, x);


上图是网上细出的细分曲线图


下面看下程序运时的PWM波形和对A相滤波后的结果

jufr12315 发表于 2018-7-19 11:19:42

挺好的,突然了解到,感谢分享

sokou 发表于 2018-7-19 11:37:29

还是不太明白。

lnso 发表于 2018-7-19 12:19:48

再讲解一下脉冲型点驱动芯片,给一个脉冲走一步

foric 发表于 2018-7-19 12:53:03

本帖最后由 foric 于 2018-7-19 12:55 编辑

学习了,细分的,五线的做过吗?

skype 发表于 2018-7-19 13:06:04


我是用这种步进电机

gmyu 发表于 2018-7-19 14:24:20

楼主这个是5项单极的,如果按照你的分析,可以把那个蓝色的壳打开,在PCB上把公共的正极刻断。这样两组线圈用万用表不通。就是你想要的了。

gmyu 发表于 2018-7-19 14:25:23

而且这种减速电机你根本看不到走的角度。

et009tw 发表于 2018-7-19 14:34:15

終於了解步進電機細分的動作,謝謝

skype 发表于 2018-7-19 14:50:16

这是16细分运行时AB相线上的波形,只有双道通示波器,所以只能看两组波形。




下两组是测试电机运行视频
https://v.youku.com/v_show/id_XMzczMjM4ODQ2NA==.html?spm=a2h3j.8428770.3416059.1


https://v.youku.com/v_show/id_XMzczMjQyNzEwOA==.html?spm=a2h0j.11185381.listitem_page1.5~A

16细分后电机单步运行角度很小,不仔细看看不出转子在动。
16细分已够我现在项目使用要求,所以对细分不再做深入研究,到此为止!!
{:lol:}

mangolu 发表于 2018-7-19 15:17:42

skype 发表于 2018-7-19 14:50
这是16细分运行时AB相线上的波形,只有双道通示波器,所以只能看两组波形。




LZ是否能打包上传仿真工程和代码?

yaake 发表于 2018-7-19 16:19:32

深入浅出,好文。感谢

xinlege 发表于 2018-7-19 16:30:24

只会用,还没有了解过这么详细,不错不错

ab3504 发表于 2018-7-20 16:21:55

学习了,非常不错。

xian_heping 发表于 2018-8-5 17:35:43

学习了,非常感谢

zkmcu 发表于 2018-8-5 21:05:44

电机转动的原理就是异性相吸同性相斥

sokou 发表于 2018-8-10 08:28:59

细分里是怎么控制电流大小的?也是通过PWM的占空比来调整?

skype 发表于 2018-8-10 10:16:00

这种是软件模拟细分,不支持电流控制。

true_elecom 发表于 2018-11-2 09:36:25

gmyu 发表于 2018-7-19 14:24
楼主这个是5项单极的,如果按照你的分析,可以把那个蓝色的壳打开,在PCB上把公共的正极刻断。这样两组线圈 ...

5相还是4相?

四川李工 发表于 2018-11-2 10:11:14

mark下1!!!!!!!!!!!!!!!!

lb0857 发表于 2018-11-2 10:15:15

通俗易懂 楼主在继续嘛{:lol:}

四川李工 发表于 2018-11-2 10:22:02

楼主这个ABCD建议改成A+B+A-B-   你图上根本没有CD   容易误解

unnormal 发表于 2018-11-2 10:41:50

学习一下{:handshake:}

njhying 发表于 2018-11-2 10:42:30

微芯有应用笔记和源代码。记住,欠的课是一定要补的。

gmyu 发表于 2018-11-2 11:01:29

true_elecom 发表于 2018-11-2 09:36
5相还是4相?

打错字,五线四相。

1785345205 发表于 2018-11-2 13:49:34

写得真好理解详细

atonghua 发表于 2018-11-2 15:53:19

njhying 发表于 2018-11-2 10:42
微芯有应用笔记和源代码。记住,欠的课是一定要补的。

兄弟 麻烦给个链接 谢谢了

huangqi412 发表于 2018-11-2 22:21:37

示波器差评这年头还在用两通道

raywongm78 发表于 2018-11-2 23:35:54

深入浅出 x 2

aishinimi9 发表于 2018-12-5 18:18:54

写得真好,谢谢

wt19891114 发表于 2018-12-6 10:30:43

mark , {:smile:}

wangfan0212 发表于 2018-12-7 19:28:03

厉害,跟着学习

dgdzas 发表于 2019-2-21 11:54:04

njhying 发表于 2018-11-2 10:42
微芯有应用笔记和源代码。记住,欠的课是一定要补的。

哥们可以上传一下吗,没找到呀。

njhying 发表于 2019-2-21 16:22:44

atonghua 发表于 2018-11-2 15:53
兄弟 麻烦给个链接 谢谢了

直接在官网下的应用笔记里找马达控制就行。

lsszk 发表于 2019-2-23 07:37:33

学习了 赞一个

tangpeng 发表于 2019-2-27 08:22:40

学习了,非常感谢

dtdzlujian 发表于 2019-2-27 20:42:04

学习了.感谢LZ

skype 发表于 2019-2-28 10:15:28

有用就好,{:lol:}

wangyj173 发表于 2019-4-30 09:47:32

讲解得通俗易懂啊

xintao 发表于 2019-5-5 20:18:05

通俗易懂,深入浅出,赞一个。

shen-robot 发表于 2019-7-13 21:31:46

你步进电机细分弄出来了吗?

zlq2000 发表于 2019-7-13 23:58:11

好贴留名,用到的时候再看看^_^

skype 发表于 2019-7-18 09:11:48

shen-robot 发表于 2019-7-13 21:31
你步进电机细分弄出来了吗?

关键代码也给出了,目前我已用在发动机油门控制系统中了。

迅得电子 发表于 2019-7-18 09:18:24

收藏备用,步进电机细分驱动

迅得电子 发表于 2019-7-18 11:00:03

大佬能不能解释一下这段代码,index和MAX分别代表什么?其他地方都看懂了,这个代码部分没看懂
void motor_drive(unsigned char beat, unsigned char fraction)
{
      static unsigned char index;
      switch (beat)      
      {
                case 0:      //1#象限
                        if (index<MAX-fraction)
                              AQ = 1;
                        else
                              AQ = 0;
                        
                        if (index < fraction)
                              BQ = 1;
                        else
                              BQ = 0;

                        if (++index>=MAX)
                              index=0;
                        CQ = 0; DQ = 0;
                break;
                case 1:
                        if (index<MAX-fraction)
                              BQ = 1;
                        else
                              BQ = 0;
                        
                        if (index < fraction)
                              CQ = 1;
                        else
                              CQ = 0;

                        if (++index>=MAX)
                              index=0;
                        AQ = 0; DQ = 0;
                break;

笨笨仔 发表于 2019-7-18 11:36:48

讲的不错,是这么回事

yuguoliang 发表于 2019-7-18 12:04:40

学习了,非常不错

BigWolf 发表于 2019-8-31 19:49:40

标记,细细看下。谢楼主

dgdzas 发表于 2019-8-31 20:50:34

先标记一下

xuqingtian 发表于 2019-9-1 17:26:24

讲的真好,多谢了!!!

lhhsea2004 发表于 2019-9-1 18:01:26

终于了解细分过程,谢谢{:smile:}

大豆皮 发表于 2019-11-2 13:13:34

我要仔细的学习学习。

chenfzg 发表于 2021-5-8 12:04:32

       p = xf>>4;                        //xf节拍,如16拍,P是象限,x是细分角度对应节拍   
    x = xf &0x0f;      
motor_drive(p, x);


xf怎改变值,这部分如何调用

fengyunyu 发表于 2021-5-8 12:44:16

谢谢,学习

skype 发表于 2021-5-8 12:45:11

chenfzg 发表于 2021-5-8 12:04
p = xf>>4;                        //xf节拍,如16拍,P是象限,x是细分角度对应节拍   
    x = ...

讲不清楚,你自己去体会,调用很简单。

syzh506 发表于 2021-5-14 22:22:53

正需要这方面的资料,多跟各位学习一下。

linuxoldman 发表于 2022-6-10 17:41:01

用细分的驱动芯片能省力很多。
页: [1]
查看完整版本: 步进电机细分驱动学习记录