文章来源地址https://www.toymoban.com/news/detail-495658.html
一、设计目标
设计程序实现按键控制步进电机启动、停机、正反转、加减速、转速及转向显示。
二、主要功能
功能1:步进电机的启动、重启、停机;
功能2:步进电机正反装;
功能3:静态数码管显示速度等级;
功能4:步进电机的加减速;
三、硬件部分
51单片机,导线,5161BS静态数码管,独立按键,四线双极性步进电机。
文章来源:https://www.toymoban.com/news/detail-495658.html
图1
图2
图3
图4
图5
图6
图1为单片机接线图;
图2为静态数码管的内部电路图;
图3为控制步进电机的部分的内部电路图;
图4为独立按键设置;
图5为四线双极性步进电机内部原理图;
图6为步进电机转动的原理图:
①A加正极,A-加负极,B加负极,B-加负极(电机状态,N极朝上)。
②A加负极,A-加负极,B加正极,B-加负极(电机状态,N极朝右,旋转90度)。
③A加负极,A-加正极,B加负极,B-加负极(电机状态,N极朝下)。
④A加负极,A-加负极,B加负极,B-加正极(电机状态,N极朝左)。
只要依次给相应引脚相应的电平就可以使得电机转动,转动的最小角度为90度。为了实现更加小角度的供电,本次设计中的供电顺序:A、AB、B、BA-、A-、A-B-、B-、B-A,转动的最小角度为45°。
四、程序框图
五、代码说明
代码由延时函数、按键扫描函数、模式判断函数、中断初始化函数、调速函数、主函数组成。
延时函数用于调节给电机供电的时间,从而实现调速。
按键扫描函数用来判断哪个键被按下,从而实现对应功能。
模式判断函数根据按键扫描的返回值执行相应功能。
中断初始化函数定义了两个中断。
调速函数通过两个中断函数实现电机转动的加减速。
主函数调用并执行子函数。
1.主函数
主函数声明两个中断函数,并进入子程序的循环,即先按键扫描,返回值再进入模式判断函数。
/****************************主函数**********************************/
void main(void)
{
Int0Init();//声明加速的中断
Int1Init();//声明减速的中断
while(1)
{
mode(key());//先按键扫描,后选择模式
}
}
声明部分。定义顺时针和逆时针转动时供电的顺序,分别放到两个数组里;定义数码管显示的供电;定义全局变量V用来调节转速、全局变量D用来调节显示的速度档。
#include <REGX51.H>
unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//顺时针数组
unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆时针数组
smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于显示档速
int V=500,D=1;//V在延时函数中,用于调速;D用来控制数码管显示的数字
int i=4;//先使电机处于停机状态
int n=0;//用于循环给电机通电
2.子函数1
延时函数用于调节给电机供电的时间,从而实现调速。
/***************************延时函数*******************************/
void delay(unsigned int t)//调节给电机供电的时间,从而调速
{
while(t--);
}
3.子函数2
按键扫描函数用来判断哪个键被按下,从而实现对应功能。
/***************************按键扫描***************************************/
int key()
{
if(P0_0==0) i=1;//顺时针
if(P0_1==0) i=2;//逆时针
if(P0_2==0) i=3;//启动/回到初速度
if(P0_3==0) i=4;//停机
return i;
}
4.子函数3
模式判断函数根据按键扫描的返回值执行相应功能。停机即不给电机供电并使数码管显示0。启动会首先给全局变量V赋值500保证一定的延时,达到一定的转速,并且速度档先为1。正转使用顺时针数组内规则供电,反转使用逆时针数组内规则供电,并根据全局变量D的值显示速度档。
/****************************模式判断**************************************/
void mode(int i)//由按键扫描返回值判断
{
switch(i)
{
/****************停机****************/
case 4:
P2=0X00;//不给电机供电
P1=~smg[0];//数码管显示0
break;
/****************启动/重启****************/
case 3:
V=500;//启动的速度/初速度
D=1;//速度1档,自动进入模式1
/****************模式1 正转****************/
case 1:
while(1)
{
for(n=0;n<8;n++)//循环供电
{
P2=SSZ[n];//供电
delay(V);//延时
P1=~smg[D];//显示速度档
}
break;
}
break;
/****************模式2 反转****************/
case 2:
while(1)
{
for(n=0;n<8;n++)//循环供电
{
P2=NSZ[n];//供电
delay(V);//延时
P1=~smg[D];//显示速度档
}
break;
}
break;
}
}
5.子函数4
中断初始化函数定义两个外部中断从而实现控制电机的加速和减速。
/*************************中断初始化*****************************/
void Int0Init()//加速
{
IT0=1;
EX0=1;
EA=1;
}
void Int1Init()//减速
{
IT1=1;
EX1=1;
EA=1;
}
6.子函数5
调速函数的实质是两个中断函数。如果对应按键按下,会使全局变量V加或减相应值实现转速的改变,同时全局变量D也会加或减1,从而改变数码管显示的速度档。
/*************************调速函数****************************/
void Int0() interrupt 0 //加速
{
if(P3_2==0)//判断加速键是否被按下
{
delay(2000);//消抖
if(P3_2==0)//消抖后再次判断
{
V=V-50;//延时时间减少,所以速度增加
D=D+1;//速度档加1
}
}
}
void Int1() interrupt 2 //减速
{
if(P3_3==0)//判断减速键是否被按下
{
delay(2000);//消抖
if(P3_3==0)//消抖后再次判断
{
V=V+50;//延时时间增加,所以速度减少
D=D-1;//速度档减1
}
}
}
六、结束语
本函数实现了步进电机的基本控制,但是可拓展的地方还有很多,比如使用动态数码管显示,使用LCD1602液晶显示屏显示均可。还可以通过计算延时函数的长短,计算出电机转一圈的时间,从而计算转速。另外还可以使用计数器来计算电机1s内转了多少圈,也可以用来计算转速。留待后期开发,还有很多可以探索的功能。
七、演示视频
步进电机视频
八、源代码
#include <REGX51.H>
unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//顺时针数组
unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆时针数组
smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于显示档速
int V=500,D=1;//V在延时函数中,用于调速;D用来控制数码管显示的数字
int i=4;//先使电机处于停机状态
int n=0;//用于循环给电机通电
/***************************延时函数*******************************/
void delay(unsigned int t)//调节给电机供电的时间,从而调速
{
while(t--);
}
/***************************按键扫描***************************************/
int key()
{
if(P0_0==0) i=1;//顺时针
if(P0_1==0) i=2;//逆时针
if(P0_2==0) i=3;//启动/回到初速度
if(P0_3==0) i=4;//停机
return i;
}
/****************************模式判断**************************************/
void mode(int i)//由按键扫描返回值判断
{
switch(i)
{
/****************停机****************/
case 4:
P2=0X00;//不给电机供电
P1=~smg[0];//数码管显示0
break;
/****************启动/重启****************/
case 3:
V=500;//启动的速度/初速度
D=1;//速度1档,自动进入模式1
/****************模式1 正转****************/
case 1:
while(1)
{
for(n=0;n<8;n++)//循环供电
{
P2=SSZ[n];//供电
delay(V);//延时
P1=~smg[D];//显示速度档
}
break;
}
break;
/****************模式2 反转****************/
case 2:
while(1)
{
for(n=0;n<8;n++)//循环供电
{
P2=NSZ[n];//供电
delay(V);//延时
P1=~smg[D];//显示速度档
}
break;
}
break;
}
}
/*************************中断初始化*****************************/
void Int0Init()//加速
{
IT0=1;
EX0=1;
EA=1;
}
void Int1Init()//减速
{
IT1=1;
EX1=1;
EA=1;
}
/*************************调速函数****************************/
void Int0() interrupt 0 //加速
{
if(P3_2==0)//判断加速键是否被按下
{
delay(2000);//消抖
if(P3_2==0)//消抖后再次判断
{
V=V-50;//延时时间减少,所以速度增加
D=D+1;//速度档加1
}
}
}
void Int1() interrupt 2 //减速
{
if(P3_3==0)//判断减速键是否被按下
{
delay(2000);//消抖
if(P3_3==0)//消抖后再次判断
{
V=V+50;//延时时间增加,所以速度减少
D=D-1;//速度档减1
}
}
}
/****************************主函数**********************************/
void main(void)
{
Int0Init();//声明加速的中断
Int1Init();//声明减速的中断
while(1)
{
mode(key());//先按键扫描,后选择模式
}
}
到了这里,关于【附报告及视频】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!