分享

单片机应用案例:步进电机控制系统设计

 xpxys99 2017-06-17

功能简介:STC89C52作为控制单元,通过键盘实现对步进电机转动方向及转动速度的控制,并且将步进电机的转动用四个LED灯指示

总体设计思路:STC89C52单片机对步进电机的控制,通过IO口输出的时序方波作为步进电机的控制信号,信号经过芯片ULN2003驱动步进电机;同时,用 4个按键来对电机的状态进行控制,并用4个LED发光二极管显示电机的转速。

步进电机控制电路设计

参考此设计前篇介绍对步进电机和UN2003初步了解。

单片机应用案例:步进电机控制系统设计

从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有 5根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将 COM 端标识为C,只要 AC、BC或/AC、/BC,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将 COM 端接正电源,那么只要用开关元件(如三极管) ,将 A、B或/A、/B轮流接地。

不难设计出控制电路,因其工作电压为 12V,因此用一块开路输出达林顿驱动器(这里用ULN2003,关于ULN2003在前篇有介绍)作为驱动,通过 P1.0、 P1.3来控制各线圈的接通与切断。开机时,P1.0、 P1.3均为高电平,依次将 P1.0、 P1.2 (或P1.1、 P1.3反向)切换为低电平即可驱动步进电机运行。如果要改变电机的转动速度只要改变两次接通之间的时间。改变转速,只要改变 P1.0、 P1.2 (或P1.1、 P1.3反向)轮流变低电平的时间即可达到要求,因为不会影响到其他功能的实现,这个时间可以用延时来实现,。这里以定时的方式来实现。下面首先计算一下定时时间。 按要求,最低转速为 20 转/分,而上述步进电机的步距角为 7.5,即每 48 个脉冲为 1 周,即在最低转速时,要求为960脉冲/分,相当于 62.5ms/脉冲。而在最高转速时,要求为 100转/分,即 48000 脉冲/分,相当于 12.5ms/脉冲。可以列出下表:

转速单步时间(ms)TH0TL0
2062.51F0
2159.5238095229B6
2256.818181823374
2354.347826093C59
2452.083333334480
25504C0
2648.0769230852EC
2746.29629635955
2844.642857145F49
9313.44086022CF9C
9413.29787234D020
9513.15789474D0A1
9613.02083333D120
9712.88659794D19B
9812.75510204D214
9912.62626263D28B
10012.5D30

表中不仅计算出了 TH0和 TL0,而且还计算出了在这个定时常数下,真实的定时时间,可以根据这个计算值来估算真实速度与理论速度的误差值。 表中 TH0 和TL0 是根据定时时间算出来的定时初值,这里用到的晶振是 12.000M。有了上述表格,程序就不难实现了,使用定时/计数器 T0为定时器,定时时间到后切换输出脚即可。

程序设计思路

步进电机控制系统的软件需要同时完成读取键盘、处理键盘、控制步进电机转动、控制数码管动态显示等任务,这就必须通过中断技术来实现。

在本设计中,主程序采用查询方式扫描键盘端口,检测按键动作是否发生,若有按键动作则处理键盘,根据按键值修改相应参数值,实现键盘的实时处理功能。定时器0中断服务程序控制步进电机的转动:根据当前显示的速度进行键盘手动改变T0定时时间常数,设置TH0和TL0的值,达到对转速精确控制的目的;根据转动方向控制位的值,控制脉冲信号循环移动的方向,达到对转动方向控制的目的。

说明如下:

1.单片机接受键盘信息,改变系统内部变量值。

2.单片机输出脉冲信号,控制步进电机转动。

3.单片机根据步进电机实际转动值,控制数码管显示。

电路图:

单片机应用案例:步进电机控制系统设计

程序:

#include

#define uchar unsigned char //无符号字符型 宏定义变量范围0~255

#define uint unsigned int //无符号整型 宏定义变量范围0~65535

unsigned char code zheng[4]={0x08,0x04,0x02,0x01};//正转表格

unsigned char code fan[4]={0x01,0x02,0x04,0x08};//反转表格

uchar flag_start ; //启动标志位 1为起动步进电机 否则关闭电机

uchar flag_z_f; //正反标志位 0为顺时钟 1为逆时史上转

uchar flag_shudu; //4种速度 0,1,2,3,

uint flag_shudu_value = 400;

void Delay(unsigned int i)//延时

{

while(--i);

}

uchar key_can;

/********************独立按键程序*****************/

void key()

{

static uchar key_new;

key_can = 20;//按键值还原

if((P3 & 0xf0) != 0xf0)//按键按下

{

Delay(5);//按键消抖动

if(((P3 & 0xf0) != 0xf0) && (key_new == 1))

{//确认是按键按下

key_new = 0;

switch(P3 & 0xf0)

{

case 0xe0: key_can = 1; break; //得到按键值

case 0xd0: key_can = 2; break; //得到按键值

case 0xb0: key_can = 3; break; //得到按键值

case 0x70: key_can = 4; break; //得到按键值

}

}

}

else //按键松开

key_new = 1;

}

/******************主程序**********************/

void main()

{

unsigned char i;

while(1)

{

key();

if(key_can <>

{

if(key_can == 1) //启动键

{

if(flag_start == 0) //启动

{

flag_start = 1;

switch(flag_shudu)

{

case 0: flag_shudu_value = 500; P2 = 0xf0; break;//速度1 最快

case 1: flag_shudu_value = 800; P2 = 0xf9; break;

case 2: flag_shudu_value = 1000; P2 = 0xfc; break;

case 3: flag_shudu_value = 1500;P2 = 0xfe; break;//速度4 最慢

}

}

else //停止

{

flag_start = 0;

P2 = 0XFF;//关闭指示灯

}

}if(key_can == 2) //正反转键

{

flag_z_f = ~flag_z_f; //

}if(key_can == 3) //减速

{

flag_shudu ++;

if(flag_shudu >= 4)

flag_shudu = 0;

switch(flag_shudu)

{

case 0: flag_shudu_value = 500; P2 = 0xf0; break;//速度1 最快

case 1: flag_shudu_value = 800; P2 = 0xf9; break;

case 2: flag_shudu_value = 1000; P2 = 0xfc; break;

case 3: flag_shudu_value = 1500;P2 = 0xfe; break;//速度4 最慢

}

}if(key_can == 4) //加速

{

if(flag_shudu == 0)

flag_shudu = 4;

flag_shudu --;

switch(flag_shudu)

{

case 0: flag_shudu_value = 500; P2 = 0xf0; break;//速度1 最快

case 1: flag_shudu_value = 800; P2 = 0xf8; break;

case 2: flag_shudu_value = 1000; P2 = 0xfc; break;

case 3: flag_shudu_value = 1500;P2 = 0xfe; break;//速度4 最慢

}

}

}

if(flag_start == 1)

{

for(i=0;i<4;i++)>

{

if(flag_z_f == 0)

P1=zheng[i]; //电机正转

else

P1=fan[i]; //电机反转

Delay(flag_shudu_value); //改变这个参数可以调整电机转速

}

}

}

}

以上信息仅供参考,希望对大家有帮助。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多