51单片机的三维平台控制方案.docx

上传人:b****8 文档编号:9140744 上传时间:2023-02-03 格式:DOCX 页数:27 大小:149.54KB
下载 相关 举报
51单片机的三维平台控制方案.docx_第1页
第1页 / 共27页
51单片机的三维平台控制方案.docx_第2页
第2页 / 共27页
51单片机的三维平台控制方案.docx_第3页
第3页 / 共27页
51单片机的三维平台控制方案.docx_第4页
第4页 / 共27页
51单片机的三维平台控制方案.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

51单片机的三维平台控制方案.docx

《51单片机的三维平台控制方案.docx》由会员分享,可在线阅读,更多相关《51单片机的三维平台控制方案.docx(27页珍藏版)》请在冰豆网上搜索。

51单片机的三维平台控制方案.docx

51单片机的三维平台控制方案

 

基于52单片机的三维平台控制

技术方案

 

 

1.系统总体设计思路

本系统采用STC89C52单片机对三维平台上三个步进电机进行控制,初步实

现的功能有:

系统启动与停止控制,三轴联动,三轴的加、减速控制,三轴正、反转控制,X轴的启动与停止控制、X轴与Y轴的限位控制、三轴的转速检测与显示,最高1/128电流细分等功能,其系统框图如图1.1所示:

图1.1三维平台步进电机控制系统框图

2.系统硬件部分具体实现

2.1主控制模块的设计与实现

本设计选用STC89C52单片机作为主控制模块。

STC89C52单片机是一种低功耗、高性能CMOS8位微控制器,具有8K可编程Flash存储器,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,3个16位定时器/计数器,全双工串行口。

STC89C52单片机作为主控芯片,在本设计中主要实现以下几个工作:

(1)接收矩阵键盘输入的控制信号;

(2)输出PWM脉冲控制三轴步进电机工作,包括输出PWM脉冲信号和方向信号;

(3)处理给定转速信号和测速反馈转速信号;

(4)在八个八段数码管上显示电机的给定转速和实时转速;

(5)接收限位反馈并做逻辑判断;

主控制器的引脚分配表如表1.1所示:

I/0口

引脚号

对应元件

功能

输入/输出

P0.0~P0.7

39~32

SB1~SB12

矩阵键盘输入

输入(上拉电阻)

P1.0~P1.2

1~3

74HC138

3-8译码器控制信号

输出

P1.3

4

THB7128

X轴方向信号

输出

P1.4

5

THB7128

Y轴方向信号

输出

P1.5

6

THB7128

Z轴方向信号

输出

P1.6

7

限位开关X_1

限位信号

输入

P1.7

8

限位开关X_2

限位信号

输入

P3.0

10

限位开关Y_1

限位信号

输入

P3.1

11

限位开关Y_2

限位信号

输入

P3.5

15

THB7128

X轴脉冲输出

输出

P3.6

16

THB7128

Y轴脉冲输出

输出

P3.7

17

THB7128

Z轴脉冲输出

输出

P2.0~P2.7

21~28

八个八段数码管

数码管段选信号

输出

XTAL1~XTAL2

19~18

晶振电路

时钟信号

输入

RST

9

复位电路

复位信号

输入

P3.2(INT0)

12

X轴光电编码器

转速信号

输入

P3.3(INT1)

13

Y轴光电编码器

转速信号

输入

P3.4

14

Z轴光电编码器

转速信号

输入

 

主控制器原理图,如图2.1.1所示:

图2.1.1主控制器原理图

2.2驱动电路的设计与实现

驱动电路采用THB712步进电机驱动芯片对三位平台上的三个步进电机进行驱动。

THB7128是一款专业的两相步进电机驱动芯片,它内部集成了细分、电流调节、CMOS功率放大等电路,配合外围电路可实现高性能、多细分、大电流的驱动电路。

其主要参数和性能指标如下:

•单芯片两相细分步进电机驱动;

•直接采用单脉冲和方向信号译码控制模式;

•双全桥MOSFET驱动,低导通电阻

•可实现正反转控制;

•通过3位选择8档细分控制(1,1/2,1/4,1/8,1/16,1/32,1/64,1/128);

•最高耐压40VDC;

•高输出电流

•HZIP19封装;

•有复位和使能管脚;

•芯片内部有过热保(TSD)和过流检测电路。

 

驱动电路原理图如图2.2.1所示:

图2.2.1驱动电路原理图

 

驱动器细分设定(M1、M2、M3)如表2.2.1所示。

