单片机:步进电机的使用

一、设计目的

分析步进电机的驱动原理,将单片机应用于步进电机的控制接口设计;利用中断定时方法,实现步进电机的位置控制、方向控制和速度控制。利用ZLG7290键盘/显示电路,设置给定信号,并显示实际信息。

二、设计内容和步骤

本实验要对步进电机进行控制。步进电机的内部结构图如图5.9所示,步进电机及其驱动电路如图5.10所示,J42为步进电机连接接口(出场时已经连好),J41为控制信号输入端,JP6为电源控制(使用前先短接,做完实验再断开)。驱动电路中所需的ULN2003A原理图如图5.11所示。

图5.9  步进电机内部结构图

图5.10 步进电机及其驱动电路

 

图5.11  ULN2003A原理图

(原理图来源于教学pdf资源,侵权删)

步骤:

1、步进电机的驱动控制方式有:

  1. 双四拍:AB→BC→CD→DA→AB
  2. 单四拍:A→B→C→D→A
  3. 单双八拍:A→AB→B→BC→C→CD→D→DA→A

本设计采用双四拍控制方式

2、设计单片机控制步进电机的接口电路。

实现步进电机的正转、反转;并且转动速度能改变。

3、设计拨位开关‘启动/停止’,‘正转/反转’和独立式按键‘加速’、‘减速’,与单片机的接口电路,实现步进电机的控制,包括启、停控制,方向控制和速度控制;【:运动方向改变时,应先降低速度,停止后,再反向。】

4、设计单片机与ZLG7290的接口,测试7290的显示和按键功能。

5、编制步进电机(角度)位置控制函数,实现步进电机任意位置的控制。

(如正转90度、反转360度,角度为参变量);并用数码管显示当前角度。

6、用按键输入需要转动的角度,实现步进电机的位置控制,并能将当前转过的角度显示在数码管上。

需要定义按键0~9、R(右转)、L(左转)、ENTER(回车)。用以设定角度。

#include  "reg52.h"
#include  "VIIC_C51.H"
#include  "zlg7290.h"
sbit power=P1^0;    //启动
sbit change=P1^1;   //改变方向
sbit acc=P1^2;      //加速
sbit dec=P1^3;      //减速
sbit BA=P1^4;       //步进电机四接口
sbit BB=P1^5;
sbit BC=P1^6;
sbit BD=P1^7;
//SDAP23,SCLP22
sbit RST=P2^1;
sbit KEY_INT=P2^0;

sbit yi=P0^0;       //各数值对应按键,0~9
sbit er=P0^1;
sbit san=P0^2;
sbit si=P0^3;
sbit wu=P0^4;
sbit liu=P0^5;
sbit qi=P0^6;
sbit ba=P0^7;
sbit jiu=P2^4;
sbit ling=P2^5;
sbit enter=P2^6; 
//控制左右方向的按键用改变方向的按键替代,正向和反向
int a=0,count=0,rad;//a用来修正定时器数值,增速减速,count用来记录转动次数
unsigned long int y;//y用来存储数据
unsigned char bcd[]={0,0,0},abc[]={0,0,0},yy[]={0,0,0};//分别用来存放enter键输送的确定设定角度,待修改的设定角度(可以随时动态更替),实际转动角度
void delay()//延时函数,用于延时令步进电机转动信号
{
  int i;
  for(i=0;i<2000;i++);
}
void AB()
{
  BA=1;BB=1;BC=0;BD=0;
  delay();
}
void BC_()
{
  BA=0;BB=1;BC=1;BD=0;
  delay();
}
void CD()
{
  BA=0;BB=0;BC=1;BD=1;
  delay();
}
void DA()
{
  BA=1;BB=0;BC=0;BD=1;
  delay();
}
void forward()//正向转动,向前转
{
  AB();
  BC_();
  CD();
  DA();
}
void reverse()//反向转动,向后转
{
  DA();
  CD();
  BC_();
  AB();
}
void stop()//暂停
{
  BA=0;BB=0;BC=0;BD=0;
  delay();
}
void direction()//控制方向函数,控制前转或后转
{
  if(change==1)
  {
    stop();
    forward();
  }
  else
  {
    stop();
	reverse();
  }
}
void velocity()//控制速度函数,如果按下加速acc,a将增大,TH0定时时间减少,频率加快,转动速度加快,dec同理减小a数值达到减速效果
{
  TH0=(23869+a)/256;
  TL0=(23869+a)%256;
   if(acc==0)
  {
    delay();
	if(acc==0)
	{
	  a++;
	}
  }
  else if(dec==0)
  {
	delay();
	if(dec==0)
	{
	  a--;
	}
  }
}
void conv()     //此函数较为冗杂,因为我真的想不明白了
{
	unsigned char i,j=0;//定义无符号整型变量
if(ling==0)//0按键,若按下零按键向数组中存入数值
{
  abc[j]=0;
  j++;
  if(j=3)//如果j大于数组容量,从0重新装入,达到动态改变效果,下述各if语句同理
  {
    j=0;
  }
}
if(yi==0)
{
  abc[j]=1;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(er==0)
{
  abc[j]=2;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(san==0)
{
  abc[j]=3;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(si==0)
{
  abc[j]=4;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(wu==0)
{
  abc[j]=5;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(liu==0)
{
  abc[j]=6;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(qi==0)
{
  abc[j]=7;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(ba==0)
{
  abc[j]=8;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(jiu==0)
{
  abc[j]=9;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(enter==0)//若按键enter按下,将设定数值送给bcd作为最终的设定数值
{
for(i=0;i<3;i++)
{
  bcd[i]=abc[i];
}
}
y=100*bcd[2]+10*bcd[1]+bcd[0];//转化为十进制求出y数值
y=y/18;//整除18再乘以18得到18的倍数,用于显示实际转动角度
rad=y;//rad为脉冲次数
y=y*18;
yy[0]=y%10;//用yy数组存储实际转动角度
yy[1]=(y/10)%10;
yy[2]=(y/100)%10;
}
void Time() interrupt 1
{
  if(power==1)//如果未启动,关掉定时器
  {
    TR0=0;
  }
  direction();//控制方向函数,每次中断都重新设定
  velocity();//控制速度函数
  count++;//记录已经得到的脉冲次数
  if(count==rad)//达到设定角度,关闭定时器,停止转动
  {
    EA=0;
  }
}
void main()
{
  unsigned char i;
  TMOD=0x10;
  TH0=23869/256;
  TL0=23869%256; 
  EA=1; 				  	   
  ET0=1;
  RST=0;
  delayMS(1);
  RST=1;
  delayMS(10);
  while(1)
  {
       if(power==0)
       {
          TR0=1;
       }
       conv();
       for(i=0;i<3;i++)
        {
			ZLG7290_SendCmd(0x60+i,bcd[i]);//显示设定数值于右侧led	
         	delayMS(1);
        }
		for(i=0;i<3;i++)
        {
			ZLG7290_SendCmd(0x60+i+4,yy[i]);//显示实际转动角度于左侧led
         	delayMS(1);
        }
}}

除上述代码,还需有两头文件及其对应代码 ,基于一些考虑在此不再上传。

本代码片段仅用于学习和参考,不一定符合对应单片机的实验箱或者仿真要求,请勿照搬照抄,谢谢配合。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不看美女三天即死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值