版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
年6月23日六脚爬虫机器人机械结构设计和控制系统搭建资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。摘要本文详细介绍了六脚爬虫机器人的机械结构以及控制程序的编写。机械结构采用了对称式设计,结构简单;其行走功能由六只脚、18个舵机实现,自由度较高,稳定性、灵活性较好。控制程序的主体是C语言。包括基本步态的编写,以及传感器的在机器人上的高级应用,这样,机器人在满足基本行走运动的同时,也能感知外界环境,并经过控制器对接收到的外界信号进行处理,并控制机器人运动。关键词:对称式结构,舵机控制器,步态,传感器
Abstract ThethesisdescribesindetailthatthemechanicdesignofHexcrawlerandthecompilingofcontrolprogram.Thestructureoftherobotisinsymmetricexpression,asimplemechanism;thefunctionofwalkingissupportedbysixlegs,andeighteenmotors,withmultipledegreesoffreedom.Besides,itisofhighstabilityandflexibility.TheprogramtocontroltherobotiswritteninClanguage,includingbasicgait,theadvancedapplicationofsensors.Thereby,therobotcanwalkinseveralgaits.Atthesametime,itcansensetheconditionaroundit.Then,itwillprocessthedataitreceived,andcontrolthemotionoftherobot.Keywords:symmetricexpression,PSCU,gait,sensor
目录摘要 IAbstract II目录 III1绪论 -1-1.1课题来源 -1-1.2本课题的目的及其意义 -1-1.3国内外发展现状 -1-1.4本课题的研究内容 -5-2机械结构设计介绍 -6-2.1功能需求与分析 -6-2.2材料选择与结构设计介绍 -6-3舵机控制板原理与应用 -9-3.1舵机原理介绍 -9-3.2舵机控制板原理介绍 -10-3.3如何使用舵机控制板 -12-3.4控制板程序编写 -14-4STM32开发板介绍与程序编写 -18-4.1STM32F107芯片简介 -18-4.2软件与编程初始准备 -18-4.3GPIO与AFIO设置与应用 -18-4.31GPIO设置与应用…………………………..184.32AFIOI/O口重映射…………………...224.4USART设置与应用 -22-4.5外部中断设置与应用 -26-4.6系统时钟设置与应用 -29-4.61系统时钟简介与应用…………………..294.62定时器配置……………………314.7机器人行走步态程序编写 -32-4.71机器人行走步态简介……………………334.72三脚步态……………………….354.73四脚步态………………………….……………374.74单脚(波动)步态……………………384.75转弯与横爬步态…………….404.8多传感器应用与程序编写 -43-4.81指南针传感器……………….434.82红外、光敏传感器……………………….454.83柔性力传感器……………….464.84温湿度、发声、射频识别(RFID)传感器………………..484.85无线(Zigbee)传感器………………..494.86超声传感器……………………525总结 -55-致谢 -56-参考文献 -57-1绪论1.1课题来源 本项目来源于华中科技大学与伍斯特理工学院合作的WPI项目。1.2本课题的目的及其意义机器人是高级整合控制论、机械电子、计算机、材料和仿生学的产物。现在,机器人已经发展到一个全新阶段,各种机器人应运而生,从简单地追求功能到神似,到个性化;从单单发展工业机器人到工业、家用机器人全面开花,并取得了长足进步。六脚机器人作为行走机器人的一种,具有结构简单,稳定性好等优点,而本课题也并未在很高深的机器人理论花大量功夫,而更多地着眼于为大专院校提供机器人教学平台,或者用于科技馆展览。本课题所设计的机器人最大的特点是:理论通俗易懂、操作方便、便于二次开发。对于一些入门者(初步掌握控制论、机械设计、机械电子只是)来说,很容易便能被引领入机器人研究的殿堂。1.3国内外发展现状对于仿生机器人,特别是多足机器人,国内外均有大量研究。1990年,美国卡内基梅隆大学研制出用于外星探测的六脚步行机器人AMBLER。该机器人采用了新型的”腿机构",并由一台32位的处理机来规划系统运动路线、制运动和监视系统的状态。但由于体积和质量太大,最终没被用于行星探测计划。1993年,卡内基梅隆大学开发出有缆的八足步行机器人DANTE,用于对南极的埃里伯斯火山进行了考察,其改进型也在实际中得到了应用。1994年二代对距离安克雷奇145km的斯伯火山进行了考察,并传回了各种数据及图像。日本对多足步行机的研究从20世纪80年代开始,并不断进行着技术创新,随着计算机和控制技术的发展,其机械结构由复杂到简单,其功能由单一功能到组合功能,并已研究出各种类型的步行机。主要有四足步行机、爬壁机器人、腿轮分离型步行机器人和手脚统一型步行机器人。1994年,日本电气通信大学的木村浩等研制成功四足步行机器人Patrush二代。该机器人用两个微处理机控制,采用直流伺服电机驱动,每个关节安装了一个光电码盘,每只脚安装了两个微开关,采用基于神经振荡子模型CPG的控制策略,能够实现不规则地面的自适应动态步行,显示了生物激励控制对未知的不规则地面有自适应能力的特点。~,木村浩等又研制成功四足步行机器人Tekken。该机器人用一台PC机系统控制,用瑞士Maxon直流伺服电机驱动,能适应中等不规则表面的自适应步行。中国对于多足机器人的研究起步则较晚。1989年,北京航空航天大学在张启先教授的指导下,孙汉旭博士进行了四足步行机的研究,试制成功一台四足步行机。钱晋武博士研究地壁两用六脚步行机器人,并进行了步态和运动学方面的研究。1990年中国科学院沈阳自动化研究所研制出全方位六脚步行机,不但能在平地步行,还能上楼梯。1991年,上海交通大学马培荪等研制出JTUWM系列四足步行机器人。,马培荪等对第一代形状记忆合金SMA驱动的微型六脚机器人进行改进,开发出具有全方位运动能力的微型双三足步行机器人其每条腿的自由度变为3个自由度。哈尔滨工程大学的孟庆鑫、袁鹏等进行了两栖仿生机器蟹的研究,经过研究多足步行机的单足周期运动规律,提出适合于两栖仿生机器蟹的单足运动路线规划方法,建立了生成周期运动的神经振荡子模型。当前市场上几款六脚机器人对比如下:(一)DEPUSHHexCrawlerHexCrawlerCompanyDEPUSHMaterial5052alloyaluminum,1/16”thickwithclearanodizingLegMovement2DOFDimensionsBody:49.68x40cm,Height:between12.3and15.2cmCost$350+(二)LynxmotionRB-Lyn-248RB-Lyn-248CompanyLynxmotionMaterial5052alloyaluminum,1/16”thickwithblackanodizingLegMovement3DOFDimensionsBody:19.1x14.9cm,Height:between5.1and13.3cm,GroundClearance:upto8.9cmCost$261.35+(三)HexCrawlerHDATSHexCrawlerHDATSCompanyDEPUSHMaterial5052alloyaluminum,1/16”thickwithclearanodizingLegMovement3DOFDimensionsBody:52x49.7cm,Height:between12.3and15.2cm,Groundclearance:12.7cmCost¥10,000(about$1,500)其中HexCrawler一代机器人使用的编程软件为Parallax公司提供的教育发展版芯片。图1.1为Phoenix公司提供的六脚机器人,图1.2则为Depush公司的六脚机器人一代外形,其每个脚仅有两个自由度。图1.1PhoenixHexapod图1.2DEPUSHHexCrawler1.01.4本课题的研究内容六脚机器人基本结构的设计,首先使之能够实现三脚步态、四脚步态、波动步态等,以满足行走要求;然后,能够感知外界环境的变化,实现避障报警等功能;最后,实现对机器人的远距离控制。具体要求为:设计机器人机械结构,使其能够完成前进,后退,左转,右转,侧移,扭动身躯等简单动作;能够完成抬脚,简单舞蹈等动作;1、编写机器人各种基本动作的软件代码,使其能完成以上动作;2、机器人能够接受电脑无线控制,编写相应无线控制程序;3、机器人可感知外界环境,编写相应传感器处理程序;4、对所有程序进行综合处理,协调各程序之间的关系。2六脚机器人机械结构设计介绍2.1功能需求与分析作为六脚仿生机器人,在追求神似的同时,关键在于能否像爬虫一样完成各种行走动作。本课题对机械结构的要求不高,但需要满足下面几点:灵活度高、稳定性好、能够实现多足机器人的基本步态。针对这几点,同时按照德普士公司的要求,再参照当前市面上存在的六脚仿生机器人,最终拟定的机械结构设计方案为:在DEPUSHHexCrawler1.0(图1.2)的基础上每只脚增加一个舵机,即将自由度由两个提升为三个。2.2材料选择与结构设计介绍根据当前市面上的六脚仿真机器人,本课题选用5052铝合金作为机器人的主要材料,这样机器人既能满足强度要求,也能满足轻便性要求。同时,对外表进行烤漆处理,显得厚实而稳重,富有质感。如图2.1为机械结构的总三维图。图2.1六脚机器人三维总图机器人整体上采用对称式结构,由六只脚和底架(身体)组成。每只脚有三个关节,每个关节处为采用舵机连接,可在固定平面内旋转180°,如图2.2所示。其中舵机1控制机器人脚前后摆动;舵机2控制机器人上下摆动;舵机3控制机器人内外伸缩。三个舵机配合即可实现机器人的走动。图2.2六脚机器人单脚结构图机器人身体(图2.3)、脚(图2.2)上均布满各种镂空图案,主要有两点作用:一、减轻机器人重量;二、增加机器人的美观度。由于机器人的完全对称性结构,其前后由认为设定,即图2.1中Leg1、Leg4在前,Leg3、Leg6在后。图2.3六脚机器人底架结构图机器人的主要尺寸为:机器人全长:500.0mm;底架(身体宽):228.0mm;舵机1(Leg1)距底架最前方距离:60.0mm;Leg1与Leg2距离:195.0mm;Leg1与Leg3距离:390.0mm;每只脚上舵机2与舵机3距离:120.0mm;舵机3与脚底距离:150.0mm。3舵机及舵机控制板原理与应用本章主要介绍舵机以及舵机控制板(PSCU)的原理、使用方法与程序编写。3.1舵机原理介绍舵机是一个经过输出轴的转动来控制物体转动的装置。它在特定编码的驱使下能够转动到工作范围内的任意给定位置。因为它的轻便,位置控制简易且精确,在机器人中使用尤多。多舵机的协调工作可满足机器人的多自由度要求。舵机能够实现0~180°的旋转,当轴处于正确位置时,舵机将停止运动;当所在位置不对时,电路则驱动电机运转到需求位置。舵机是采用比例调节方式控制速度。当舵机转动的距离大时,则加载在舵机上的能量就大,反之亦然。而舵机的转动角度控制是由加载在控制线上的脉冲周期完成的,即所谓的脉冲编码调制。舵机设定为每隔20ms接受一个脉冲,这样的话,实际脉冲长度就可用来控制舵机转动的角度。如图3.1,例如1.5ms的脉冲可使舵机转动90°。图3.1舵机转角与脉冲周期关系图本项目采用的事Hi-Tec公司生产的HS-322HD舵机,如图3.6。图3.6HS-322HD舵机其主要技术参数如下:■重量:43g■尺寸:40×20×36.5mm■拉力:[4.8V]3Kg.cm■拉力:[6.0V]3.7Kg.cm■转速:[4.8V]0.19sec/60°■转速:[6.0V]0.15sec/60°■计算电流:0.35A当舵机安装好后,需要获取其初始位置值,为编程做准备,具体可见3.3节关于PSCI软件的介绍。3.2舵机控制板原理介绍由上述机械结构介绍可知,本六脚机器人是经过控制18个舵机来实现机器人的运动的。但如何协调好各舵机的动作,让其满足功能需求?这就需要用到舵机控制板。舵机控制板按控制舵机数目(接口数)的多少,可分为8路舵机控制器,16路舵机控制器,32路舵机控制器等等。考虑到成本以及控制舵机的数量,本课题采用两块16路舵机控制器串联的方式来控制舵机。选用型号为PARALLAX公司提供的PropellerServoControllerUSB(#28830,简称PSCU)。如图3.2所示:图3.2舵机控制板PSCU具有下述多项特点:①可串联两块控制板实现32路舵机控制;②独立的螺旋式接线柱为控制板供电,舵机则可经过开关控制关停;③其所用固件开放源代码;④可经过USB接口或者串行通信接口编程;⑤舵机速度可控。PSCU规格及性能:①电源要求:逻辑电平5VDC@~60mA,4.8~7.5VDC控制舵机;②通信:异步串行通信@2400bps或者38.4kbps(TTL或USB);③工作温度:32~158°F(0~70°C);④尺寸:2.26x1.80x0.65in(57.3x45.7x16.5mm);3.3如何使用舵机控制板在使用控制板前,需经过螺旋式接线柱给控制板提供4.8~7.5V的直流电,同时为使舵机运动,还需给舵机提供5V的直流电。此项可经过USB接口(如图3.3)或者经过舵机控制板左上方的SerialIn处的杜邦针供电(TTL电平,如图3.4)。图3.3PSCU-USB供电电路连接图图3.4PSCU-主控制板供电电路连接图USB调试:①安装FTDIVCP驱动(下载地址:.com/usbdrivers);②安装PSCI软件(访问网址.com,并搜索28823)。双击软件图标,即可获得图3.5所示,连接好USB线,在界面上选择COM口,获取PSC版本,即可使用。图3.5PSCI控制界面图中每个channel的进度条,可发现对应舵机会向相应方向发生一定度数的旋转。这可用来进行舵机控制调试,从而获取舵机位置值,来书写步态。注意:图中数据在编入ARM程序中时,应先除以2倍,才是实际数据,即图中的中心出1500对应实际的750。更多功能可参照PARALLAX公司提供的PropellerServoControllerUSB说明文档。当使用双块板时,其连接方式为:首先将主板的SerialIn(两排,选上排)引出按高低电平信号线要求插在主控制板(STM32板)上,其中红色线接5V电源,黑色线接地,白色线接信号线,即PA9。然后将副板的SerialIn(上排)引出插在主板的SerialIn处(下排)。最后通上电源即可。了解了PSCI的基本功能,并按要求连接好电路后,首要做的就是将舵机位置的初始值找出。经过拖动进度条,并观察机器人各腿的位置,从而确定舵机初值。笔者提供的舵机初始值均为六脚与身体垂直时的值,且2、3关节夹角近似为90°。3.4控制板程序编写㈠基本工作准备与注意事项:前述工作准备停当,即可开始程序的编写。PARALLAX公司提供的说明文档中提供了BS2程序,需要经过C语言转译,才可供ARM板识别。首先注意的是PSCU板的默认波特率为2400bps,因此在编写串行通信程序时,应将串行通信的波特率设置为2400bps(具体见4.4节关于USART设置的介绍)。当然本控制板亦可经过程序设置,将波特率改为38.4kbps,具体内容下面会介绍到。另外,控制板接收的异步通信数据格式要求还有,正相,8个数据位,无奇偶校验位,1个或2个停止位。其次控制板分为主副板,则对应的舵机控制通道号即为0~31;即副板的通道号再原号基础上加16即可。如果按序连接舵机,可使编程变得较为简单,经过简单的数学关系进行数据处理,但线路凌乱,看起来不是很美观;本课题采用的是对称连线,即选用通道号0~8,23~31;当然,这样编程相对就复杂一些。最后关于主副板的界定还需提醒一句,由于硬件可能出现bug,实际上控制板可能通道号等没有按照说明书的来,在调试过程中,可多试几次,按照实际结果编程。本课题在调试过程中即出现了问题,实际的主副板是颠倒的,且必须将副板与主控制板(STM32)连接才可使用。㈡通信协议规则:PSCU为用户提供了多种控制功能,但每种控制字符串均是以!SC开始,以0x0D结束,中间有间隔4个主控制字符,下面将一一介绍:①位置命令——设置舵机的位置控制字符串为:”!SC”<channel><rampspeed><lowbyte><highbyte><CR>其中channel为通道号,即前述的0~31;rampspeed为一字节值,用于舵机转速控制,其变化范围为0~63,且数值越大,转速越小;lowbyte为舵机位置的低字节,highbyte为舵机位置的高字节。经过改变lowbyte与highbyte值即可改变舵机位置,其值变化范围为250~1250。位置命令控制板最基本的命令,往往也是唯一用到的功能。经过此命令,能够实现舵机按要求的转动,从而满足行走等多功能要求。②SBR——设置波特率控制字符串为:”!SCSBR”<mode><CR>其中mode是用来设置波特率的,0代表2400bps,1代表38.4kbps。控制板的默认波特率为2400bps,无需设置,但如果需要使用38.4bps的波特率进行通信时,可使用该程序对波特率进行更改。③RSP——返回位置值控制字符串为:”!SCRSP”<channel><CR>其中channel为通道号。与VER?一样,需要进行输入输出的设置,方能返回位置值,这对编程很有用处,能够经过读取位置值,判断其是否到位来实现延迟,精确性较高。本课题未使用。读者可拓展功能。④PSS——设置软件口控制字符串为:”!SCPSS”<mode><CR>其中mode为0代表0~15;1代表16~31。可能由于板子的问题,实际过程中并未起作用,当控制板没问题时,能够根据个人喜好设置控制板的端口号,为编程提供便利。⑤PSD——使端口无效控制字符串为:”!SCPSD”<channel><CR>其中channel为通道号。此功能与PSE功能配合使用,在适当时候可能才生意想不到的效果。⑥PSE——使端口恢复有效控制字符串为:”!SCPSE”<channel><CR>其中channel为通道号。此功能用于PSD后,用来恢复端口的正常使用。其余的功能控制命令此处便不再赘述,因为一般情况下无法用到。㈢C语言程序编写简介:由于说明书中只提供了BS2程序,较难普及,需使用应用较广的C语言编写。从控制命令的格式能够看出,无论哪种方式,都是8字节的字符串,于是,可定义一个联合体(结构体亦可),来储存这一串字节:typedefunion_SERVO_PACKET{ charstream[8]; struct{ charCR:8; charB3:8; charB2:8; charB1:8; charB0:8; unsignedSC:24; }packet;}SERVO_PACKET; SERVO_PACKETpac;并将三字节的SC初始化为0x215343或”!SC”,将CR初始化为0x0D。这样在编写各种控制命令函数时,只要改变B0~B3的值即可。例,位置命令函数:voidSendPacket(charRS,charChannel,intPosition) { inti=0; pac.packet.B0=Channel; pac.packet.B1=RS; pac.packet.B2=LOWBYTE(Position); pac.packet.B3=HIGHBYTE(Position); for(i=7;i>=0;i--) {ser_putbyte(pac.stream[i]); }//该函数4.4节介绍,作用为发送单个字节}其中LOWBYTE()、HIGHBYTE()函数的定义为:#defineLOWBYTE(v)((unsignedchar)(v)) #defineHIGHBYTE(v)((unsignedchar)(((unsignedint)(v))>>8))其功能为获取数值(位置值)的低八位与高八位。这即可为编程提供很大方便。以此类推,其它命令的函数能够根据需要只要参考上述的位置命令函数编写即可。在此基础上以及之前用PSCI软件调试出的舵机初始值,即可编写舵机初始化程序了。voidInitservo(void) { inti=0; for(i=0;i<18;i++) { SendPacket(15,channelno[i],initposi[i]); } delay_ms(100);} 其中,15为舵机转速,channelno[18]数组储存舵机号,initposi[18]数组储存相应舵机的初始位置值。4STM32开发板介绍与程序编写本章主要介绍STM32开发板的使用,以及各种应用程序的编写说明。4.1STM32F107芯片简介STM32系列是基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM
Cortex-M3内核。在STM32F103、STM32F105的基础上,意法半导体公司又推出了一款性能较强的全新STM32互连型(Connectivity)系列微控制器中产品——STM32F107。该芯片集成了各种高性能工业标准接口,且STM32不同型号产品在引脚和软件上具有完美的兼容性,能够轻松适应更多的应用。基于STM32F107的强大功能,以及数量众多的I/O口,本课题选用STM32F107VC芯片作为总控制芯片。4.2软件与编程初始准备在使用开始学习使用STM32开发板前,需要安装两个软件:RealViweMDK(KeilμVision4)用于编程,在注册是注意Target应选择ARM;JLINK仿真器驱动器,下载地址为:,用于烧写程序。安装好软件后,先新建一个程序文件夹,将Libraries与obj文件夹拷贝进去,如果用到触屏,还需包含Source文件夹(具体使用时,可拷贝现成程序文件夹,修改主程序即可),打开Keil4,新建一个工程,即可开始编程,注意每写一个H文件,都需要将#include”stm32f10x.h”置入文件的首部。4.3GPIO与AFIO设置与应用4.31GPIO设置与应用STM32F10x处理器上共有7个I/O端口:A、B、C、D、E、F、G,每个端口有16个引脚。每个GPIO端口都对应2个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),2个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)、1个32位置位/复位寄存器(GPIOx_BSRR)、1个16位复位寄存器(GPIOx_BRR)和1个32位锁定寄存器(GPIOx_LCKR)。I/O口设置包括端口号设置,传输方式设置,输出速度设置。这三种设置是相互关联的,有些 I/O口只能用作输入口,有些只能用作输出口,这是由于在实际的电路中,有些I/O口采取了固化措施,设定了特定功能,例如PE的所有I/O口都被用于触摸屏,不能额外分配;PA0口作为输入口时,正常时为高电平,发生中断时为低电平。传输模式包括:浮空输入、输入上拉、输入下拉、模拟输入、开漏输入、推挽式输出、推挽式复用功能、开漏式复用功能等模式。不同的输入输出模式可能会产生不同的结果。开漏输出,输出端相当于三极管的集电极,要得到高电平需上拉电阻,适合于做电流型的驱动;推挽输出能够输出高低电平,连接数字器件。但在本应用中,均连接数字器件,故只需将输入模式设置为浮空输入,输出模式设置为推挽输出即可。当为输出模式时,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而非输出信号的速度,后者与程序有关(芯片内部在I/O口的输出部分安排了多个不同响应速度的输出驱动电路,用户能够根据需要选择合适的驱动电路)。经过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。以USART1的I/O口配置为例:voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //usart1发送 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //usart1接收 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA,&GPIO_InitStructure);}其中PA9配置为推挽输出模式,PA10则配置为浮空输入模式。其它的I/O口配置方式与上述一样。具体采用什么I/O口,下面会一一介绍。因为程序需求,往往一个I/O口即要被配置成输入口,同时也要转换成输出口,遇到这种情况,如果像上述一样编程,势必会使程序显得繁杂,此时可采用写寄存器的方式来更换I/O口的传输模式。具体写法如下:#defineDAT_OUTGPIOD->CRL=(GPIOD->CRL&(~(0x0000000F<<04)))|0x00000003<<04①#defineDAT_INGPIOD->CRL=(GPIOD->CRL&(~(0x0000000F<<04)))|0x00000004<<04②其中第一行将PD1设置为推挽输出模式,第二行将PD1设置为浮空输入模式。在使用时,只需在程序前,加入一行DAT_OUT;或者DAT_IN来切换PD1输入输出。当书写其它I/O口的程序时,只需将GPIOD换成相应I/O口,如果端口号为0~7,则只需将<<右边的04改成端口号*4的积,例如PA0则为00,如果端口号为8~15,则需将CRL换成CRH,同时<<右边的04改成(端口号-8)*4,例如PB13则为20。在程序中配置I/O口之前,还需对I/O口进行初始化,即开启系统时钟,例如,使能PA口:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
,
ENABLE)//使能APB2总线外设时钟。这样就能够配置完整I/O口了。当学会配置好I/O口后,根据开发板中LED灯得I/O口(如图4.1),即可书写一个简单的控制LED等闪烁的程序。图4.1LED灯电路图程序为:voidledflash(void){GPIO_SetBits(GPIOD,GPIO_Pin_2); //LED1delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_2);delay_ms(1000);GPIO_SetBits(GPIOD,GPIO_Pin_3); //LED2delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_3);delay_ms(1000);GPIO_SetBits(GPIOD,GPIO_Pin_4); //LED3delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_4);delay_ms(1000); GPIO_SetBits(GPIOD,GPIO_Pin_7); //LED4delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_7);delay_ms(1000);}此程序的功能是,使LED灯依次闪烁。4.32AFIOI/O口重映射为了使不同器件封装的外设I/O口功能数量达到最优,能够把一些复用功能重新映射到其它一些脚上(可参照4.4节表4.1)。可经过软件编程来实现。当使用了重映射功能后,原始引脚便不再具备原先设定的功能。以USART1为例,原先输出口为PA9,经重映射后,输出口则改为PB6,而PA9则可作为其它外设的输入输出口使用。具体使用方法为:首先,开启AFIO时钟,如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);然后,在I/O口配置之前,使能复用:GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);最后,按规定配置I/O口。由于本项目使用的STM32功能较简单,因此并未用到重映射功能,但却要开启AFIO时钟,具体原因在4.5节讲中断时会提到。4.4USART设置与应用USART即STM32F10x处理器的通用同步异步收发器单元。每个STM32板提供2~5个独立的异步串行通信接口,可工作于中断和DMA模式两种模式。USART单元支持同步单工、双工通信和半双工单线通信,也支持LIN(LocalInterconnectionNetwork)、智能卡协议和IrDA(红外)SIRENDEC规范,以及调制解调器(CTS/RTS)操作,并允许多处理器通信。USART的配置很简单,用起来也较方便。以配置查询方式的USART1为例,如下:voidUSART1_Configuration(void){USART_InitTypeDefUSART_InitStructure;//串口设置恢复默认参数 USART_ClockInitTypeDefUSART_ClockInitStructure;//初始化参数设置USART_InitStructure.USART_BaudRate=2400;//波特率2400USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长8位USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止字节USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无流控制//打开Rx接收和Tx发送功能USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);//初始化//USART时钟配置USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;USART_ClockInitStructure.USART_CPOL=USART_CPOL_High;USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;USART_ClockInit(USART1,&USART_ClockInitStructure);USART_Cmd(USART1,ENABLE);//启动串口}前面提到过在配置异步通信时,需要注意波特率的配置,对于PSCU板,其所需波特率为2400bps,可是4.8节提到的无线通信传感器(ZIGBEE)则需要9600bps,需对USART重新配置。而是否需要USART时钟配置,则根据实际需要,如果单纯是控制舵机,时钟配置这一段可省略。当然在配置USART之前需要进行两项工作,首先和GPIO一样需配置时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);因为STM32板有多个USART串口,常见的有1~3,而USART2、USART3的时钟配置不同于USART1,因为它们在APB1上,而后者在APB2上。应如下配置:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);配置完时钟,便需配置GPIO口,U1在上节已配置,U2、U3的配置与U1一致,可是需要更换I/O口。具体见下表:USARTPINGPIOAFIOUSART1TXPA9PB6RXPA10PB7USART2TXPA2PD5RXPA3PD6USART3TXPB10PC10(PD8)RXPB11PC11(PD9)表4.1串行通信GPIO口及复用GPIO口注:表中的AFIO列为复用I/O口配置完USART后,便是如何使用了,这包括数据发送和接收。㈠发送单个字节函数一:charser_putbyte(chardata){USART_SendData(USART1,(unsignedchar)data);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART1->DR=(data&0xFF);return(data);}函数二:intSendChar(intch){USART_SendData(USART1,(unsignedchar)ch);while(!(USART1->SR&USART_FLAG_TXE));return(ch);}上述两个函数的功能等同,在写程序时能够随意调用,例如3.4节提到的SendPacket()函数便调用了上述的函数一。㈡接收一个字节u8RByte(void){u8out=0; while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET){}//等待接收完毕out=(USART_ReceiveData(USART1));//接收一个字节 returnout;}该函数用于接收单个字节,在无线通信时可用到。㈢发送一个字符串voidPrint_String(u8*p)//发送一串数据{while(*p){USART_SendData(USART1,*p++);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){}}}当连续发送的字符很多时,能够选用该函数以字符串形式发送。㈣接收一个字符串voidSerialIn(u8*buf,u8len){unsignedchari; for(i=0;i<len;i++) buf[i]=RByte();}同样,当需要连续发送多个字节数据时,则可选用该函数。上面提到的都是USART1的设置以及拓展功能函数的书写。而其它串口通信的设置与U1一致,功能函数则只需将U1换成U2或U3即可。由于主板的问题,本项目中并未使用U2、U3来实现其它串口通信,而是将所有的串口通信均由U1来实现,这也是权宜之计,即采用分时复用的原理。具体说来,就是发声传感器和无线传感器都需要经过异步传输来与处理器通信。对于每个传感器以及PSCU,它们能够识别的信号是由特定字符串组成的。这样,只要将PA9、PA10口多引出几个引脚,分别接到传感器以及PSCU的相应口即可,在传输指令时,分时传送,对于无法识别的字符串,则不处理,这样便解决了串口不够的问题。如果要实现抢占,则将它们配置成中断模式即可,并配置好优先级。4.5外部中断设置与应用当主控制板遇到异常时,便会触发中断,并进行处理。NVIC,中文叫做嵌套矢量中断控制器,是用来处理中断的对于STM32F107的普通用户来说,只要掌握EXTI线中断,USART中断以及TIM中断即可。下面仅对EXTI中断作简略介绍。外部中断/事件控制器(EXTI)由19个产生事件/中断请求的边沿检测器组成。每个输入线可独立地配置输入类型和对应的触发事件(上升沿、下降沿或双边沿触发)每个输入线都能够被独立地屏蔽,由挂起寄存器保持着状态线的中断要求。如果要产生外部中断,首先必须配置好并激活中断线。配置内容包括:根据需要的边沿检测设置2个触发寄存器、在中断屏蔽寄存器的相应位写1以允许中断请求。当外部中断线上出现设定的边沿信号时,将产生一个中断请求等待处理。完成中断服务后,能够清除该中断请求。下面具体介绍如何配置硬件中断/事件请求。(1)首先要了解中断线与I/O口的关系,如图4.2可知,PA~PE的0~15口分别对应EXTI的0~15口;EXTI16与PVD输出连接、EXTI17与RTC闹钟事件连接、EXTI18与USB唤醒事件连接。图4.2中断线与GPIO口对应关系(2)对EXTI线配置,以EXTI0为例,配置函数如下:voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;①#ifdefVECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);②#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);③#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);④NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; ⑤NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;⑥NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; ⑦ NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;⑧NVIC_Init(&NVIC_InitStructure);}⑨①~③为中断地址配置;④表示选择优先级1组,即占先式优先级以1位数字表示,副优先级以三位数字表示,如表4.2所示表4.2中断优先级分组⑤表示选用EXTI0中断线,注意在有些教材中等号右边为EXTI0_IRQChannel,但在实际操作中,可能无法编译,应写成上面形式。如果是选用中断线EXTI11,应写作EXTI15_10_IRQn;EXTI8则为EXTI9_5_IRQn。⑥为配置占先式优先级(主优先级):高占先式优先级的中断会打断当前的主程序/中断程序运行,即所谓的中断嵌套。优先级数值越大,优先级越低。⑦为配置副优先级(子优先级):在占先式优先级相同的情况下。在低副优先级中断运行中,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。但如果同时这两个中断同时到达,则先执行中断优先级高的,执行完后,再执行低优先级中断;如果两个中断的所有优先级均一样,则哪个中断先到达,就先执行哪个中断。对于副优先级,数值越大,优先级越低。(3)对中断线进行I/O口配置从图4.2中可知,每个中断线对应5个I/O口,因此在使用前,一定要先进行I/O口配置。仍以EXTI0为例,由开发板原理图可知,PA0可直接配置为EXTI0中断,无需电路设计。如有需要,也可按照图4.3所示,配置其它中断。图4.3PA0中断线电路配置程序为:voidEXTI_Configuration(void){EXTI_InitTypeDefEXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);①EXTI_InitStructure.EXTI_Line=EXTI_Line0;②EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;③EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);}①即表示选用PA0配置中断;②表示中断线为EXTI0;③表示下降沿触发中断。(4)配置中断处理程序外部中断关键在于使用,下面为经过EXTI0中断来控制LED灯的程序:voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)!=RESET){ledflash();//LED闪烁函数,见4.31节EXTI_ClearITPendingBit(EXTI_Line0); //清除中断屏蔽位}}只要改变ledflash()行,即可在中断产生时,进入不同的中断处理程序。由此多配置几个中断线,并配合行走程序,便可设计一个手柄(或控制面板)来控制使机器人完成前进后退等动作。在开发板上还配备一个PC13的中断引脚,其电路图与PA0一致,可是在调试过程中却出现了bug,无法调通,这就是为什么在4.32节介绍AFIO时提到的需要使能AFIO。虽然没有进行任何重映射,但程序中必须加入AFIO使能这一行,PC13的中断程序才能执行。在调试过程中需要注意这一点。4.6系统时钟与定时器设置与应用4.61系统时钟简介与应用Cortex-M3的内核中包含一个4位的递减计数器——SysTick时钟。当设定了SysTick的初值并使能后,每经过1个系统时钟周期,计数值就减1。当计数到0时,SysTick计数器便自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能情况下)。由此,能够利用Systick的上述特点,来编写Delay()函数,来实现精确延迟。系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),那么每次计数器减1所用的时间是1/9M,计数器的初值如果是9,那么每次计数器减到0,时间经过(1/9M)*9=0.001μ,即1μs。首先书写延迟的初始化程序:voiddelay_init(charSYSCLK){ SysTick->CTRL&=0xfffffffb;① fac_us=SYSCLK/8;② fac_ms=(int)fac_us*1000;③ fac_s=(int)fac_ms*1000;}④①根据STK控制寄存器知,将0~2位设置成3,16位设置为1,则意味着:开启Systick功能、开启Systick中断、使用HCLK/8作为Systick时钟、上次读取本寄存器后,Systick已经数到了0;②根据①选用的时钟书写,调用时应写作delay_init(72);③、④可根据需要书写。然后书写延迟程序,以毫秒延迟为例:voiddelay_ms(intnms){ //毫秒级延迟 u32temp; SysTick->LOAD=(u32)nms*fac_ms;//loadthetime SysTick->VAL=0x00;//clearthecounter SysTick->CTRL=0x01;//startthecounter do{temp=SysTick->CTRL; }while(temp&0x01&&!(temp&(1<<16)));//waitforthetime SysTick->CTRL=0x00;//closethecounter SysTick->VAL=0X00;//clearthecounter}该程序即是指当计数到设定值后,Systick的第16位控制位会自动清零,从而使函数结束,停止计数,达到精确延时的目的。在实际应用中,当配置了延迟秒级的函数时,同样会出现问题,可能是计数器溢出,无法延迟到设定值,此时不妨将原先的函数分多段书写,例如如果需要延迟10s,能够写两行delay_s(5);4.62定时器配置STM32F10x处理器内部有4个定时器,其中TIM1为高级控制定时器,TIM2、TIM3和TIM4为3个独立的通用定时器。通用定时器是一个可编程预分频器驱动的16位自动装载计数器,适用于多种场合。通用定时器是完全独立地,它们能够一起同步工作。以配置TIM2为例,其程序如下:voidTIM2_Configuration(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=0xffff;①TIM_TimeBaseStructure.TIM_Prescaler=71;②TIM_TimeBaseStructure.TIM_ClockDivision=0x0;③TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;④TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);}①为自动重装载寄存器周期的值(定时时间),累计0xFFFF个频率后产生一个更新或中断。②为时钟预分频数,其与时钟频率的关系为:时钟频率=72/(时钟预分频数+1)=1M;则71代表计数周期为1μs;③为时间分割值;④设定定时器模式,程序中设定的为向上计数模式。在柔性力以及超声波传感器中将用到定时器,其调用函数为:time=TIM_GetCounter(TIM2)。4.7机器人行走步态程序编写4.71行走步态简介机器人步态有很多种,但最基本的步态包括:三脚步态,四脚步态和波动步态。顾名思义,这种步态的划分是与同时落地的脚的个数有关的,分别为三个、四个以及一个。在编写行走步态程序前,首先要建立几个数组,储存初始数据。如下:①channelno[18]={0,1,2,3,4,5,6,7,8,31,30,29,28,27,26,25,24,23}; ②initposi[18]={900,755,785,655,810,820,680,714,920,645,750,715,785,750,755,890,825,815}; //身体水平 ③initposi1[18]={900,655,685,655,710,720,680,614,820,645,850,815,785,850,855,890,925,915};//抬高身体④initposi2[18]={900,855,885,655,910,920,680,814,1020,645,650,615,785,650,655,890,725,715};//身体下沉数组一是机器人六个脚从左至右,从前至后从上至下所对于的舵机号。下面三个数组则是机器人处于不同状态时的舵机位置初始值,此时每个脚第一关节均与身体垂直。后续的所有舵机运动程序都要在上述各数组基础上完成。由于安装的对称性,左右舵机实现向前后、向内外所需输入的值是正好相反的。利用PSCI软件,进行步态规划,得到表4.3值。关节号(数组号)初始抬腿前摆下落后摆0(0)900+0-150+0+1501(1)755+150+0-150+02(2)785+150向内+0-150+03(6)655+0-150+0+1504(4)810+150+0-150+05(5)820+150+0-150+06(6)680+0-150+0+1507(7)715+150+0-150+08(8)920+150+0-150+031(9)645+0+150+0-15030(10)750-150+0+150+029(11)715-150向内+0+150+028(12)785+0+150+0-15027(13)750-150+0+150+026(14)755-150+0+150+025(15)890+0+150+0-15024(16)825-150+0+150+023(17)815-150+0+150+0表4.3机器人行走舵机值表4.3中,第一列每三个一组,分别对应脚1、2、3、4、5、6,括号中为使编程方便,提示的channelno数组号数。从表中就可清晰地看出,左右脚的舵机恰好是反向的。为使编程方便,能够新建四个数组:raiseposi[18]、lowerposi[18]、forwardposi[18]、backwardposi[18],用以存储表后四列的值,可直接赋值,但为了程序能够拓展,可按下面的程序进行赋值:voidCalculateposi(void){inti,j=0;for(i=0;i<18;i++){j=channelno[i]; switch(j) {case0: case3: case6: raiseposi[i]=initposi1[i]; lowerposi[i]=initposi1[i]; forwardposi[i]=initposi1[i]-Stride; backwardposi[i]=initposi1[i]+Stride; break; case25: case28: case31: raiseposi[i]=initposi1[i]; lowerposi[i]=initposi1[i]; forwardposi[i]=initposi1[i]+Stride; backwardposi[i]=initposi1[i]-Stride;; break; case1: case2: case4: case5: case7: case8: raiseposi[i]=initposi1[i]+Stride*2; lowerposi[i]=initposi1[i]-Stride*2;;forwardposi[i]=initposi1[i]; backwardposi[i]=initposi1[i]; break; default: raiseposi[i]=initposi1[i]-Stride*2; lowerposi[i]=initposi1[i]+Stride*2;forwardposi[i]=initposi1[i]; backwardposi[i]=initposi1[i]; break; }}}此程序较为简单,在此不再赘述。要提到的是,也可用if语句书写,同时给函数提供数组变量,可使程序功能更为强大。在此基础上,便可开始步态编程了。4.72三脚步态三脚步态即三只脚落地,三只脚悬空运动。按图2.1中所示,以前进程序为例,具体行走路径为:首先,1、3、5脚抬起,2、4、6脚着地;然后,1、3、5脚前迈;再接着,1、3、5脚落地;最后,1、3、5脚向后缓慢运动,同时2、4、6脚抬起。其中前三步所花时间与最后一步所花时间相等。如此往复,机器人便能向前运动了。而机器人运动的原理与人行走是一致的,靠的是地面摩擦力,这就是为什么当脚着地并向后运动时,机器人却向前运动。对于后退,只要将步骤中的前迈改为后退,向后缓慢运动改为向前运动即可。在编写三脚步态前,同样先声明几个辅助数组,用以存储舵机端口号,简化编程,如下:tri135no[9]={1,2,7,8,13,14,0,6,12};tri246no[9]={4,5,10,11,16,17,3,9,15};数组不是直接存储的舵机端口号,而是对应与channelno[]数组的数组号。下面是前进程序的编写:voidtriforward(inttime){inti,j,k,l=0;for(i=0;i<time;i++){for(j=0;j<6;j++)//1、3、5脚上抬{k=tri135no[j];//获取数组序号 l=channelno[k];//获取端口号 SendPacket(s,l,raiseposi[k]); } delay_ms(Delayms);for(j=6;j<9;j++)//1、3、5脚前进{k=tri135no[j]; l=channelno[k]; SendPacket(s,l,forwardposi[k]); } delay_ms(Delayms);for(j=0;j<6;j++)//1、3、5脚下降至初位{k=tri135no[j]; l=channelno[k]; SendPacket(s,l,initposi1[k]); } delay_ms(Delayms);for(j=6;j<9;j++)//1、3、5脚后退至初位{k=tri135no[j]; l=channelno[k]; SendPacket(s*3,l,backwardposi[k]); }注:2、4、6脚与1、3、5类似,略去。}因为SendPacket函数涉及到三个变量:速度、舵机号、舵机位置,因此利用变量l、k分别提取舵机号及其对应的数组号。为使机器人行走时满足运动周期要求,则需要设定不同速度,经调试,当s=7,着地移动速度为21时满足行走要求。为使机器人动作到位,每次发送指令后必须要延迟,其延迟关系近似为舵机位置变化值的五分之一,即Delayms=stride/5=150/5。4.73四脚步态四脚步态与三脚步态类似,由于有四只脚同时着地,则显得更稳定。以前进为例,其行走路径为:一、1、5脚上抬;二、1、5脚前进;三、1、5脚落地;四、1、5脚后退;五、26、34脚同上。当34脚落地时,15脚正好抬起,同样需要经过改变步态速度来实现。在编程之前,需声明如下三个数组:quar15no[6]={1,2,13,14,0,12};
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB11T 1315-2015 绿色建筑工程验收规范
- 医师资格考试合格考生医师联网注册及考核管理系统数据库信息补录(修改)办理申请审核表
- 山东省烟台市招远市2024-2025学年七年级上学期期中生物试题(含答案)
- 黑龙江省哈尔滨市南岗区哈尔滨市第六十九中学校2024-2025学年八年级上学期期中地理试题(含答案)
- 制冰机市场发展预测和趋势分析
- 带升降设备的立体车库产业规划专项研究报告
- 存储卡读卡器产业规划专项研究报告
- 家具用皮缘饰市场需求与消费特点分析
- 人教版英语八年级下册 英语暑假作业(一)
- 人教版八年级英语上册 暑假预习Unit 1 Section A
- 槽钢专项施工方案
- JGJ114-2014 钢筋焊接网混凝土结构技术规程
- 上海铁路局招聘2023届(高职)大专毕业生3367人笔试参考题库(共500题)答案详解版
- CONSORT2010流程图(FlowDiagram)【模板】文档
- JGT501-2016 建筑构件连接处防水密封膏
- 踝关节MRI详细版课件
- 山东省济南市钢城区2023-2024学年三年级上学期11月期中语文试题
- 智能交通概论全套教学课件
- 各工序的产能计算
- 家长会课件:三年级上册期中数学家长会课件
- 附录-瓦斯抽采指标计算方法
评论
0/150
提交评论