50课件五十悬挂运动控制系统.docx
- 文档编号:8414658
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:31
- 大小:110.73KB
50课件五十悬挂运动控制系统.docx
《50课件五十悬挂运动控制系统.docx》由会员分享,可在线阅读,更多相关《50课件五十悬挂运动控制系统.docx(31页珍藏版)》请在冰豆网上搜索。
50课件五十悬挂运动控制系统
悬挂运动控制系统
陈松节朱荣华金恬
摘要:
本系统由AT89C52单片机控制模块、按键和LED显示模块、步进电机驱动模块、光电检测模块和直流变压模块等部分组成。
我们采用KeilC51单片机C语言应用程序编写了有关程序,程序可读性强,可移植性强,利于修改控制。
我们用四个按钮通过加减输入坐标点参数(X,Y),通过LED实时显示,读入数据后实时计算采样点坐标及吊绳长度改变等参数。
另外,用十六进制表示输入的坐标点,这样可以输入(0,0)和(153,153)之间的任意点坐标,使该系统的应用范围大于原任务的需求,并有按钮确认开关。
采用的步进电机35BYJ46A价格便宜,转角比较精确,可以通过计算步数来控制拉线的长度,从而减小时间造成的误差。
由于所用器件的工作电压有12V和5V两种,我们设计制作了12V—5V之间的变压电路,误差极小。
整个控制系统完全浓缩在一块15cm×10cm的万用板上,但布线比较清晰,模块区域明确,充分体现了“低成本、效率高、有创意”的设计实验理念。
Abstract
Thissystemwhichwedesignedincludes5parts:
SCMmodulecontrolledbyAT89C52,keyboardandLEDdisplaymodule,stepmotordrivingmodule,photoelectricaldetectingmoduleanddirectcurrenttransformationmodule.WeprogrammedandtestedtheapplicationusingtheKeilC51,whichisofgreatreadabilityandeasilytransplantedandperfected.TheX-coordinateandY-coordinateareinputtedthroughfourkeyboards,whichcanchangethevaluesofhexbyaddingoneandreducingone,thenconformthem.Bytheway,wecaninputthepointbetween(0,0)and(153,153)hangingonthehexfigure.Wehavetwostepmotorscalled35BYJ46Atocontrolthelengthoflines.Inaddition,wehavetotransform12Vto5Vtosatisfysomechips.Inthisway,wecanoperatethesysteminonemulti-circuit-boardpreciselyandconvenientlywithlessexpense,
totheaimwhichis“lowercost,higherefficiency,moreinnovation”.
一、方案比较与论证
1、电压变换方案
由于本系统所用到的芯片的驱动电压为5V和12V两种,例如步进电机的驱动电压为12V,而单片机的驱动电压为5V。
为了不添加新的电压源而使电路系统变得复杂,我们决定设计一个直流变压电路,将12V变为5V。
方案一:
利用串连分压设计一个混联电路,在其中一个支路中串连一个可变电阻使其分掉7V电压。
优点:
电阻廉价,而且原理简单。
缺点:
电阻会无谓地消耗一部分电能,对电能的浪费较大。
这不是我们的初衷,而且调节电阻相对麻烦,因为模拟电路往往会存在一些莫名其妙的问题,所以这一方案并不可取。
方案二:
利用L7805CV稳压管电路实现电压的变换,电路图如下所示:
图中多余的电压通过热能散发,电解电容的作用是滤波,使输出电压趋于稳定。
我们认为,既然电能损耗基本相同,那么相对于方案一,方案二的输出更精确,而且不需调节,电路也比较简单,是以一串联电路为主干的电路,这是由7805的特性决定的。
基于以上考虑,我们选择方案二实现电压变换。
2、步进电机驱动方案
本系统是实现悬挂运动系统控制的基础。
首先是在驱动电机的选择上,我们为什么要选择步进电机,而不是直流电机或是舵机?
原因在于,一、虽然我们可以通过控制直流电机的驱动电压大小或是PWM脉宽来调节其速度,由于技术原因,我们不可能也没必要在该电路系统中设置过多的电压变换装置,而且更重要的是直流电机的转动误差太大,无法保证我们的精度要求,所以我们放弃了用直流电机拉线的想法;二、舵机可以实现精确转角,驱动电压一般为6V,可以为此再加一个变压装置,5V电源也能勉强驱动,但是舵机的转动过于迅速,整个过程将充满抖动,而且让我们否定这一方案的原因是舵机的转角一般只有0-180度,不能实现大范围拉线。
综上所述,我们选择了步进电机。
它是一种交流电机,控制精确度高,驱动脉冲频率决定速度,而每个脉冲使得步进电机移动一步,用来定角度。
缺点在于,这种电机输出功率较小,负载能力低。
所以步进电机可以用在载荷不大,定位精确的场合。
题中物体的重量约为120g,基本满足要求。
3、按键、LED显示方案
这是基础部分的内容。
我们原计划坐标点的参数用五个数码管显示,即X坐标值用两个,显示00-80,Y坐标值用三个,显示00-100。
经过反复研究,我们觉得并不需要为了显示一个不大可能用到的三位数而多用一个I/O口。
因为我们选用的AT89C52功能不是很强大,那么为了维持原要求,我们选择了常用的显示方案,就是把要显示的参数转化为十六进制数,各用两个数码管显示。
因为单片机中的运算均为二进制运算,而转化成为十六进制数十分简单,两位十六进制数的转换口算即可解决。
这对于尽量有效利用宝贵的I/O口是很有用的。
对于按键同样存在这样的问题。
我们原计划用10个按键分别对应于0-9的输入,再加一个X-Y之间的切换键。
当然,如果改用十六进制计数,就要增加6个按键对应A-F,也就是说,最少需要11个I/O口。
考虑到以后发挥部分的功能扩展,我们不得不另觅蹊径。
根据以往的经验,我们决定只用5个按键,其中4个按键每按一次分别表示X、Y坐标所对应的值加一或减一,虽然按键的次数增加了一些,但是我们节约了I/O口,权衡之下,利大于弊。
第五个按键相当于计算机中的“Enter”键。
即输入X、Y坐标参数时,单片机的时钟停止。
只有当参数输入完毕后,再按第五个键,单片机才开始工作,这样既符合操作规则,又可以减小误差。
4、单片机控制方案
AT89C52的管脚分布图如下所示:
对应的晶振是24.0000MHz,我们有公式如下:
计数初值=0xFFFF-计数时间÷(12÷24.0000MHz)
=0xFFFF-计数时间×2000000
我们的单片机程序主要分以下几个模块:
1)、指令输入模块:
读按键输入的坐标点参数X和Y,按键确认后开始工作;
2)、中断模块:
利用定时器/计数器0和定时器/计数器1的中断控制左右两个步进电机转动程序的定时;
3)、步进电机驱动模块:
根据我们的实验,左右两个步进电机的减速比不同,左边为19.5cm/16000步=19.5cm/2000圈,右边为20.2cm/16000步=20.2cm/2000圈,计数值越多计算误差越小。
我们通过程序将线长的计算转化为计算步进电机转动的步数和圈数,与预先设定的步数和圈数比较。
如果小于基准圈数,则电机正转;如果大于基准圈数,则电机反转;如果等于基准圈数,则在此附近作动态平衡。
步数的处理与圈数雷同。
4)、执行模块:
依照运算转换模块的返回值,调用函数控制步进电机的转动(包括慢启动)。
5、光电检测方案
我们初步决定用4对发光二极管和光敏电阻作为探头的相关电路构成的光电检测系统来实现发挥部分的要求
(2)。
安装位置为绘图笔上面两个探头,下面两个探头,同一水平线上的探头之间距离为1.5cm。
上面的两个观点探头可以用来探测连续黑线用。
逻辑函数表为:
左右光电探头反应
物体实际运动情况
黑
黑
物体沿黑线运动
黑
白
物体偏右,改为偏左运动
白
黑
物体偏左,改为偏右运动
白
白
物体不在黑线上,沿原方向退回
后两个光电检测探头则是便于检测间断黑线的,原理大致相同。
二、系统设计与理论分析
总体设计系统框图如下所示:
经过分析讨论,整个系统的电路结构并不复杂,关键还是在控制软件。
因此,单片机控制我们只是用必要的电器元件制作了最小系统板,经过调查,市面上暂时无法购到外部Flash,所以编程的同时我们都在尝试着优化程序,节省内存。
单片机的最小系统包括AT89C52芯片及其管座,一个24.0000MHz的晶振,两个33pF的瓷片电容和一个10μF的电解电容,电容的作用主要是滤波、退耦、稳压。
其余模块的设计方案经讨论决定完全按照原方案执行,不再赘述。
附上光电检测电路,如图所示:
三、方案实现
整个运动系统需要用到两个步进电机。
我们所用的35BYJ46A步进电机有五个端口,分别为+12V驱动电压和A、B、C、D四个脉冲使能端,共要用到单片机的8个I/O口,我们选定为P0口实现。
考虑到I/O输出的电流相当微弱,我们又在I/O口和步进电机之间串接了芯片ULN2803A,用来放大电流,从而达到控制的目的。
电路如上图所示。
在C语言程序中,我们用二维数组Coordinates[][2]存放采样点的横、纵坐标值。
基本要求
(1)中输入目标坐标点的横、纵坐标值,根据不同的算法计算合适的采样点的坐标存入数组中以备调用,另外预先存入部分坐标点,以提高程序执行的效率。
按键模块通过对按键所对应的单片机管脚电位高低的判断来检测按键是否被按下。
为了充分利用AT89C52的有限资源,我们用P1.1、P1.2、P1.3、P1.4对应控制一个共阴的四位数码管的四位共阴极,哪个置0,就相应显示哪一位;又用P2.0-P2.6控制单个LED的七段显示。
按键控制的关键在于如何消除实验过程中抖动或是误碰导致的误差。
我们用P2.7,P1.5,P1.6,P1.7对应控制四个加减一的按键,而P1.0控制确认按钮,考虑到对数码管显示的置位会影响到位于同一P口的按键管脚,所以我们先将各按键对应的管脚用软件将电位拉高,然后调用push()函数判断按键是否被按下。
如果在一段适当的延时前后该按键的对应管脚都是低位,说明按键被按下,延时的时间需要调试。
另外,数码管的显示也应加入合适的扫描延时,短了则出现数码重叠,难以分辨;长了则反应缓慢。
接着将push()的返回值传递给check()函数,通过对参数ADD_X,SUB_X,ADD_Y,SUB_Y的分别检测,判断对X坐标值Axis_X和Y的坐标值Axis_Y做了何种操作,进行相应的加减。
而显示时,数码管的值为Axis_X和Axis_Y的十六进制表示。
为何不直接将十六进制应用于每一位是基于提高效率和压缩内存的考虑。
简要示意图如下:
以后几项要求均要用到步进电机的驱动,步进电机的驱动首先必须考虑到慢启动,否则会导致失步现象。
我们的主要控制函数Motor_Servo()读取目标坐标,并将其转化为电机转动的圈数,拍数,将当前拍数与目标拍数比较,然后确定电机的转动方向。
简要示意图如下所示:
对于具体的基本要求
(2),只需调用数组Coordinates[][2]中预先设定的采样点(当然也可以现场输入,但需要Matlab做一个可人机对话的界面),就可绘出指定曲线,而且误差完全由采样点的多少决定。
本来决定物体安装油性笔,这样显示比较明显。
但是考虑到后面的发挥部分,如果用同样的黑色笔,那么极有可能对光电检测有所干扰,所以我们认为在不妨碍检查的条件下,用6B黑度的铅笔绘制物体运动轨迹。
对于基本要求(3),我们采用用正多边形近似圆的方法,通过理论计算,如果只在圆周上取4个采样点,假设相邻两点间走直线,则理论误差为7.32cm;若去6个点,则理论误差为3.35cm,已经满足要求了,但是经过实际测试后,我们最后决定至少采用16个采样点,实际误差也在3cm左右。
而且,对于给定的不同坐标点,我们的算法通过坐标的平移变换实现采样点的平移变换,大大简化了计算的复杂度。
对于基本要求(4),如果尽可能使物体两点之间走直线,那就误入歧途了。
事实上,经过试验,我们发现最短时间运动路线并不是直线,因为直线轨迹需要其中一个步进电机改变转动方向,而最短时间路线必定是电机转动方向不变的路线。
又由于题目对时间的要求并不高,所以我们也无需过多考虑物体的运动路线。
调试是决定本题完成与否的关键。
我们在调试中花费的时间是最多的。
除了对一些延时时间的调试,主要是对两个步进电机拉线的联合调试。
四、功能测试及结果分析
1、本系统的主要功能
基础部分:
(1)该系统能够通过键盘设定空白坐标纸上任意点的横、纵坐标,并显示之。
(2)该系统能够在此范围内作自行设定的运动,且运动轨迹长度不小于100cm,物体在运动过程中能够在坐标纸上画出运动轨迹,时间一般控制在300s。
(3)该系统能够以坐标纸上任意设定的点为圆心、50cm为直径画圆(在坐标纸范围内),时间一般控制在300s内。
(4)该系统能从左下角的坐标原点出发,任意设定的另一个坐标点,时间一般控制在100s内。
发挥部分:
(1)由于时间限制没有实现。
(2)考虑采用光电传感器来探测黑线,传感器已经调试成功,但由于时间限制,没有加上。
2、测试仪器及测试结果
我们用到的测试仪器主要有:
双踪示波器SS-7802A(20MHz),数字万用表HONEYTEKA830L,直流稳压源DF1731SB2A,Keil程序烧解器,秒表,3m卷尺等。
基本要求部分测试数据如下表所示:
时间(单位:
s)
次数
(2)执行时间
(3)执行时间
(4)执行时间
1
233
265
76
2
232
260
78
3
223
270
77
4
248
263
74
5
250
265
79
平均值
237.2
264.6
76.8
3、误差分析
我们认为系统的误差主要存在于机械的粗糙中,我们所购置的滑轮比较大,安装过程中由于测验板的质量导致滑轮的安装和步进电机的安装都存在约1cm的误差,考虑到尼龙线的粗度与滑轮半径、步进电机的转轴半径相差较大,物体运动过程中会有较大晃动。
而且两个步进电机的减速比不同,这也带入了不小的误差。
由于本系统画圆的算法为正多边形近似,近似的边数越多,误差越小。
但是因为AT89C52单片机的内存只有8K,采样点的数目有限,我们尽量限定物体的运动轨迹和预计轨迹之间的偏差不超过4cm.。
总的说来,因为AT89C52单片机的功能有限,采样点不可能取得太多,物化行走轨迹不光滑。
显然,如果我们可以应用功能更加强大,I/O口更多的芯片,例如MSP430系列单片机,我相信这一系统的精度会得到大大提高。
5、后期计划
首先我们期望能在后期的制作中完成发挥部分的设计并调试成功,并在此基础上提高整个系统的精度,选择更好的电机和画笔,改进机械结构和程序设计。
因为汉字中有一部分是可以用行书一笔写完的,我们考虑可否实现用这一系统写出这一类汉字。
当然,如果我们能设计出提笔、落笔的转换,那么我们就可以写出大部分的汉字,英语单词则更不在话下了。
这是一个很深的话题,研究它是一件很有意思、也很有成就感的事情。
附录程序:
程序一:
自动运行基础题二
#include
#include
//1msF830
//8msC180
//16ms8300
//32ms0600速度太慢
/*P2:
P2_0,P2_1,P2_2,P2_3,P2_4,P2_5,P2_6用于控制七段数码管*/
//P1:
P1_1,P1_2,P1_3,P1_4--扫描四数码管
//Frequency=24.0000MHz
//P2_7,P1_5,P1_6,P1_7对应于4个按钮
/////////////////////////////////////////////////////////
#defineADD_XP2_7
#defineSUB_XP1_5
#defineADD_YP1_6
#defineSUB_YP1_7
#defineCONFIRMP1_0
#defineMotor_OUTP0
#defineTimer0_TH0xF2
#defineTimer0_TL0x00
#defineTimer1_TH0xF2
#defineTimer1_TL0x00
#defineMAX_CYCLE27
unsignedcharDir_Left_Motor=1;
unsignedcharDir_Right_Motor=1;
unsignedcharLoop_TMP_Left_Motor=0xe0;//11100000
unsignedcharLoop_TMP_Right_Motor=0xe0;//11100000
unsignedcharLeft_Motor_OUT;
unsignedcharRight_Motor_OUT;
charcodePort1[4]={253,251,247,239};/*用于扫描显示,最后一位,第三,第二,第一*/
unsignedcharAxis_X,Axis_Y;
unsignedcharCoordinates[][2]=
{
{0,0},
{10,10},{12,12},{14,14},{16,16},{18,18},
{20,20},{20,24},{20,28},{20,32},{20,36},
{20,40},{24,40},{28,40},{32,40},{36,40},
{40,40},{40,36},{40,32},{40,28},{40,24},
{40,20},{36,20},{32,20},{28,20},{24,20},
{20,20},
};
unsignedcharCoordinates_Cycle=0;
unsignedlongBeat_Left_Motor=96382;//初始值(0,0)
unsignedlongBeat_Right_Motor=123548;
unsignedintdestination_left_round;
unsignedintdestination_right_round;
unsignedcharConfirm_flag=0;
////////////////////////////////////////////////////////////////////////////////按键模块
unsignedcharpush(bitkey)
{
unsignedinttemp_delay=0x9000;
unsignedcharflag=0;
if(!
key)
{//检测到P1_0为低电平
while(temp_delay-->0);//软件延时消除抖动
if(!
key)
{//如果仍为低电平,则认为是key被按下
flag=1;
}
}
return(flag);
}
unsignedcharcheck(bitADD_X,bitSUB_X,bitADD_Y,bitSUB_Y,bitCONFIRM)
{
if(push(ADD_X))
{
if(Axis_X!
=80)
Axis_X++;
elseAxis_X=0;
}
if(push(SUB_X))
{
if(Axis_X!
=0)
Axis_X--;
elseAxis_X=80;
}
if(push(ADD_Y))
{
if(Axis_Y!
=100)
Axis_Y++;
elseAxis_Y=0;
}
if(push(SUB_Y))
{
if(Axis_Y!
=0)
Axis_Y--;
elseAxis_Y=100;
}
if(push(CONFIRM))
Confirm_flag=1;
return(Axis_X);
return(Axis_Y);
}
Motor_Servo(void)
{//读取目标坐标,并将其转化为电机转动的圈数,拍数,将当前拍数与目标拍数比较,然后确定电机的转动方向
unsignedchartemp_flag=0;
unsignedchardestination_X=Coordinates[Coordinates_Cycle][0];
unsignedchardestination_Y=Coordinates[Coordinates_Cycle][1];
destination_left_round=(sqrt((destination_X+15)*(destination_X+15)+(116-destination_Y)*(116-destination_Y)))*103;//103roundspercm
destination_right_round=(sqrt((95-destination_X)*(95-destination_X)+(116-destination_Y)*(116-destination_Y)))*103;//103roundspercm
if((Beat_Left_Motor/8)==destination_left_round)
{
temp_flag=1;
}
elseif((Beat_Left_Motor/8) Dir_Left_Motor=1; else Dir_Left_Motor=0; if((Beat_Right_Motor/8)==destination_right_round) { if(temp_flag==1) Coordinates_Cycle++; } elseif((Beat_Right_Motor/8) Dir_Right_Motor=1; else Dir_Right_Motor=0; } voidtimer0()interrupt1 {//左电机 unsignedchartemp; Left_Motor_OUT=((Loop_TMP_Left_Motor&0x80)>>3)|(Loop_TMP_Left_Motor&0x20)|((Loop_TMP_Left_Motor&0x08)<<3)|((Loop_TMP_Left_Motor&0x02)<<6); if(Dir_Left_Motor) { temp=Loop_TMP_Left_Motor&0x01; Loop
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 50课件五十 悬挂运动控制系统 50 课件 五十 悬挂 运动 控制系统