表2.2.1驱动器细分设定

M1

M2

M3

细分数

L

L

L

1

H

L

L

1/2

L

H

L

1/4

H

H

L

1/8

L

L

H

1/16

H

L

H

1/32

L

H

H

1/64

H

H

H

1/128

2.3显示电路的设计与实现

本设计采用八个八段数码管实现转速显示功能,其中高4位数码管为给定转速显示,通过编程实现X、Y、Z三轴转速循环显示,低4位数码管为测速反馈的转速显示,显示方式同高4位。

STC89C52单片机内部采用查表法对转速信号进行数值处理,通过P2.0~P2.7口输出段选信号,通过P1.0~P1.2输出3路位选信号到74HC138中,通过3-8译码器对八个八段数码管进行选择。

具体显示模块的硬件电路如图2.3.1所示:

图2.3.1显示模块的硬件电路

2.4键盘电路的设计与实现

本设计中的键盘电路采用“4*4”矩阵键盘,采用键盘扫描的方式对按键信号进行捕获,并输入到STC89C52单片机的P0口中。

具体键盘功能如表2.4.1所示。

表2.4.1矩阵键盘功能

L1

L2

L3

L4

H4

系统启动

系统停止

X轴启动

X轴停止

H3

X轴加速

X轴减速

X轴减速

X轴减速

H2

Y轴加速

Y轴减速

Y轴减速

Y轴减速

H1

Z轴加速

Z轴减速

Z轴减速

Z轴减速

2.5测速模块的设计与实现

本设计采用E6B2-CWZ6C光电编码器对三轴步进电机的转速进行实时检测,并反馈到单片机中用作转速的实时显示。

E6B2-CWZ6C光电编码器有以下特点:

•对应电源电压DC5~24V;

•外径

40具备2000P/R的分辨率;

•具备使Z相对简单化的原点位置显示功能;

•实现轴负重、径向30N、推力相20N;

•附有逆接、负荷短路保护回路,改善了可靠性。

E6B2-CWZ6C的输出方式为NPN集电极开路输出方式,共有红、白、橙三路转速信号输出,本设计中只采用其一路测速信号输入到单片机的外部中断口或T1计数器外部脉冲输入端进行转速检测。

E6B2-CWZ6C内部结构如图2.5.1所示:

图2.5.1E6B2-CWZ6C内部结构

2.6限位反馈电路的设计与实现

限位开关工作原理是,当三维平台没有接近限位开关时,限位开关输出为高电平;当三维平台接近限位开关时,限位开关输出为低电平;利用单片机I/O口去捕获限位开关输出电平,当限位开关输出为低电平时,控制电机方向信号,使电机反转。

本设计中限位开关是采用LJ8A3-1-Z型,实物如图2.6.1所示。

图2.6.1限位开关实物图

3.系统软件部分具体实现

STC89C52单片机内部共有三个定时器/计数器资源分别是T0、T1、T2,两个外部中断输入口INT0和INT1,本设计中单片机的内部资源分配如表3.1所示。

表3.1单片机内部资源分配:

内部资源

工作模式

功能

T0

16位计数器

接收X轴脉冲输入

T1

16位定时器

记50ms时间作为转速计算的参考

T2

16位定时器

输出可调PWM脉冲信号

INTO

外部中断

接收Y轴脉冲输入

INT1

外部中断

接收Z轴脉冲输入

 

系统工作程序流程图如图3.1所示:

图3.1系统工作程序流程图

转速检测模块程序流程图如图3.2所示:

图3.2转速检测模块程序流程图

 

限位检测模块程序流程图如图3.3所示:

图3.3限位检测模块程序流程图

 

附录

附录1:

源代码

#include

#include

/*I/O口分配*/

sbitcp_x=P3^5;//驱动脉冲信号输出x

sbitcp_y=P3^6;//驱动脉冲信号输出y

sbitcp_z=P3^7;//驱动脉冲信号输出z

sbitfx_x=P1^3;//x轴方向信号

sbitfx_y=P1^4;//y轴方向信号

sbitfx_z=P1^5;//z轴方向信号

sbitx_xianwei1=P1^6;//x轴限位

sbitx_xianwei2=P1^7;//x轴限位

sbity_xianwei1=P3^0;//y轴限位

sbity_xianwei2=P3^1;//y轴限位

sbitLHJ_A=P1^0;//74HC138(3-8)译码器输入控制信号线

sbitLHJ_B=P1^1;

sbitLHJ_C=P1^2;

