51单片机的三维平台控制方案.docx
- 文档编号:9140744
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:27
- 大小:149.54KB
51单片机的三维平台控制方案.docx
《51单片机的三维平台控制方案.docx》由会员分享,可在线阅读,更多相关《51单片机的三维平台控制方案.docx(27页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 三维 平台 控制 方案