型号:17HD40007-22B 步进电机
两相四拍,步距角为1.8°
最终代码:
#include <reg52.h>
sbit LeftA1 = P1^0;
sbit LeftA2 = P1^1;
sbit LeftB1 = P1^2;
sbit LeftB2 = P1^3;
sbit EnLeft = P2^3;
sbit RightA1 = P1^4;
sbit RightA2 = P1^5;
sbit RightB1 = P1^6;
sbit RightB2 = P1^7;
sbit EnRight = P2^4;
unsigned char T0RH;
unsigned char T0RL;
signed long LeftBeats = 0;
signed long RightBeats = 0;
void ConfigTimer0(unsigned int ms);
void StartLeftMotor(signed long angle);
void StartRightMotor(signed long angle);
unsigned char code BeatCode[8] = {//不同的引脚驱动代码不一样
0xE,0xA,0xB,0x9,0xD,0x5,0x7,0x6
};
void main()
{
EA = 1;
EnLeft = 0;
EnRight = 0;
ConfigTimer0(3);//此值越大,转的越慢
StartLeftMotor(360*25);//调整转的角度
StartRightMotor(360*25);
while (1);
}
void StartRightMotor(signed long angle)
{
EnRight = 1;
EA = 0;
RightBeats = (angle*400)/360;
EA = 1;
}
void StartLeftMotor(signed long angle)
{
EnLeft = 1;
EA = 0;
LeftBeats = (angle*400)/360;
EA = 1;
}
void LeftMotor()
{
unsigned char tmp;
static unsigned char index = 0;
if(LeftBeats != 0)
{
if(LeftBeats > 0)
{
index++;
index = index & 0x07;
LeftBeats--;
}
else
{
index--;
index = index & 0x07;
LeftBeats++;
}
tmp = P1;
tmp = tmp & 0xF0;
tmp = tmp | BeatCode[index];
P1 = tmp;
}
else
{
P1 = P1 | 0x0F;
}
}
void RightMotor()
{
unsigned char tmp;
static unsigned char index = 0;
if(RightBeats != 0)
{
if(RightBeats > 0)
{
index--;
index = index & 0x07;
RightBeats--;
}
else
{
index++;
index = index &0x07;
RightBeats++;
}
tmp = P1;
tmp &= 0x0F;
tmp |= (BeatCode[index]<<4);
P1 = tmp;
}
else
{
P1 = P1 | 0xF0;
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 12000000/12;
tmp = (tmp * ms)/1000;
tmp = 65536 - tmp;
tmp = tmp + 2;
T0RH = (unsigned char)(tmp >> 8);
T0RL = (unsigned char)tmp;
TH0 = T0RH;
TL0 = T0RL;
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 1;
TR0 = 1;
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
LeftMotor();
RightMotor();
}
注意启动频率,不要那么快,不然会跟不上,出现乱颤的情况。
如果没有细分,那么步进电机每接受一个脉冲,就会转动一个步距角。.当我们不细分的时候,假如步进电机是1.8度的话,那就是二百个脉冲每转360度,二个细分就是四百个,总之就是再次细分的意思,精度更高
很明显,在此处我是进行了细分。变成了二相八拍,步距角更加精确变为0.9
附一张关于步进参数图:
驱动数组书写原理:
对比教程28BYJ
常见的5线4相的步进电机 24BYJ48
因为24BYJ48 步进电机是自带 1/64 减速比的步进电机,也就是内部转64圈外部齿轮转一圈,所以步距角相对别的步进电机而言,更加精确步距角:5.625 / 64 = 0.087度 (也就是说理论上,你给一个脉冲,电机外部轴转动0.087度) 减速比 :1/64
步进电机的 扭矩 和 其驱动方式 驱动频率 输入电压 有着直接的关系,以28BYJ48为例
输入电压(V) 频率(HZ) 转矩(gf.cm) 5 100
= 250 12 100 >=500 驱动方式:四相八拍驱动
一个电机你所采用的励磁方式不同,你所得到的步进角也是不一样的,参数上所说的步进角,表示的是用四相八拍这种励磁方式的所能达到的最大精度。
28BYJ有减速比1:64,也就是里面转64圈,外面转一圈。而里面转一圈需要64节拍,转64圈需要4096拍。
而由于制造误差实际大概为4076拍