sfrT2MOD=0xC9;//T2定时器工作模式

unsignedcharx_speed=8,y_speed=8,z_speed=8;//给定x,y,z三轴初始化转速

unsignedcharcount_x=0,count_y=0,count_z=0;//记录三轴给定脉冲数变量

unsignedintcollect_x=0,collect_y=0,collect_z=0;//三轴测速脉冲数存储变量

unsignedchart1_flag=0,t2_flag=0,t3_flag=0,t4_flag=0;//定时器T110ms标志位

unsignedintx_tmpdate[8]={0,0,0,0,0,0,0,0};//定义数组变量

unsignedinty_tmpdate[8]={0,0,0,0,0,0,0,0};

unsignedintz_tmpdate[8]={0,0,0,0,0,0,0,0};

codeunsignedchartable[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};

//共阴数码管0-9a-f表

/**********************数码管位选****************************/

#defineSMG_1LHJ_C=0;LHJ_B=0;LHJ_A=0//译码器的输入脚,全0选择第一位数码管。

#defineSMG_2LHJ_C=0;LHJ_B=0;LHJ_A=1//译码器的输入脚,001选择第二位数码管。

#defineSMG_3LHJ_C=0;LHJ_B=1;LHJ_A=0

#defineSMG_4LHJ_C=0;LHJ_B=1;LHJ_A=1

#defineSMG_5LHJ_C=1;LHJ_B=0;LHJ_A=0

#defineSMG_6LHJ_C=1;LHJ_B=0;LHJ_A=1

#defineSMG_7LHJ_C=1;LHJ_B=1;LHJ_A=0

#defineSMG_8LHJ_C=1;LHJ_B=1;LHJ_A=1

voidkeyscan(void);//扫描键盘

voiddelay(void)//延时子函数,5个空指令

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

voidinit()

{

fx_x=1;

fx_y=1;

fx_z=1;

TL1=(65536-50000)%256;

TH1=(65536-50000)/256;

TL0=(65536-1)%256;

TH0=(65536-1)/256;

TMOD=0x15;

T2MOD=0x00;

T2CON=0x00;

IP=0x20;//外部中断0和外部中断1设置优先级

IT0=1;//外部中断0为下降沿触发

IT1=1;//外部中断1为下降沿触发

EX0=1;//开外部中断0

EX1=1;//开外部中断1

TR0=1;//开计数器1,准备测速

ET0=1;

TR1=1;//开定时器1,记50ms

ET1=1;

TL2=(65536-1000)%256;

TH2=(65536-1000)/256;

x_tmpdate[0]=0xf6;

y_tmpdate[0]=0xe6;

z_tmpdate[0]=0xdb;

//x_tmpdate[4]=0xf6;//第五个数码管显示

//y_tmpdate[4]=0xe6;

//z_tmpdate[4]=0xdb;

}

voiddisplay(unsignedint*lp)//显示

{

P2=0;//端口2为输出

SMG_1;//第一位数码管

P2=lp[0];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;//清0端口,准备显示下位

P2=0;//端口2为输出

SMG_2;//第二位数码管

P2=table[lp[1]];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;//清0端口,准备显示下位

SMG_3;//第三位数码管

P2=table[lp[2]];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;//清0端口,准备显示下位出,否则进位影响到第四位数据

SMG_4;//第四位数码管

P2=table[lp[3]];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;

//清0端口,准备显示下位

//P2=0;//端口2为输出

//SMG_5;//第五位数码管

//P2=lp[4];//查表法得到要显示数字的数码段

//delay();//延时5个空指令

//P2=0;//清0端口,准备显示下位

P2=0;//端口2为输出

SMG_6;//第六位数码管

P2=table[lp[5]];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;//清0端口,准备显示下位

SMG_7;//第七位数码管

P2=table[lp[6]];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;//清0端口,准备显示下位出

SMG_8;//第八位数码管

P2=table[lp[7]];//查表法得到要显示数字的数码段

delay();//延时5个空指令

P2=0;//清0端口

}

voidmain()

