1.设计要求
利用单片机实现对步进电机的控制,编写程序,用四路 I/O 口实现环形脉冲的分配,控制步进电机按固定方向连续转动。同时,要求按下“Positive(正转)”按键时,控制步进电机正转;按下“Negitive(反转)” 按键时,控制步进电机反转;按下“加速”按键时,控制步进电机加速;按下“减速” 按键时,控制步进电机减速。4位数码管,左边两位显示正反转,正转显示“11”,反转显示“00”,右边两位显示转速档次,步进电机的转速1~30档在右边两位数码管上显示。
1.设计意义:(项目应用领域及意义)
步进电机是一种受脉冲信号控制,并且能将脉冲信号转化为相应的角位移或者线位移的数字电动机。由于电源每次输入电脉冲给该电机,该电机就会前进一小步,转动的方式是步进式的,所以步进电机,由于电源输入的是脉冲式的电压,因此也被称为脉冲电动机。
在步进电机驱动范围内,其输出的角位移或线位移与输入的脉冲个数成正比,不因电源电压、负载变化和环境条件等的变化而变化。所以其输出的角速度或线速度也与输入的脉冲频率成正比,通过改变输入脉冲频率的高低就可以调节步进电机的转速,并能控制步进电机的快速启动,暂停,正反转和加减速等。
由于步进电机具有步距误差不积累,运行可靠,结构简单,成本低等特点,因此被广泛运用于计算机外围电路,自动化控制装置以及其他数字控制装置中,如打印机、钟表、数模转换设备中。
2.工作原理
①步进电机采用脉冲信号进行控制,每输入一次脉冲,就使步进电动机向前推进一步。
②步进电动机的转动步距角,是以电动机的结构为基准,按一定比例的比例来实现的。
③在实践中,电动机的转动步距角会有细微的差异,这是因为电动机的结构固定有问题,并且不会累积到总极数越多,对加工精度的要求也就越高。一般情况下,工业用混合步进电动机的步距角为1.8°,即200个极点。(相当于同步)
3.已实现的功能说明
按下51单片机中的k2键,步进电机会进行对应的加速,数码管的后两位会显示对应的0~30的速度值;按下51单片机中的k3键,步进电机会进行对应的减速,数码管的后两位会显示对应的0-30的速度值;按下51单片机中的k3键,步进电机会进行对应的进行反转,此时数码管前两位会对应的显示“00”;按下51单片机中的k5键,步进电机会进行对应的正转,此时数码管前两位会对应的显示“11”。
一、设计方案 `
1.系统框图:
2. 系统总电路
- 系统PCB图(可选):
首先绘制原理图:完成原理图后,需要用 ERC工具查错,直到没有原则性错误。其次设计组件封装:需要自己设计并建立新的组件封装库。最终设计 PCB 板:先画好 PCB 板的轮廓,确定工艺要求,接着把原理图传到PCB里,接着在网络表中布局和布线。
#include <reg52.h>
#define dula P0
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};
sbit A1=P1^0;
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit k1 = P3^4;
sbit k2 = P3^5;
sbit k3 = P3^6;
sbit k4 = P3^7;
#define Coil_CD1 {A1=1;B1=1;C1=0;D1=0;}
#define Coil_AD1 {A1=0;B1=1;C1=1;D1=0;}
#define Coil_AB1 {A1=0;B1=0;C1=1;D1=1;}
#define Coil_BC1 {A1=1;B1=0;C1=0;D1=1;}
#define Coil_A1 {A1=0;B1=1;C1=1;D1=1;}
#define Coil_B1 {A1=1;B1=0;C1=1;D1=1;}
#define Coil_C1 {A1=1;B1=1;C1=0;D1=1;}
#define Coil_D1 {A1=1;B1=1;C1=1;D1=0;}
#define Coil_OFF {A1=1;B1=1;C1=1;D1=1;}
float Speed=1;
bit StopFlag;
void Display(unsigned char num);
void Init_Timer0(void);
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void motor_ffw()
{
unsigned char i;
unsigned int j;
for (j=0; j<64; j++)
{
for (i=0; i<8; i++)
{
if(k3==0) P1 = FFW[i];
if(k4==0) P1 = FFZ[i];
Display(Speed);
}
}
}
main()
{
Init_Timer0();
Coil_OFF;
while(1)
{
if(k1 == 0)
{
delay(10);
if(k1 == 0)
{
while(k1 == 0);
if(Speed<30)
Speed++;
}
}
else if(k2 == 0)
{
delay(10);
if(k2 == 0)
{
while(k2 == 0);
if(Speed>1)
Speed--;
}
}
else if(k3 == 0)
{
delay(10);
Speed=0000;
motor_ffw();
}
else if(k4 == 0)
{
delay(10);
Speed=1100;
motor_ffw();
}
Display(Speed);
}
}
void Display(unsigned int num)
{
unsigned int qian,bai,shi,ge;
qian=num/1000;
bai=num%1000/100;
shi = num%1000%100/10;
ge = num%1000%100%10;
wei1=1;
wei2=0;
wei3=0;
wei4=0;
P0=table[qian];
delay(2);
wei1=0;
wei2=1;
wei3=0;
wei4=0;
P0=table[bai];
delay(2);
wei1=0;
wei2=0;
wei3=1;
wei4=0;
P0=table[shi];
delay(2);
wei1=0;
wei2=0;
wei3=0;
wei4=1;
P0=table[ge];
delay(2);
}
void Init_Timer0(void)
{
TMOD |= 0x01;
EA=1;
ET0=1;
TR0=1;
}
void Timer0_isr(void) interrupt 1
{
static unsigned char times,i;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(!StopFlag)
{
if(times==(32-Speed))
{
times=0;
switch(i)
{
case 0:Coil_A1;i++;break;
case 1:Coil_B1;i++;break;
case 2:Coil_C1;i++;break;
case 3:Coil_D1;i++;break;
case 4:i=0;break;
default:break;
}
}
times++;
}
}
硬件调试
.仿真调试:文章来源:https://www.toymoban.com/news/detail-512931.html
反转文章来源地址https://www.toymoban.com/news/detail-512931.html
到了这里,关于步进电机控制实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!