步进电机
学习交流群——126500542(验证信息:千寻琥珀心)
在这里介绍一下如何用51单片机驱动步进电机。
本例所使用的步进电机为四项驱动,驱动电压为12V,锯齿角(为什么叫锯齿叫而不叫步进角,我也不知道这样解释是否正确,但是根据步进角计算公式所得的结果将7.5理解为锯齿叫会更好些,也在网上搜了不少资料,说是步进角的较多,但都是直接给出的,而未作出计算,不过也有是将其作为锯齿角的,并且结合书上的内容,在此就将此作为锯齿角理解,那何谓步进角,下面公式将给出)为7.5度。
(也就是说锯齿之间的单位角度),不进一圈总共需要360度,故有48个锯齿。
在此对电路图部分不再给出,具体引脚连接接下来给出。
本例所使用的电机驱动芯片为达林顿驱动器(ULN2003),通过P1.0~P1.3分别接通步进电机的驱动线圈来控制步进电机的运转。
注意如果直接使用单片机通过驱动芯片驱动电机,力矩可能不够大,效果不是很好,因为ULN2003的驱动电压为12V,而单片机系统电压为5V,故请读者注意此点,在设计电路时,另施电压。
步进电机要想正常工作,必须有驱动信号,转动的速度与驱动信号的频率是成正比的。
(实例中将会给出并予以说明)接下来我们看看对于电机驱动中的信号的产生。
本例中采用的步进电机为四项,三项驱动和四项驱动原理上
是一样的。
假设步进电机的四个项为:A、B、C、D。
它的拍数可由读者任意设定(即步进节奏)。
再继续下面的内容时,我们现在此给出一个计算步进电机的公式:Qs=360/NZr,其中N=McC 为运行的拍数,McC为控制绕组项数,C为状态系数,当采用单双本项拍数时,C=1,当采用单双本项一倍拍数时,C=2。
(此处说的本项拍数,如三项为单三拍,双三拍。
本项一倍拍数为单六拍,简言之,三拍为1.六拍为2对于四项则四拍为1,8拍为2(说的有些玄乎,手中板砖还望留情)),Zr为转子齿数,先来看看单四拍,即A→B→C→D→A.因为上述已经给出了锯齿数,此例C=1,所以Qs=360/(4*1*48)=1.875°。
故此电机的步进角为1.875°(既步与步之间的角度),因为行进是和脉冲有关的,一个脉冲行进一步,那么行进一圈,所需脉冲数为:360/1.875=192个脉冲。
同时我们如果控制这些脉冲的频率就可以直接控制步进电机的运转速度了。
继续我们的单四拍,运行方向A→B→C→D →A。
(假设为正转)则在程序中对应的操作执行码为:(硬件连接时P1口的高四位不用全置1,此处只需用到低四位) P1.3 P1.2 P1.1 P1.0
D C B A (对应4个线圈)
1 1 1 0 0xfe (根据外部链接电路定,也可以是0001,此处采用低电平导通,导通A项线圈)
1 1 0 1 0xfd (导通B项线圈)
1 0 1 1 0xfb (导通C项线圈)
0 1 1 1 0xf7 (导通D项线圈)
如上表所示对应A→B→C→D→A的运行方向的码表为0xfe,0xfd,0xfb,0xf7,0xfe(若反向,只需将此表倒置过来就行)对于四项四拍的其他情况在此就不做多解了,基本上是一样的,对于四项8拍的,在此讲解一个单双8拍的。
首先我们来计算下步进角:360/4*2*48=0.9375°。
正好是上面的4拍的1/2,这说明,运行拍数增加,步进角减小。
好,假设有以下运行方向A→AB→B→BC→C→CD→D→DA→A
则依照上面顺序
D C B A
1 1 1 0 导通A
1 1 0 0 导通AB
1 1 0 1 导通B
1 0 0 1 导通BC
1 0 1 1 导通C
0 0 1 1 导通CD
0 1 1 1 导通D
0 1 1 0 导通DA
以上码的16进制数像上面的4拍一样,读者自己整合下。
以下程序单双8拍:
#include<reg52.h>
unsigned char code
bujin[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//正转void delay(unsigned int t);
//步进电机驱动
void bujinqudong()
{
unsigned char i;
for (i=0; i<8; i++)
{
P1 = bujin[i];
delay(5); //调节转速(延时的长短可直接调节电机运行速度)
}
}
void delay(unsigned int t)//此处延时可根据实际要求自行整定{
unsigned int m;
while(t--)
{
for(m=0; m<150; m++)
{ }
}
}
main()
{
while(1) {
bujinqudong();
}
}。