最近好多朋友给我发私信,说他们导师给他们布置了四线制步进电机控制的设计,问我能不能写一篇类似的文章。今天刚好有点时间,大家一起探讨一下。想了解步进电机的控制方式,首先要
最近好多朋友给我发私信,说他们导师给他们布置了四线制步进电机控制的设计,问我能不能写一篇类似的文章。今天刚好有点时间,大家一起探讨一下。
想了解步进电机的控制方式,首先要了解它的接线方式和工作原理。
步进电机的结构和工作原理:
1.步进电机是将电脉冲信号转换成角位移或线位移的开环控制元件。在不过载的情况下,电机的转速和停止位置只取决于控制脉冲信号的频率和脉冲数。
2.脉冲越多,电机旋转的角度越大。
3.脉冲频率越高,电机转速越快,但不能超过最高频率,否则电机转矩会迅速下降,电机不转。根据扭矩产生的原理,可分为:
(1)反作用式:转子无绕组,励磁的定子绕组产生反作用转矩,实现步进运行。
(2)励磁型:定子和转子都有励磁绕组(或转子用永磁钢)。通过电磁转矩实现的步进运行可分为:
(1)伺服型:输出扭矩只能驱动百分之几到十分之几(N.m)的小负载,必须配合液压扭矩放大器才能驱动机床工作台等大负载。
(2)动力型:输出扭矩在5~50 N.m以上,可直接驱动机床工作台等大型负载。根据定子的数量,可分为:
(1)单定子型(2)双定子型(3)三定子型(4)多定子型可分为:
(1)径向分布:电机各相按圆周依次排列。
步进电机与驱动板的连接方式:
鉴于时间关系,我用仿真软件做了一个单片机四线制步进电机驱动项目,供大家参考。希望你看完之后有所收获。
软件程序功能:按下SW1时,步进电机正转,按下SW2时,步进电机反转,可根据源代码任意调整每个脉冲的转速和旋转角。
以下是模拟图:
程序参考源代码如下:经过实际验证,软硬件可以实现设计功能,实验成功。程序参考源代码如下:经过实际验证,软硬件都能实现设计功能,实验成功。
/C语言程序:/
# include & ltreg52.h & gt//
#定义uchar无符号字符
#定义uint无符号整数
uchar table _ begin
uint麦冲;//脉冲
乌恰尔·转苏;//旋转速度
乌恰尔旗;//方向
sbit key_fuwei=p3^0;//重置键
sbit key_z=p3^1;//前进键
sbit key_f=p3^2;//反向键
sbit key_jia=p3^3;//快捷键
sbit key_jian=p3^6;//减速键
sbit a1=p2^0;
sbit a2=p2^1;
sbit a3=p2^2;
sbit a4=p2^3;
void显示();
void delay ms(xms);
无效延迟(uchar x)
{
uchar i,j;//延迟
for(I = 0;我<x;i++)
for(j = 100;j >0;j—);
}
voifuwei(void)//重置
{
flag = 2;
zhuansu = 0;
}
/*void显示(void) //显示
{
无符号字符b1,B2;
B1 = zhuansu/10;
b2 = zhuansu % 10
if(flag == 0) //0
P0 = 0x71//显示f
其他
P0 = 0x79
a1 = 0;
戴莱姆斯(3);
a1 = 1;
P0 = 0x40
a2 = 0;//Show –
戴莱姆斯(3);
a2 = 1;
P0 =表2[B1];
a3 = 0;//显示十位数
戴莱姆斯(3);
a3 = 1;
P0 =表2[B2];
a4 = 0;
戴莱姆斯(3);//显示一点
a4 = 1;
空显示()
{
uchar b1、b2、b3、B4;
if(flag0)
P0 = 0x71//显示f
其他
P0 = 0x79
if(标志1)
P0 = 0x7c//显示b
其他
P0 = 0x71
b1 = 10
b2 = 0x3f
B3 = zhuansu/10;
b4 = zhuansu % 10
//P0 = table 2;
a1 = 0;//P2.0
延迟(1);
a1 = 1;
P0 = b2
a2 = 0;//P2.1
延迟(1);
a2 = 1;
P0 =表2[B3];
a3 = 0;//P2.3
延迟(1);
a3 = 1;
P0 =表2[B4];
a4 = 0;//P2.4
延迟(1);
a4 = 1;
}
Void key() //键扫描
{
if(key_fuwei0)
{
延迟(5);
if(key_fuwei0)
付伟();
}
if(key_z0)
{
延迟(5);
if(key_z0)
{
flag = 0;
zhuansu = 10
while(key _ z0);
}
}
if(key_f0)
{
延迟(5);
if(key_f0)
{
flag = 1;
zhuansu = 10
while(key _ F0);
}
}
if(key_jia0)
{
延迟(5);
if(key_jia0)
{
zhuan su++;
if(zhuansu21)
zhuansu = 20
while(key _ Jia 0);
}
}
if(key_jian0)
{
延迟(5);
if(key_jian0)
{
转苏——;
if(zhuansu <=0)
zhuansu = 0;
while(key _ Jian = = 0);
}
}
}
Void dispose() //脉冲函数
{
开关(转速)
{
情况0:flag = 2;打破;
案例一:麦冲= 300;打破;
案例二:麦冲= 295;打破;
案例三:麦冲= 290;打破;
案例四:麦冲= 280;打破;
案例五:麦冲= 260;打破;
案例六:麦冲= 240;打破;
案例7:麦冲= 200;打破;
案例八:麦冲= 180;打破;
案例九:麦冲= 160;打破;
案例10:麦冲= 120;打破;
案例11:麦冲= 80;打破;
案例12:麦冲= 70;打破;
案例13:麦冲= 60;打破;
案例14:麦冲= 40;打破;
案例15:麦冲= 35;打破;
案例16:麦冲= 30;打破;
案例17:麦冲= 25;打破;
案例18:麦冲= 20;打破;
案例19:麦冲= 15;打破;
案例20:麦冲= 10;打破;
}
if(flag0)
table _ begin = 0;
其他
if(标志1)
table _ begin = 4;
}
虚空回转(虚空)
{
uint i,j;
if(zhuansu >0 & amp& ampzhuansu & lt=20)
{
for(j = 0+table _ begin;j & lt4+table _ begin;j++)
{
P1 =表1[j];
for(I = 0;我& lt麦冲;i++)
显示();
}
}
}
……………………