{

init();

while

(1)

{

if(x_xianwei1==0)//限位开关控制

{

fx_x=~fx_x;

while(x_xianwei1==0);

}

if(x_xianwei2==0)

{

fx_x=~fx_x;

while(x_xianwei2==0);

}

if(y_xianwei1==0)

{

fx_y=~fx_y;

while(y_xianwei1==0);

}

if(y_xianwei2==0)

{

fx_y=~fx_y;

while(y_xianwei2==0);

}

//if(y_xianwei==0)

//fx_y=~fx_y;

//if(z_xianwei==0)

//fx_z=~fx_z;

/*给定转速数据*/

x_tmpdate[1]=15/10/x_speed;//百位x_tmpdate[0]=60000000/1000(T2初值)/200/x_speed/2/100

x_tmpdate[2]=15/1/x_speed/1%10;//十位x_tmpdate[1]=60000000/1000/200/x_speed/2/10%10

x_tmpdate[3]=150/1/x_speed%10;//个位x_tmpdate[2]=60000000/1000/200/x_speed/2%10

y_tmpdate[1]=15/10/y_speed/1;//百位

y_tmpdate[2]=15/1/y_speed/1%10;//十位

y_tmpdate[3]=150/1/y_speed%10;//个位

z_tmpdate[1]=15/10/z_speed/1;//百位

z_tmpdate[2]=15/1/z_speed/1%10;//十位

z_tmpdate[3]=150/1/z_speed%10;//个位

keyscan();//扫描键盘

if(t2_flag==1)//当1s时间到达时

{

t2_flag=0;//标志位置0

/*分辨率360时测定转速数据*/

x_tmpdate[5]=1*collect_x/6/100;//百位60*collect_x/360/100;

x_tmpdate[6]=1*collect_x/6/10%10;//十位

x_tmpdate[7]=1*collect_x/6%10;//个位

y_tmpdate[5]=1*collect_y/6/100;//百位

y_tmpdate[6]=1*collect_y/6/10%10;//十位

y_tmpdate[7]=1*collect_y/6%10;//个位

z_tmpdate[5]=1*collect_z/6/100;//百位

z_tmpdate[6]=1*collect_z/6/10%10;//十位

z_tmpdate[7]=1*collect_z/6%10;//个位

/*if(x_speed>4)

{

x_tmpdate[5]=x_tmpdate[5]/2;

x_tmpdate[6]=x_tmpdate[6]/2;

x_tmpdate[7]=x_tmpdate[7]/2;

}

*/

/*计数变量置位*/

collect_x=0;

collect_y=0;

collect_z=0;

}

if(t4_flag==1)

{

display(x_tmpdate);

}

if(t4_flag==2)

{

display(y_tmpdate);

}

if(t4_flag==3)

{

display(z_tmpdate);

}

}

}

voidkeyscan()//读键盘值

{

unsignedchark,k_temp;

k=0xfe;

do

{

P0=k;

k_temp=P0;

if(k!

=k_temp)

{

switch(k_temp)

{

case0x7e:

{EA=1;TR2=1;ET2=1;x_speed=8,y_speed=8,z_speed=8;fx_x=1;fx_y=1;fx_z=1;}break;//启动

case0x7d:

{EA=0;TR2=0;ET2=0;x_speed=200;y_speed=200,z_speed=200;}break;//停止

case0x7b:

{x_speed=200;}break;//x停止

case0x77:

{x_speed=8;}break;//x启动

case0xbe:

//x轴加速

{

while(P0==0xbe);

if(x_speed>1)

x_speed=x_speed/2;break;

}

break;

case0xbd:

{

while(P0==0xbd);

if(x_speed<64)

x_speed=x_speed*2;break;

}

break;//x轴减速

case0xbb:

{fx_x=1;break;}//x轴正向

case0xb7:

{fx_x=0;break;}//x轴反向

case0xde:

//y轴加速

{

while(P0==0xde);

if(y_speed>1)

y_speed=y_speed/2;break;

}

break;

case0xdd:

{

while(P0==0xdd);

if(y_speed<64)

y_speed=y_speed*2;break;

}

break;//y轴减速

case0xdb:

{fx_y=1;break;}//y轴正向

case0xd7:

{fx_y=0;break;}//y轴反向

case0xee:

//z轴加速

{

while(P0==0xee);

if(z_speed>1)

z_speed=z_speed/2;break;

}

break;

case0xed:

{while(P0==0xed);

if(z_speed<64)

z_speed=z_speed*2;break;

}

break;//z轴减速

case0xeb:

{fx_z=1;break;}//z轴正向

case0xe7:

{fx_z=0;break;}//z轴反向

default:

break;

}

}

k=_crol_(k,1);

}while(k!

=0xef);

}

voidT2ISR(void)interrupt5//T2定时器,输出驱动脉冲

{

TF2=0;

TL2=(65536-1000)%256;

TH2=(65536-1000)/256;

count_x++;

count_y++;

count_z++;

if

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1