最近有好多小伙伴私信我说,导师给他们布置了关于四线步进电机控制的相关设计,问我能不能写个类似的文章,今天我刚好有点时间,我们就一起探讨一下吧。
想要弄清楚步进电机的控制方式先要弄清楚它的接线方式和工作原理
步进电机结构和工作原理:
1.步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电动机的转速、停止的位置只取决于控制脉冲信号的频率和脉冲数。
2.脉冲数越多,电机转动的角度越大。
3.脉冲的频率越高,电机转速越快,但不能超过最高频率,否则电机的力矩迅速减小,电机不转。按力矩产生的原理可以分为:
(1)反应式:转子无绕组,由被激磁的定子绕组产生反应力矩实现步进运行
(2)激磁式:定、转子均有激磁绕组(或转子用永久磁钢),由电磁力矩实现步进运行按输出力矩大小可分为:
(1)伺服式:输出力矩在百分之几之几至十分之几(N.m)只能驱动较小的负载,要与液压扭矩放大器配用,才能驱动机床工作台等较大的负载
(2)功率式:输出力矩在5~50 N.m以上,可以直接驱动机床工作台等较大的负载按定子数可分为:
(1)单定子式(2)双定子式(3)三定子式(4)多定子式按各相绕组分布可分为;
(1)径向分布式:电机各相按圆周依次排列
步进电机和驱动板的连接方式:
鉴于时间原因我就用仿真软件做了一个单片机四线步进电机驱动项目 供大家参考学习,希望你看完后会有所收获。
项目软件程序功能:当按下SW1时步进电机正转,按下SW2后步进电机反转,并可以根据源码任意调节旋转速度和每一个脉冲旋转角度
以下是仿真图:
程序参考源代码如下:经过实际验证,软硬件可以实现设计功能,实验成功。
/C语言程序:/
#include <reg52.h> //
#define uchar unsigned char
#define uint unsigned int
uchar table_begin;
uint maichong; //脉冲
uchar zhuansu; //转速
uchar flag; //方向
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 display();
void delayms(xms);
void delay(uchar x)
{
uchar i,j; //延时
for(i=0;i<x;i++)
for(j=100;j>0;j–);
}
void fuwei(void) //复位
{
flag=2;
zhuansu=0;
}
/*void Display(void) //显示
{
unsigned char b1, b2;
b1=zhuansu/10;
b2=zhuansu%10;
if(flag == 0) //0
P0=0x71;//显示F
else
P0=0x79;
A1=0;
delayms(3);
A1=1;
P0=0x40;
A2=0; //显示–
delayms(3);
A2=1;
P0=table2[b1];
A3=0; //显示十位
delayms(3);
A3=1;
P0=table2[b2];
A4=0;
delayms(3); //显示个位
A4=1;
void display()
{
uchar b1,b2,b3,b4;
if(flag0)
P0=0x71;//显示F
else
P0=0x79;
if(flag1)
P0=0x7c;//显示b
else
P0=0x71;
b1=10;
b2=0x3f;
b3=zhuansu/10;
b4=zhuansu%10;
//P0=table2;
A1=0; //P2.0
delay(1);
A1=1;
P0=b2;
A2=0; //P2.1
delay(1);
A2=1;
P0=table2[b3];
A3=0; //P2.3
delay(1);
A3=1;
P0=table2[b4];
A4=0; //P2.4
delay(1);
A4=1;
}
void key() //按键扫描
{
if(key_fuwei0)
{
delay(5);
if(key_fuwei0)
fuwei();
}
if(key_z0)
{
delay(5);
if(key_z0)
{
flag=0;
zhuansu=10;
while(key_z0);
}
}
if(key_f0)
{
delay(5);
if(key_f0)
{
flag=1;
zhuansu=10;
while(key_f0);
}
}
if(key_jia0)
{
delay(5);
if(key_jia0)
{
zhuansu++;
if(zhuansu21)
zhuansu=20;
while(key_jia0);
}
}
if(key_jian0)
{
delay(5);
if(key_jian0)
{
zhuansu–;
if(zhuansu<=0)
zhuansu=0;
while(key_jian==0);
}
}
}
void dispose() //脉冲函数
{
switch(zhuansu)
{
case 0: flag=2; break;
case 1: maichong=300; break;
case 2: maichong=295; break;
case 3: maichong=290; break;
case 4: maichong=280; break;
case 5: maichong=260; break;
case 6: maichong=240; break;
case 7: maichong=200; break;
case 8: maichong=180; break;
case 9: maichong=160; break;
case 10: maichong=120; break;
case 11: maichong=80; break;
case 12: maichong=70; break;
case 13: maichong=60; break;
case 14: maichong=40; break;
case 15: maichong=35; break;
case 16: maichong=30; break;
case 17: maichong=25; break;
case 18: maichong=20; break;
case 19: maichong=15; break;
case 20: maichong=10; break;
}
if(flag0)
table_begin=0;
else
if(flag1)
table_begin=4;
}
void zhuandong(void)
{
uint i,j;
if(zhuansu>0&&zhuansu<=20)
{
for(j=0+table_begin;j<4+table_begin;j++)
{
P1=table1[j];
for(i=0;i<maichong;i++)
display();
}
}
}
……………………