步进电机细分驱动学习记录
因为项目需要,也是刚接触步进电机,所以对细分的概念也不懂,网上找了些资料,说真的,没有看懂,没办法,那就从最基本的开始学。第一步,了解电机是怎么驱动的,这简单,资料多也能看懂。
上图就是一样最简单的步进电机驱动,就4拍,第1拍A+(A)通电,第2拍B+ (B)通电,第3拍A- (C)通电,第4拍B- (D)通电,每拍走90度,
这种驱动没人看不明白吧,我们写出来:
ABCD
1000 //第一拍
0100 //第二拍
0010 //第三拍
0001 //第四拍 接下来,我们再看看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
*/
今天就写到这吧,快下班了,而且贴子的标题不知道对不对,会不会封号。明天有空再写吧
前排就座,听老师讲课啦 maek学习一下 还有脉冲的驱动芯片,破一下
电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,AB相线通上电,电机转了45度角,
可不可以说,AB绕组在相同的电压下做了相同的功?即然只要两相绕组加上电压相等直流就可以让转子向A(A-B)和B (B-A)各转向45度,直
流可以,那么加上脉冲(PWM)直流呢,是不是也有同样效果,下面来测试下:
从上图可以看出,用PWM也行。而且直流改成PWM后,功率变小了,但结果还是一样的。基于以上测试,如果VA = VB的电压,转子转到了
AB绕组中间的角度,如果VA>VB呢? 开课啦
A相的驱动PWM占空比大于B相的驱动PWM占空比,转子向A偏移了,VA<VB是不是转会向B偏移呢?
好了,那我知道了,改变AB两相驱动PWM的占空比就能改就转子转动的角度,这就是我做细分的基本理论。
今天就先写到这里吧,因为下面要写的内容先要做个实验,确认了以后再往下写。 路过学习,教程不错!
如果我们把电机转子旋转一周分成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相滤波后的结果
挺好的,突然了解到,感谢分享 还是不太明白。 再讲解一下脉冲型点驱动芯片,给一个脉冲走一步 本帖最后由 foric 于 2018-7-19 12:55 编辑
学习了,细分的,五线的做过吗?
我是用这种步进电机 楼主这个是5项单极的,如果按照你的分析,可以把那个蓝色的壳打开,在PCB上把公共的正极刻断。这样两组线圈用万用表不通。就是你想要的了。 而且这种减速电机你根本看不到走的角度。 終於了解步進電機細分的動作,謝謝 这是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:}
skype 发表于 2018-7-19 14:50
这是16细分运行时AB相线上的波形,只有双道通示波器,所以只能看两组波形。
LZ是否能打包上传仿真工程和代码? 深入浅出,好文。感谢 只会用,还没有了解过这么详细,不错不错 学习了,非常不错。 学习了,非常感谢 电机转动的原理就是异性相吸同性相斥 细分里是怎么控制电流大小的?也是通过PWM的占空比来调整? 这种是软件模拟细分,不支持电流控制。 gmyu 发表于 2018-7-19 14:24
楼主这个是5项单极的,如果按照你的分析,可以把那个蓝色的壳打开,在PCB上把公共的正极刻断。这样两组线圈 ...
5相还是4相? mark下1!!!!!!!!!!!!!!!! 通俗易懂 楼主在继续嘛{:lol:} 楼主这个ABCD建议改成A+B+A-B- 你图上根本没有CD 容易误解 学习一下{:handshake:} 微芯有应用笔记和源代码。记住,欠的课是一定要补的。 true_elecom 发表于 2018-11-2 09:36
5相还是4相?
打错字,五线四相。 写得真好理解详细 njhying 发表于 2018-11-2 10:42
微芯有应用笔记和源代码。记住,欠的课是一定要补的。
兄弟 麻烦给个链接 谢谢了 示波器差评这年头还在用两通道 深入浅出 x 2 写得真好,谢谢 mark , {:smile:} 厉害,跟着学习 njhying 发表于 2018-11-2 10:42
微芯有应用笔记和源代码。记住,欠的课是一定要补的。
哥们可以上传一下吗,没找到呀。 atonghua 发表于 2018-11-2 15:53
兄弟 麻烦给个链接 谢谢了
直接在官网下的应用笔记里找马达控制就行。 学习了 赞一个 学习了,非常感谢 学习了.感谢LZ 有用就好,{:lol:} 讲解得通俗易懂啊 通俗易懂,深入浅出,赞一个。 你步进电机细分弄出来了吗? 好贴留名,用到的时候再看看^_^ shen-robot 发表于 2019-7-13 21:31
你步进电机细分弄出来了吗?
关键代码也给出了,目前我已用在发动机油门控制系统中了。 收藏备用,步进电机细分驱动 大佬能不能解释一下这段代码,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; 讲的不错,是这么回事 学习了,非常不错 标记,细细看下。谢楼主 先标记一下 讲的真好,多谢了!!! 终于了解细分过程,谢谢{:smile:} 我要仔细的学习学习。 p = xf>>4; //xf节拍,如16拍,P是象限,x是细分角度对应节拍
x = xf &0x0f;
motor_drive(p, x);
xf怎改变值,这部分如何调用 谢谢,学习 chenfzg 发表于 2021-5-8 12:04
p = xf>>4; //xf节拍,如16拍,P是象限,x是细分角度对应节拍
x = ...
讲不清楚,你自己去体会,调用很简单。
正需要这方面的资料,多跟各位学习一下。 用细分的驱动芯片能省力很多。
页:
[1]