while(!RX); TR1=1; while(RX); TR1=0; Conut(); }
其中,StartModule()和其程序清单如下:
//当RX为零时等待 //开启计数
//当RX为1计数并等待 //关闭计数
Conut()子程序的功能分别为启动超声波模块和距离计算子,
启动超声波模块子程序:
void StartModule() {
TX=1; //向超声波模块发送启动信号 _nop_(); //短延时约15us _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;
}
计算子程序:
void Conut(void) {
unsigned int a,b,c,time;
time=TH1*256+TL1; //利用定时器1对高电平计时 TH1=0; TL1=0;
26
S=time*17/100; //算出来是MM 12M晶振 if(flag==1) //超出测量,并显示“--.-cm”。 {
flag=0;
DisplayOneChar( 2, 1 ,num[13]); DisplayOneChar( 3, 1 ,num[12]); DisplayOneChar( 4, 1 ,num[13]); DisplayOneChar( 5, 1 ,num[13]);
} else {
a=S00/100; //a保存十位数字 b=S000/10; //b保存个位数字
c=S000; //c保存小数点后第一位数字 } }
测量距离的原理是:声波在空气中的传播速度来为340m/s,只需要知道声波的传播时间t就可以计算得到传播距离长度。本设计采用STC89C52主控芯片以及12M的晶振,其定时器每计一个脉冲的时间是1us,故距离计算公式为:
s= t *17/100 (4-1)
单位是mm。
当所测距离在精度范围内时,则显示距离,取出所测距离的百位、十位以及个位的值,分别保存在变量a、b、c中,并在LCD12864上显示出来。
4.3.4 抓捕与提升模块的软件设计
抓捕与提升模块实为两个模块,即抓捕模块和提升模块。为控制方便,将两个模块的程序写在了同一子程序中,故在此集中介绍。
1. 舵机的控制
抓捕模块为避免损伤货物,需要对角度进行精确控制,故使用舵机对抓手进行控制,本设计中采用辉盛MG946R舵机进行控制。
舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms—2.5ms范围内的角度控制脉冲部分,以90°角度伺服为例,那么对应的控制关系是这样的:
0.9ms---------0° 1.5ms---------45°
27
2.1ms---------90°
如果舵机精度够高,则转动的角度与高电平的宽度就会接近一次函数Y=75X-67.5。如图4.8所示:
角度9000.92.1t/ms图4.8舵机张合角度与高电平关系的函数图
本设计采用定时器2产生100us精确延时,循环200次,即可得到20ms的时基周期。如程序清单所示,变量pwm_val ++中的值与push_val进行比较,当pwm_val ++小于 push_val 中的值时,向舵机控制端口输出高电平。当pwm_val ++中的值大于 push_val 中的值时,高电平时间到,向舵机控制端口输出低电平。另外,当pwm_val ++中的值大于200时,则给pwm_val ++赋值为0,如此往复循环。再根据所夹持调整变量push_val的值(其值域为9~21。push_val中的值越大,则抓手张开的角度越大,反之,张开的角度越小),以达到精准控制抓手目标。舵机控制清单如下:
void time2()interrupt 5 using 2
{ TF2=0; //软件清除定时器2的中断标志 timer++; pwm_val ++;
if(pwm_val <=push_val) //高电平时间控制 else
if(pwm_val >=200)
pwm_val =0; //循环 }
2. 提升机的控制
我们采用L9110H电机驱动芯片对提升机进行驱动,L9110H的引脚图如图4.3所示。 L9110H的1脚(OA)和2脚(OB)分别为A路、B路的输出管脚,硬件中两管脚与直流电机的两端相连接,可用来控制电机的正反转。2脚和3脚均为VCC,连接+5V,给芯片供电,而5脚和8脚均为GND,连接地线。6脚(IA)和7脚(IB)分别为A路、B
28
//定时器100us为准。在这个基础上延时
Sevro_moto_pwm=1;
Sevro_moto_pwm=0; //低电平时间
LG9110路输入管脚,连接到单片机的P0.0、P0.1或P0.2、P0.3端口。其具体控制升降如表4.2.3所示。
主要特点
? 宽电源电压范围:2.5V~12V
? 每通道具有800mA连续电流输出
OA18GND 能力
? 较低的饱和压降 VCC27IBVCCOB3465IAGND
图4.9 LG9110的管脚图
? TTL/CMOS输出电平兼容,可直 接连CPU
? 控制和驱动集成于单片机IC中 ? 具备管脚高压保护功能
表4.3 LG9110升降抓手状态表 IA 1 0 1 0
IB 1 0 0 1
状态 停止 停止 上升 下降
3.提升机与抓捕模块的配合使用
由于现实生活中,仓库货架不只一层,本设计为尽量贴近实际,保证系统的实用性,设计了提升机模块,使得抓捕模块可以根据需要调整垂直高度。
抓捕模块程序流程图如图4.10所示。当抓捕器系统找到取货货架A时,控制舵机进行抓捕。首先,提升机动作,将抓捕模块提升至一层,运动平台前进一小段,以保证抓手能抓到货物,然后机械手张来并抓取货物,之后运动平台向后退,进行掉头,继续循迹前进并寻找放置货物的货架B。当抓捕器系统找到放货货架B时,控制舵机放置货物。先将货物提升至二层,再前进一小段以保证货物能放到货架上,然后机械手张开,小车后退掉头,循迹前进返回原点。
下面是抓捕与提升模块部分程序清单与注释(程序太长,仅用抓取货物作说明)
void Capture(void) {
if (c_p==0) //判断抓取还是放置货物
29
提升与抓捕子程序入口取货还是放货抓货放货提升机升至一层提升机升至二层前进一小段前进一小段抓取货物放置货物后退一小段后退一小段掉头抓手降至一层掉头 图4.11 舵机控制抓手程序流程图
{c_p=1;
controlcar(0); //小车停 DisplayListChar(0,3,carstatus7); IN5=1; IN6=0;
delay(1600); //等待提升完成 IN5=1; IN6=1;
//抓手停在一楼
//显示字库中的中文
//向上提升至1层
返回 push_val_left=10; //抓手张到最大 controlcar(1); //移动平台前进一小段 delay(200); controlcar(0); TR2= 1; delay(500);
//定时器2启动
30