步进电机的一点收获
型号: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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
注意启动频率,不要那么快,不然会跟不上,出现乱颤的情况。
如果没有细分,那么步进电机每接受一个脉冲,就会转动一个步距角。.当我们不细分的时候,假如步进电机是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拍
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/75738264
- 点赞
- 收藏
- 关注作者
评论(0)