您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页六足机器人机电控制系统设计及仿真

六足机器人机电控制系统设计及仿真

来源:好走旅游网
六足机器人机电控制系统设计及仿真

摘 要

六足仿生机器人可以代替人类在各种不适宜的环境中进行探测和救援。它属于是一种仿生足式机器人,并且具有良好的性能。六足仿生机器人的稳定特征可以用于一些未来的太空探索、灾区搜救、人类活动和生活的其他方面,代替人类完成一些高风险和繁琐困难的任务,为减轻人类的负担,帮助科学技术的发展。该毕业设计是通过根据其预定功能设计电路原理图,并连接各种功能模块(如单片机和光电传感器以及舵机等)而设计的。自行设计的仿生机器人的框架是支撑平台。在六足仿生机器人的控制操作方向上,选择通用的廉价单片机作为软件开发平台,以转向控制舵机作为中间控制模块来控制机械足的操作和运行。

关键词:六足机器人;单片机;控制系统;程序编程

Design and Simulation of electromechanical control system for

hexapod robot Abstract

Hexapod bionic robots can replace humans for detection and rescue in various unsuitable environments. It belongs to a bionic foot robot and has good performance. The stable characteristics of the hexapod bionic robot can be used in some future space exploration, search and rescue in disaster areas, human activities and other aspects of life, replacing humans to complete some high-risk tedious and difficult tasks to reduce human burden, help science and Technology development. This graduation design is based on the pre-set functional design circuit schematic diagram, and connects each functional module (such as single-chip microcomputer, photoelectric sensor, servo, etc.) for design. The frame of the self-designed bionic robot is the supporting platform. In the control operation direction of the hexapod bionic robot, the general cheap single-chip microcomputer was selected as the software development platform.

Keywords: Hexapod robot; single chip microcomputer; control system; program programming

目 录

1 绪论 ........................................................................................................................................ 3 1.1本设计的背景及意义 .................................................................................................. 3

1.2本设计在国内外的发展概况及存在的问题 .............................................................. 4

1

1.3本设计应解决的主要问题 .......................................................................................... 6 2方案设计及系统模块的选型 ................................................................................................. 6

2.1机身设计 ...................................................................................................................... 6

2.2系统模块的选型 .......................................................................................................... 8

2.2.1感知模块的选型 ............................................................................................. 10 2.2.2微控制器的选型 ............................................................................................. 11 2.2.3电机驱动模块的选型 ..................................................................................... 13 2.2.4电源模块 ......................................................................................................... 15

3仿真硬件电路设计 ............................................................................................................... 16

3.1Proteus软件 ................................................................................................................ 17

3.1.1软件功能介绍 ................................................................................................. 17 3.1.2硬件电路设计流程 ......................................................................................... 17 3.2仿真硬件电路 ............................................................................................................ 18

3.2.1最小系统 ......................................................................................................... 18 3.2.2时钟电路 ......................................................................................................... 19 3.2.3复位电路 ......................................................................................................... 20 3.2.4电源电路模块 ................................................................................................. 20 3.2.5超声波感应电路 ............................................................................................. 21 3.2.6电机驱动电路 ................................................................................................. 21 3.2.7仿真硬件电路 ................................................................................................. 23

4软件设计 ............................................................................................................................... 24

4.1主程序设计 ................................................................................................................ 24

4.2中断 ............................................................................................................................ 25

4.2.1内部定时和外部计数中断 ............................................................................. 25 4.2.2中断控制的有关寄存器 ................................................................................. 26 4.3子程序设计 ................................................................................................................ 26

4.3.1串口驱动子程序设计 ..................................................................................... 27 4.3.2按键子程序设计 ............................................................................................. 27 4.3.3显示屏子程序设计 ......................................................................................... 28 4.4软件调试 .................................................................................................................... 30 5结论 ....................................................................................................................................... 31 参考文献 .................................................................................................................................. 31 谢 辞 ......................................................................................................... 错误!未定义书签。 附 录 ...................................................................................................................................... 32 附录1 ....................................................................................................................................... 32

2

1 绪论

六足仿生机器人属于地面多足机器人中的其中一类,这种机器人有着强大的运动能力,自动化程度高,结构稳定,学习采用生物的运动模式进行工作。自然界里存在一些人类无法到达或者对人类生命有危险的地方。有如矿井、防灾救援等等环境下,足式机器人的优势在于极强的地形通过能力。并且可设计或大或小的各类型机器人,进入危险区域进行收集信息,大大的改善了人类无法活动区域的限制,在目前都比较常见的是轮式机器人和履带式机器人中。而且多足机器人的腿部具有多个自由度,利用三组步态和定点转弯等姿态控制,通过调节腿的伸展程度大大增强机器人自身的灵活性,也可以控制机身重心的位置更让机器人拥有更高的稳定性。本设计基于仿生学原理,通过51单片机的控制多个舵机的组合实现其独特的特殊性能使得多足仿生机器人研究的出现更突显步行机器人的优势。

1.1本设计的背景及意义

六足机器人可以代替人类在各种不适宜的环境下进行探测和救援。利用六足仿生机器人的稳定性特点,我们可以代替人类完成一些高风险或者不方便不适合人类到达完成的任务,减轻人类的负担,帮助科学技术的发展。当应用于复杂的应用地形时,例如房屋倒塌、山体滑坡、矿井坍塌等废墟环境下,与轮式履带式机器人相比六足机器人能适应复杂恶劣的地形环境,识别性强,思维局限性较低,自动分析地理环境从而执行不同的步态,控制模式也更加简洁方便,对比蛇型机器人更加容易实现,本设计对机器人躯干和腿的结构、运动方式和控制系统进行了研究。为六足机器人在不同结构空间和复杂环境下的控制奠定了基础。

六足机器人由于其关节自由度高,运动灵活以及能够适应复杂地形并且稳定性强被应用于各种复杂多变的环境中。在全球拥有各类机器人,机器人已经变得更加多样化。综合考虑其机械机身结构和各种步态模式,避免了诸多动态平衡的问题。但是,由于许多自由度,控制系统的复杂性增加了。 因此,设计一种能够实现多自由度协调运动的柔性控制系统是关键技术。人类研制的机器人已经不仅仅是业内人士埋头地研究,人们还注重研究生物,并从自然中汲取灵感,学习它们的运动原理、运动的机制和行为的控制,使得机器人与仿生学结合,赋予其更多的使用功能,使得仿生机器人的研究更多元化。

本次设计利用舵机对机器人进行控制实现各种步态行走操作,舵机相当于是机器人的大脑神经,目的是对机器人各足部协调发送指令动作。机身各结构基节则是机器人的四肢和驱干,在这基础上还需要机器人的主要控制大脑,这个大脑需要对外部的信息进行接受和处理,分析需要执行的指令,并对舵机统一命令操作。该机器人对外的传感器是机器人的眼睛,本设计利用超声波的原理,范围广识别度高,它负责接收勘测到的信号。发送给大脑,而舵机并不是机器人的核心。为了实现机器人的智能,我们必须添加

3

另一个主控件,即为机器人安装一个大脑,而单片机可以成为机器人的主控件。

研究了六足仿生机器人的机械结构,控制和功能。六足仿生机器人身体和腿部结构的优化,结合机身自身重量和各模块部件的装配,设计更高效率的运动结构、传动系统及控制系统,优化和丰富其探测功能,使仿生机器人达到更有效、更轻便,更具有适应性,能量消耗更低。

1.2本设计在国内外的发展概况及存在的问题

在众多机器人中,由昆虫运动原理而来的六足机器人在复杂环境及非结构性空间下体现出灵活与高效,代替了人完成人所不适应或力所不及的各种工作,高效的解决问题。

近年来美国就机器人这一领域在国际社会频频出彩,这背后是美国对机器人研究的大力支持。美国NSF最开始建立是为了促进美国的科学进步,在机器人行业NSF投入了诸多的精力财力和人力,发展时间也经历了非常长的过程。美国前置性的早期投资,在机器人相关问题的实践下,对机器人的方向的指导以及探索不断深入。

最近几年,西班牙科学家利用3D打印技术创造了一款六足机器人NeuroPod,如图1.1所示。利用内置的集成人工神经网络模拟自然界的昆虫在不同的步态之间转换。根据报道这款六足机器人装配30个人工的神经元,用以接受电子刺激,以瞬间对腿部电机发送指令,完成各种步态的却换,比如从慢走到奔跑。现在科研人员还在为机器人装各种传感器以便可对外界环境做出不同的响应。

图1.1 NeuroPod机器人

2018年4月,德国著名自动化技术厂商费斯托公司推出一款名为BionicWheelBot的新型仿蜘蛛机器人如下图1.2所示。该仿生机器人身长约为55cm,这个机器人不仅能在地面正常行走,还能蜷缩成球用腿辅助向前翻滚。该机器人具有较强的适应性,可应

4

用于农业、探测以及战场侦查等领域。

图1.2 BionicWheelBot机器人

近年来,国内的阿尔戈智能机器人团队,研发出了一种具有创造性适应能力的六足轮腿混合机器人Creadapt,如下图1.3所示,这个机器人利用最新的运动学和机电一体化设计,配备了最新的适应算法,属于一款多功能的机器人,不仅可以用轮式行走,也可以使用足部,两种程序算法各自独立互不影响,并且这种算法是可以反向运作的的,即使因为环境的原因被翻转过来,依旧可以继续完成它的指令,虽然是拥有六条腿,但即使多条腿都损坏了无法行动,它还是能够继续有效的移动,Creadapt机器人是国内第一个基于自适应算法设计的移动机器人。

图1.3 Creadapt机器人

六足仿生机器人在移动机器人这一领域是非常重要研究方向。与其他类型的移动机器人相比,仿生六角形机器人在非典型环境中具有巨大优势,可用于现场检查,救灾和崎岖不平的道路运输。在复杂的环境中,我们研究了基于仿生运动学的系统控制算法,仿生结构设计,控制系统,图形处理算法,本体结构设计以及仿生六足机器人的设计与实现。

5

1.3本设计应解决的主要问题

机器人控制技术是一项非常全面和广泛的主题技术,包括机器,自动控制,计算机,人工智能等许多科学研究领域的先进技术,六足机器人的控制系统是机器人运动部分的中心。设计出一个需要在非典型环境中满足基本的移动性要求。同时满足关键零件的强度、刚度和使用寿命要求等条件,然后进行轻量化和小型化优化设计,得到基本的结构尺寸,同时考虑使用高强度和低密度特性的材料,提高机器人的运动效率。本文以统一的形式分析了六边形机器人模型,研究了机器人的节奏和步态产生,简单的控制,灵活的运动在构建控制硬件平台方面。软件系统。

需拟解决问题目前主要以下几个: 1、六足机器人可以左右旋转以灵活旋转 2、机器人可以越过一些简单的小障碍

3、确定机械支撑架的承受范围,选择合适的驱动方式 4、运用软件进行模拟仿真

2方案设计及系统模块的选型

2.1机身设计

在机械系统中,现今对六足机器人的研究日渐深入,机身结构的形状也层出不穷,最为典型且应用最为广泛的是以下三种机身结构:对称并排分布、正六边形分布、类椭圆形六边分布。机身的形状结构影响这步行腿的分布,进而对步行腿的摆动空间和六足机器人行走运动过程中的稳定性产生较大的影响,小组对以上三种机身结构,就腿部摆动空间和行走稳定性进行对比分析。

合适的机身机构可以使步行腿有更大的摆动空间,更广的触底平面,在机身总长度及步行腿长度相同的情况下,两种机身结构的步行腿进行相同摆动角度,对类椭圆形六边机身结构和对称机身结构进行步行腿摆动空间对比。在机身总长度及步行腿长度相同的情况下,两种机身结构的步行腿使用相同摆动角度,类椭圆形六边机身结构并未发生步行腿相撞的情况,但对称并排机身结构的步行腿的摆动空间已发生相交,说明此角度已超出最大限制,发生步行腿相撞的情况,如图2.1所示。可由此分析得出类椭圆形六边机身结构的空间摆动范围即触地平面比对称并排机身结构大。

6

图2.1 步行腿摆动空间对比图

六足机器人在正常情况下行走时,其稳定性与步态息息相关,所以在分析稳定性前,需选择一种步态,对三种机身结构进行稳定性对比分析。三种机身结构中,正六边形机身结构和类椭圆形六边机身机构相似,都属于六边形机身结构,而对称并排结构与之相差甚远,所以需先比较六边形机身机构与对称并排机身结构的稳定性。

在小组成员的分析各种对比后得出,当六边形结构越趋向类椭圆形六边形时,其稳定裕度越大,但L值的增大范围和D值的减少范围均有有限制,否则会机身左端会触碰至支撑相,导致比例失调,稳定性下降,如图2.2所示。所以可知在一定的D值与L值变化范围内,类椭圆形六边机身结构的运动稳定性最高,正六边形次之。

图2.2 机身部分参数示意图

综合上节的步行腿稳定性分析,类椭圆形六边机身结构不仅可以减少支脚之间的干扰和碰撞,还能保证六足机器人运动的稳定性,本课题的设计的机身选择类椭圆形六边机身结构。

机身结构选定为类椭圆形六边机身结构。在建模设计前,计算机身的几个重要设计

7

参数,如图2.2所示。通过小组成员设计根据步行腿的设计可知,步行腿的总长度为258mm。为保证步行腿基节在平面摆动角度一般为前后60°,但为保证有尽可能大的摆动空间及避免相撞的现象发生,H的值至少要大于腿长,即260mm,设计选择的数值应更大,初始选为520mm,D的值只要大于258即可,初始选定为260mm,L初始选定为400mm。足部结构如图2.3所示。

图2.3 足部结构参数示意图

根据选定的尺寸,对六足机器人的机身进行参数结构设计并与步行腿进行组装,如图2.4所示,六足机器人完成基本的机身和步行腿设计。

图2.4 六足机器人组装示意图

2.2系统模块的选型

在控制硬件方面主要分为两部分构成,一是控制系统,二是驱动系统,总体分为四大模块:感应识别模块、控制器模块、电机驱动模块和电源模块进行构成,第一步由识别模块进行障碍物的检测,然后像控制器模块发出信号,接着由控制器模块发出指令控

8

制,对驱动电机驱动系统的脉冲,通过控制电流的脉冲达到电机角度的转动,进而控制六足机器人的行走。而电源模块主要就是提供系统所需的电源,使得机器人可在不人为连线供电的情形下自身提供各系统所需的电源。其关联方式如图2.5所示:

电源模块

图2.5 系统结构方式图

每一个模块的功能作用如下:

1、感知模块作为功能需要去感应前方是由一个发射和接收超声波传感器以及一个单片机组成,主要负责测量一定范围内障碍物的距离,感应传感器检测到在机器人前方某个距离范围内的东西然后反馈给系统。

2、控制器模块作为控制系统的核心,进行数据的分析处理,对各子程序进行控制信号的传递,需要对系统每一结构进行协调,完成事先预定的功能程序。

3、电机驱动模块对每只脚单独驱动,通过脉冲调整,这一驱动主要是由控制器进行驱动。

4、电源模块就是为六足机器人的各功能模块提供能量,以此来保证机器人各系统的稳定运行。

总体方案设计如下图2.6所示:

9

感知模块 控制器模块 电机驱动模块 机器人行走

Keil软件 C语言程序设计软件设计 直流伺服电机控制 硬件设计 按键 单片机 显示 驱动电路 直流电机 电路原理图 Proteus软件 仿真调试 图2.6 总体方案设计

2.2.1感知模块的选型

目前市面上比较普遍的传感器主要有源式传感器和无源式传感器两种类型。对各类型传感器的使用情况和作用分析,无源传感器通过吸收被测对象的能量来输出信号;而有源传感器需要由电源提供。虽然无源传感器简单方便,但是会因为被测对象的影响,而导致灵敏度不高也更加容易受到干扰,在这有源传感器更具有优势,灵敏度高也不容易收到干扰,只是需要外部电源的提供。

触觉传感器属于有源传感器的其中一种,通常安装在外部环境容易接近被测量物体附近的地方。主要功能是将图像转换为水平信号,即是根据时间顺序,照射到传感器感光表面的光强度信息将转换为串行输出水平信号。就目前来说,视觉传感器广泛用于工业机器人和各类型移动机器人上。

传感器将超声波信号转换为其他能量信号的声波传感器。超声具有高频,方向性特别好的特点。对于液体和固体的超声波渗透非常好,尤其是对于不透光的固体。有显著

10

的效果。但是超声波会产生大量反射,从而形成反射回波,只要感应到前方存在物体,则会发生多普勒效应。

在此次课题设计的探测机器人中使用超声波传感器用于检测与障碍物之间的距离,超声波传感器小巧容易安装,类型繁多购买方便,实用性强,此次实验选用超声波传感器型号为HC-SR04,如图2.7所示:产品主要参数如下表2.8所示:

图2.7 HC-SR04超声波传感器

表2.8 产品模块主要参数

产品名称 使用电压 静态电流 电平输出 感应角度 探测距离 高精度

该产品安装方便、尺寸更小,不易老化、材料坚固且耐腐蚀,使用寿命也长,采用IO触发测距,测距距离=(高电平时间*声速340M/S/2)。比较其他超声波传感器此型号有精度高的特点,自动检测是否有信号返回。 2.2.2微控制器的选型

微型控制器俗称单片机,把CPU、定时器、计数器和多版本I/O接口集成在一块芯片上,构成了一个小型迷你的微电脑,可以在不同的场合控制不同的应用,它内部内部有着振荡器、RAM、ROM、并行 I/O 端口、中断系统、可编程串行口以及定时器等组成。它具有低功耗、体积小、高性能、成本低等优点,非常适用于开发。

本设计基于单片机控制电机,实现足部驱动系统的运作。单片机用作中央处理器。

11

HC-SR04超声波模块 DC5V 小于2mA 低0v 不大于15度 2CM-450CM 可达3MM 与各种传感器模块配合。因此,选择一块好的单片机显得非常重要。由于技术成熟,51系列单片机可提供完整的信息,它为系统开发提供了极大的便利。因此系统选择STC89C52RC模型与51系列内核完全兼容的单片机。

这个型号单片机具有可编程可擦除只读存储器的低电压、高性能的微处理器。并且它指令简单、自学也易懂容易上手,加上程序编程等硬件设计方便,执行操作也简单,主要它价格实惠,易于购买,也可多个单片机同时操作,所以用它作为本次设计项目的主体控制部分尤为合适。此型号芯片如下图2.9所示:

图2.9 STC89C52RC单片机

单片机STC89C52RC工作原理为其可以不断地读取执行指令,再在寄存器中进行译码功能,最后通过其他部件完成执行指令。该芯片具有以下特征: (1)完全兼容传统8051系列产品,程序可兼容,属于升级版增强型单片机。 (2)相同的晶体振荡器STC89C52RC比传统的51单片机快8至12倍。

(3)内置MAX810复位通道,可进行8次高速10 A/D转换,无需外部A/D模块。 (4)此系列单片机针对电机的控制,比旧版具有强的抗干扰性能。 (5)比普通 51 单片机多了两个定时器,具有 PWM 功能。

STC89C52RC的管脚排列如下图2.10:

12

图2.10 单片机管脚排列图

如上图所示STC89C52RC具有40个引脚,其中32个是外部双向输入/输出(I/O)端口,加上2个外部中断源、3个16位可编程定时器/计数器中断和2个串行中断。 2条读写中断线。可以根据现有方法对STC89C52RC进行编程。它结合了通用微处理器和闪存,特别是可以重复擦除的微处理器,极大化的降低了开发成本。

2.2.3电机驱动模块的选型

作为控制机器人各角度转动的电机,现在使用最为广泛的主要为两种:其一种是步进电机,另一种为伺服电机。伺服电机又分为伺服交流电机和伺服直流电机,对机器人的控制一般使用伺服直流电机,所以另外一种在此不做深究。

步进电机原理是接收到脉冲信号时,电机沿设定方向旋转固定角度,以固定角度逐步执行旋转。但是没有反馈信号,精度较低,也可以控制脉冲的频率大小控制电机转动的速度以便加速或减速,进而达到需要调整电机节奏速度的目的。

伺服电机控制脉冲数,当电动机旋转时,它将发送相应数量的脉冲。在此同时驱动器也接收到反馈的信号,精确的控制电机的旋转,精度可达微米级别,并且电机内部的转子是永磁体,电机自带编码器,该精度远远的高于步进电机。其电机原理图如下图2.11所示:

13

2.11 伺服电机原理图

步进电机和伺服电机的速度响应性能也不同。步进电机当从静止状态加速到工作速度时需要几百毫秒的时间距离。而伺服电机系统往往只需要几毫秒的时间,有着更加优良的加速性能,它可用于需要快速启动和停止以及高位置精度的控制站。

考虑到舵机的数量和应用的方向,小组讨论决定采用型号为AX-18伺服电机,AX-18伺服电动机具有精度高,对速度和转矩进行闭环控制的优点,并克服了步进电动机失步的问题。电机稳定性能强,无论低速还是高速都能满足要求也不会存在步进电机的现象,加上及时性强的特点,电机加减速的动态相应时间短,短短在几十毫秒之内可完成。所以决定使用该型号电机AX-18电机如图2.12所示、参数如表2.13所示:

图2.12 AX-18 伺服数字电机

表2.13 电机参数

产品尺寸 产品质量 工作扭矩 反应转速 使用温度 14

40.7*19.7*42.9mm 55g 16.5kg/cm 53-62r/m -5°C-+85°C 死区设定 插头类型 转动角度 舵机类型 使用电压 工作电流 结构材质

4微秒 JR、FUTABA通用 180度/360度 模拟电机 7-10v 900mA 金属铜齿、空心杯电机、双滚珠轴承 伺服电机的控制通常需要大约20Ms的时基脉冲。脉冲的高电平部分通常是角度控制脉冲部分。以180°伺服直流电机为例,对应的关系是:0.5Ms--0°、1.0Ms--45°、1.5Ms--90°、2.0Ms--135°、2.5Ms--180°。许多时候适用于机械臂的选配和航模电机的使用等。 2.2.4电源模块

由于需要考虑六足机器人的工作环境和自身结构可知,机器人必须自带电源。以此确保机器人的稳定运作,本课题设计的六足机器人所需的能源主要用于驱动电机和控制电路以及超声波范围。伺服电机可以直接使用通用电源,但超声波传感器和单片机控制电路则是需要5V电源。电路模块上也存在许多感性元件,不能直接通入高压电源,考虑到六足机器人的工作时间,自身重量,电池尺寸和成本,使用容量为5200 mAH的24 V 5.2 Ah锂电池。锂电池在和镍镉电池和铅酸电池等类型电池相比之下,锂电池有着更高的性价比。锂电池也拥有诸多优点,比如没有污染,电池输出电流大,使用寿命长,循环次数多等优点。

电池处理模块采用PCA9685芯片进行驱动伺服电机的运作,它是一个采用I2C通信 ,内置了PWM驱动器和一个时钟。和TLC5940系列有很大不同,这个芯片不需要不断发送信号占用单片机。也可有效压制输入电流来使器件不会受到输入信号的影响。它是5V的兼容,即使是3.3V的单片机控制也能安全地驱动到6V输出。相比于L298N驱动芯片,可有效控制电机正反转的效果。外部端子用于连接外围检测电阻器。另外可放置另一个输入电源,以允许逻辑在低压下工作。该驱动模块如下图2.14所示:

15

图2.14 PCA9685电机驱动模块

PCA9685芯片具有更强的驱动能力。并且有着过电流保护功能,当系统出现电

机卡死时,可以保护电路和电机等。模块以及各个接口如图2.15所示:

图2.15 PCA9685驱动各接口功能

3仿真硬件电路设计

单片机作为一种典型的嵌入式系统,本身是没有带开发功能的,需要借助外部工具进行烧录程序。而寻找一种能够模拟硬件电路工作方式的平台是一种好的办法。这就需要模拟仿真器,将外围设备的功能在软件中实现。

在单片机开发上,发现Proteus与Keil C联调可以进行全部的软件和大多数硬件系统的调试。以Proteus仿真实验实现系统的动态仿真时,就单片机而言该软件有着显著的优势。不仅可以提高单片机系统设计效率,并且也拥有良好的灵活性方便进行各式各样的调整和实验。

16

3.1Proteus软件

3.1.1软件功能介绍

Proteus软件是应用颇为广泛的电子线路仿真软件,它也是目前单片机仿真软件中较容易操作上手快可以自学的工具软件,自软件1989年问世至今经历30年的发展优化,功能不断完善,性能也越来越好,元器库储量越来越多,因为自身结构的特点,使用用户也颇为庞大遍布全球, 最方便的,是Proteus还可以仿真数码管、液晶显示器,可以仿真按容键、各种传感器等等。

软件功能特点: (1)原理布图;

(2)PCB自动或人工布线; (3)SPICE电路仿真。

(4)各种信号源和电路虚拟仪表;

(5)普遍都支持第三方的软件编译和调试环境;

3.1.2硬件电路设计流程

打开软件后,将出现一个仿真电路窗口,用于构思设计以及设计完毕后的仿真运行。提前进行构想完成后,在提前预想好电路大致板块以及个元器件的编码,根据设计需要提取Proteus元件库中选取所需的组件,将它们放置在编辑区域中并执行电路设计,例如电路连接。设计电路之后,可以使用系统提供的电气测试工具对电路进行电气测试。如若在之前设计的过程中出现错误则会出现电气错误提示,根据该报告,可以排除电气错误直至电路完善。

本课题设计的六足机器人控制系统电路主要由电源稳压电路、时钟电路、复位电路、显示系统、超声波感应系统、伺服直流电机等组成,硬件仿真设计总体框图如下图3.1所示:

感应模块 17 时钟电路 复位电路 按键模块 单片机 STC89C52RC 显示模块 伺服直流电机

图3.1 仿真设计总体框图

电源电路模块 3.2仿真硬件电路

3.2.1最小系统

单片机主机系统电路主要由单片机和稳压模块组成。工作原理为其可以不断地读取执行指令,然后再在寄存器中进行译码功能,最后通过其他的部件完成执行指令。最小系统是单片机系统中必不可少的部分,是由可以使单个芯片工作的最少设备组成的系统。 STC89C52RC已经包含8KB的程序存储器,可以轻松地构建最小的单片机系统,只需要连接电源,增加时钟电路和复位电路即可。最小系统电路图如图3.2所示,仿真图如图3.3所示:

图3.2 最小系统组成

18

图3.3 最小系统滴电路仿真图

3.2.2时钟电路

在所有的单片机电路系统中,就算是最简单的电路,也都是需要有一个时钟电路,时钟电路由晶振组成,晶振为单片机提供基本震荡源,晶振的震荡就好比人类心脏的跳动,单片机会检测到震荡,有了心跳节拍,才可以实现各种程序运行,不然若连计数都无法完成,则单片机是无法启动的,所以在设计仿真时务必加入时钟电路并保证时钟的稳定,一旦受到干扰对系统是非常致命的。时钟电路电路图和仿真图如下图3.4所示:

(a) (b)

图3.4 时钟电路图

19

3.2.3复位电路

单片机的复位主要是由RST引脚的电压控制,当收到上升沿或者下降沿时,都会对系统进行一次复位,或者当程序或操作不正确时,可能导致系统崩溃甚至死机结果,这时便需要通过复位操作使其重新开始工作。如下图3.5所示:

(a) (b)

图3.5 复位电路图

3.2.4电源电路模块

考虑到系统中有存在着比较感性的远件,比如电动机和继电器等等,因此感性组件的运行将拉低系统电压,导致了调节值偏离出相应范围外。它的功能是为单片机的直流电源供电,把交流电源转换为稳压直流电源。对输出的电压进行整流,经过正负电源,同时获得采样电压。为了接线简单以及节省元器件,使用桥式电路将220V电压变成整流电路要求的直流电压,从而实现220V直流稳压状态。稳压电路仿真图如下图3.6所示:

图3.6 电源稳压电路图

20

3.2.5超声波感应电路

超声波感应装置采用STC89C52RC单片机与相关的光电检测设备来设计类似超声波感应装置,由于Proteus系统元件库内没有超声波传感模块,也没有类似声波感应模块,所以采用ADC芯片进行代替也是一个非常好的方案。ADC芯片模拟超声波传感器采用电阻器元件作为检测元件的传感器,通过电阻器元件模拟接受外部光信号转化成电信号然后通过按键调节进行反馈,也同时拥有发射装置、接收装置和电路装置,,所以采用替换且能达到一样效果的超声波传感器,从而实现通过外界环境的改变而自动控制机器人电机的转动。同时在仿真图中考虑到无法实现和实际中检测到前方信号的反馈,采取人为控制的按键模块和显示模块进行表达实际检测情况,通过按键模块调节六足机器人前方障碍物的距离,并由显示板块直观表达出来,模拟机器人在实际行走中遇到的各种信号。所以超声波感应电路其功能模块主要包括检测模块、显示模块以及处理模块三类,其检测模块和处理模块电路图如下图3.7所示,显示屏模块如下图3.8所示:

图3.7 信号检测与按键模块

图3.8 显示模块仿真

3.2.6电机驱动电路

伺服直流电机通过电机驱动系统驱动,其中一端连接到12V外部电源,另一端接到STC89C52RC单片机的各个引脚上进行控制。通过控制电流脉冲的时间,对电机转动的

21

角度进行精确控制,考虑到本次课题设计的机器人电机有18个,如果在仿真图中表示,占幅会非常大,所以未在仿真图中全部表达,由于本次设计的机器人行走步态为三足步态,三只足部的控制方式相同,三组步态如下图3.9所示:

图3.9 三足步态相位图

在步态相同控制方式节拍相同的情形下,对六只足步分为两组,为每只脚进行编号后,如下图3.10所示,1、3、5足部定为A组,2、4、6足部定为B组,通过控制A、B组的步态节奏达到机器人各种模式的实现。电机驱动电路仿真如下图3.11所示:

图3.10 各足部编号示意图

22

图3.11 电机驱动仿真图

3.2.7仿真硬件电路

如下图3.12所示,是在Proteus软件中仿真的完整硬件电路的示意图。通过微控制器STC89C52RC为控制中心,选择合适的元件而形成可执行功能的仿真硬件电路。

23

图3.12 控制仿真电路图

4软件设计

4.1主程序设计

依照提前预定好的方案设计要求,设计主程序、子程序。六足机器人控制系统上电后,首先,进行初始化,比如:定时器0、外部中断0、等。然后,感知模块和电机驱动模块工作,超声波传感器检测机器人周围环境等,该程序主要完成系统初始化和各种功能的调用,检测并处理取消中断的指示位,并监视和显示完成每个功能的工作过程。

在这个以STC89C52RC为大脑的单片机机电控制系统中,单片机需要完成的工作是通过软件编程将信号指令发送到每个功能模块以执行其功能。实现一般合作并达到最终控制目的。

主程序设计的基本流程是执行功能的基本步骤。当启动后,系统自动进行初始化,包括将单片机的每个引脚端口设置为高电平并清除内部存储器。然后启用系统预设,按下按钮后,系统进行识别,超声波感应器开始探测前方的环境状态,接受信号发送到单片机,大脑发出指令,脉冲计数器记录电机速度,输出在特定占空比下执行前进、后退或转向避障等模式。主流程图如下图4.1所示:

开始 24

直行模式

图4.1 主程序流程图

避障模式 模式检查 是否有障碍 超声波传感器检测 初始化(外部中断、定时器0) 4.2中断

中断服务功能在功能模块的编程中占有非常重要的位置。可以通过在达到所需目标之前降低中断功能来解决CPU使用率过高的问题。其中,超声扫描应用于定时中断功能,速度测量适用于外部中断源和计时器,脉冲输出被添加到计时器。因为每个子功能模块都更为重要,主程序仅是进行几个辅助调用,而关键部分是每个中断服务功能的使用。在继续特定的软件设计之前,有必要开发STC89C52RC中断的内容。

当CPU执行某个程序时,有时会发生内部或外部紧急事件,需要CPU暂停其工作并处理紧急事件。处理事件后,返回原始中断位置。继续运行最初中断的程序。此过程称为中断。

4.2.1内部定时和外部计数中断

在机电控制系统中应用的中断源和中断原因如下表4.2所示:

表4.2 中断源

中断源 INT0 INT1 T0 名称 外部中断0 外部中断1 定时器0中断 25

中断引起原因 引脚输入低电平或下降沿信号 引脚输入低电平或下降沿信号 定时计数器0计数回零溢出 T1 T2

单片机定时器的作用:

定时器1中断 定时器2中断 定时计数器1计数回零溢出 定时计数器2计数回零溢出 (1)可用于精确的延迟处理,比较延迟时间为1ms。

(2)可用作计数器。例如,将此功能IO端口连接到时钟源,就可以计算出有多少个脉冲信号。

4.2.2中断控制的有关寄存器

CPU的打开和屏蔽中断源以及是否可以中断每个中断源均由IE中断启用寄存器。如表4.3所示:

表4.3 中断允许控制寄存器IE的位

位序 位标志

中断使能控制寄存器IE在打开和关闭中断中实现两级控制。总的中断位EA。

部分程序如下:

void timer0() interrupt 1 {

TL0 = TIMER0_MODE1_INIT_VALUE_L;///<设定定时器初值

timer0_irq();///<定时器0中断处理函数 timer0_irq();///<定时器0中断处理函数 }

TH0 = TIMER0_MODE1_INIT_VALUE_H;

D7 EA D6 -- D5 ET2 D4 ES D3 ET1 D2 EX1 D1 ET0 D0 EX0 4.3子程序设计

控制的子程序设计包括电机驱动程序设计、前进后退切换程序设计、避障程序设计、按键和显示屏程序设计、超声波距离传感程序设计等等。

26

4.3.1串口驱动子程序设计

串行接口是一种可以将从CPU接收到的并行数据字符转换为连续的串行数据流并发送它们的设备,同时可以将接收到的串行数据流转换为数据字符的设备并行的CPU。通常执行此操作电路。保留串行端口控制器的重要性在于到时候可以通过蓝牙通讯模块接入智能手机控制机器人步态系统。

4.3.2按键子程序设计

按键模块主要是用于模拟调整超声波感知环境参数使用,按键模块有距离+、距离-及手动控制电机运动功能。由于实际演示之时存在的环境条件上的难以控制的因素,所以改为手动按钮模拟调节的形式,这样子即安全又方便,可以在整体演示之时进行恰当的仿真演示,也不失为一个解决问题的好方案。

部分程序如下:

#define KEY_ADD #define KEY_SUB

sbit KEYSET0=P1^5;//按键增 sbit KEYSET1=P1^6;//按键减

uchar Key_Scan() {

static uchar key_up=1;//按键按松开标志 if(key_up&&(KEYSET0==0||KEYSET1==0)) { }

else if(KEYSET0==1&&KEYSET1==1)

key_up=1;

27

1 2

//加 //减

delayms(10);//去抖动 key_up=0;

if(KEYSET0==0)return 1;

else if(KEYSET1==0)return 2;

return 0;// 无按键按下

}

void Key_pross() { }

4.3.3显示屏子程序设计

显示屏采用LCD1602显示屏,可实现超声波传感器对环境的检测数据并把数据实时反馈在LCD1602显示屏上面,作为一个数据输出的反馈设备,可以方便告诉人们现阶段系统处于的状态。此外也方便观察的数据和在Proteus软件上进行仿真调整距离,直观的进行演示。

部分程序如下:

void LCD_write_command(uchar dat) { }

void LCD_write_data(uchar dat) {

28

uchar key;

//按键扫描

if(key==KEY_ADD)set_f++; else if(key==KEY_SUB)set_f--;

key=Key_Scan();

//LCD_Busy();

LCD_RS=0;//指令 LCD_RW=0;//写入 LCD_DB=dat; delay_n40us(3); LCD_E=1;//允许 delay_n40us(13); LCD_E=0;

//LCD_Busy(); LCD_RS=1;//数据 LCD_RW=0;//写入 LCD_DB=dat; delay_n40us(3); LCD_E=1;//允许 delay_n40us(13); LCD_E=0;

}

void LCD_disp_char(uchar x,uchar y,uchar dat) { }

void lcd1602_write_String(uchar x,uchar y,uchar *p) {

uchar add;

//根据显示位置(x,y)确定显示地址 if(y==1)

//在第1行显示

//在第2行显示

29

uchar add;

//根据显示位置(x,y)确定显示地址 if(y==1)

//在第1行显示

//在第2行显示 //在第1行显示

//在第2行显示

add=0x80+x; add=0xc0+x; add=0x90+x; add=0xd0+x;

else if(y==2) else if(y==3)

else if(y==4)

LCD_write_command(add);//写入需要显示的地址 LCD_write_data(dat); //写入需要显示的内容

add=0x80+x; add=0xc0+x;

else if(y==2)

}

else if(y==3)

else if(y==4)

//在第3行显示

add=0x90+x; add=0xd0+x;

//在第4行显示

LCD_write_command(add); //写入需要显示的地址

while (*p!='\\0') //写入需要显示的内容,直到字符串全部显示完成 { }

LCD_write_data(*p++);

4.4软件调试

调试是一整个六足机器人控制系统设计中的最关键环节。首先,先进行硬件调试,各个元件安装、线路的连接等是否无误;然后进行软件调试,该程序主要完成系统初始化和各种功能指令的调用与运行,检测并处理取消中断的指示位,并监视和显示完成每个功能的工作过程。在以STC89C52RC为核心的单片机控制系统中,单片机需要完成的工作是通过软件编程,信号指令被赋予每个功能模块以执行其功能,实现整体协作并达到最终控制目标。

主要的程序设计的基本思想流程就是功能实现的基本衔接步骤。程序编写完成之后,我们要在 Keil 平台上编译。首先,对各个单独的子程序进行编译,每个子程序没有出现语法错误之后,再对各个模块合并进行编译,直至没有错误则为编译成功。完成实物仿真。

常见的软件调试错误如下:

(1) 使用中断的时候,注意中断的优先级别。

(2) 在中断开始时,通常必须首先保护站点,然后再保护处理程序以防中断,返回后,需要恢复站点以确保站点上的数据不被破坏。

(3)在使用循环的时候,要加上时间限制,否则很可能会出现无条件死循环。 (4)在调试中,没有开启看门狗。导致有些问题被掩盖,不利于调试。

本设计中出现了引脚定义错误这种低级错误,还出现了死循环的问题。整个系统的设计过程中,硬件和软件的分别调试功夫只占三分之一,软件与硬件的综合调试才是设计成功与否的关键。所以,为了后面综合调试故障排除的降低,前面的 各个模块的硬件和软件单独调试有必要谨慎对待。单个模块的联合调试成功并不意味着 各个模块合并在一起也能顺利运行。而且Keil的调试只能检测基本的语法的编译错误,逻辑错误等只能与硬件联合调试发现问题。

30

5结论

六足仿生机器人的控制系统采用STC89C52RC单片机为控制器,完成了六足机器人行走的基本功能,通过直流伺服电机的旋转,利用脉冲对电机进行角度的精确控制,控制电机正反转的方向实现前进后退,从而实现机器人各步态的稳定执行。仿真模拟通过按键和显示屏的配合,调整光电传感器的数据以模拟超声波探测到的距离,以在显示屏中直观体现,并完成仿真的演示。

有地形适应性强,肢体冗余度高,容错性强等突出优点,具有重要的研究价值。由于其控制的复杂性,控制系统的研究是仿生六足机器人的重点和难点。六足仿生机器人项目的长期目标是开发一种结构紧凑,易于控制,地形适应性强的小脚自主移动机器人平台。

在了解六足机器人的行走任务模式和行走环境的检测后,设计并实现了具有高度安全性,可靠性和实时安全性高并且容易控制的成本低廉的六足机器人运动控制系统。可以实现机器人正常的行走和步态间自由切换控制任务的要求。目前,这个六足机器人控制系统设计尚未完全成熟,例如增加多传感器的检测识别,以达到机器人的各种动作的实现,因为尚未在真实的硬件环境中测试系统的异常故障处理机制,所以可以实现对所有仿生机器人电机的同步控制。一旦机器人硬件完全完成,就需要进行进一步的调整和故障异常处理测试。这些问题都是未来需要继续去研究和继续探索。

参考文献

[1]程院莲.浅析步进电机、伺服电机和舵机的区别[J].轻工科技,2020,36(01):36-37+62. [2]陈文鑫.基于51单片机的多功能智能小车的探讨[J].现代信息科技,2019,3(23):25-29. [3]乔凌霄,郭超维,刘源涛,温帅,孟朝霞.基于超声传感器的避障小车系统设计[J].运城学院学报,2019,37(03):12-15.

[4]徐维超. 小型六足机器人运动控制系统设计与实现[D].华中科技大学,2019.

[5]赵旭磊,耿召里,李小华.智能小车避障算法和速度调节算法研究[J].辽宁科技大学学报,2018,41(03):212-217.

[6]黄嘉斌,黄海鹏.多功能全地形智能小车设计[J].电工技术,2018(10):88-90. [7]李俊伟. 自主巡逻机器人行进避障及火灾预警研究[D].内蒙古工业大学,2017.

[8]李冠湛,黄海军.自主移动机器人运动控制系统的设计与实现[J].电子世界,2016(21):172-173. [9]李程. 六足机器人控制系统设计[D].燕山大学,2016.

[10]庄严,宋鸣,张劭凤,李超.基于51单片机的六足机器人控制系统设计与制作[J].价值工程,2013,32(30):51-53.

[11]刘德高. 六足机器人运动控制系统设计与实现[D].哈尔滨工业大学,2013. [12]吴明煜. 基于伺服电机精确定位系统的研制[D].南京师范大学,2013. [13]徐崇福. 六足机器人运动规划与控制系统设计[D].哈尔滨理工大学,2013. [14]徐昭. 基于AT89C52的多功能实验板的开发[D].吉林大学,2012.

[15]李进吉. 六足机器人结构参数优化与控制系统设计[D].哈尔滨工业大学,2012. [16]杨华栋. 基于单片机家用机器人的自主移动控制系统研究[D].沈阳理工大学,2011.

31

[17]罗孝龙,罗庆生,韩宝玲,赵小川.仿生六足机器人多电机控制系统的研究与设计[J].计算机测量与控制,2008(04):491-493.

[18]马刚,李向仓.用Proteus与Keil整合构建单片机虚拟仿真平台[J].现代电子技术,2006(24):129-131.

附录1

六足机器人控制系统主程序:

#include \"reg52.h\" #include \"servo.h\" #include \"adc.h\" #include \"lcd.h\"

#define KEY_ADD 1 #define KEY_SUB 2

sbit KEYSET0=P1^5;//按键增sbit KEYSET1=P1^6;//按键减

uchar adval; uchar dist[3]; uchar set_f=120; uchar i;

void delayms(uint x)

{ uint y,z; for(z=x;z>0;z--) for(y=110;y>0;y--);

}

uchar Key_Scan()

附 录

程序源代码

//加 //减

32

{ }

static uchar key_up=1;//按键按松开标志 if(key_up&&(KEYSET0==0||KEYSET1==0)) { }

else if(KEYSET0==1&&KEYSET1==1)

key_up=1; delayms(10);//去抖动 key_up=0;

if(KEYSET0==0)return 1;

else if(KEYSET1==0)return 2;

return 0;// 无按键按下

void Key_pross() { }

void TIME0_Init() { }

void Timer() interrupt 1 {

TH0=(65535-50000)/256;

33

uchar key;

//按键扫描

if(key==KEY_ADD)set_f++; else if(key==KEY_SUB)set_f--;

key=Key_Scan();

TMOD|=0X01;

TH0=(65535-50000)/256; TH0=(65535-50000)%256; ET0=1; TR0=1; EA=1;

}

TH0=(65535-50000)%256; Key_pross();

lcd1602_write_String(0,1,\"Set dist:\"); lcd1602_write_String(0,2,\"Act dist:\"); adval=ADC0832_read(0); dist[0]=ASCII[adval/100]; dist[1]=ASCII[adval%100/10]; dist[2]=ASCII[adval%10]; lcd1602_write_String(9,1,dist); LCD_disp_char(9,2,ASCII[set_f/100]); LCD_disp_char(10,2,ASCII[set_f%100/10]); LCD_disp_char(11 ,2,ASCII[set_f%100%10]);

int main() {

LCD_init(); TIME0_Init(); pca_set_freq(); pca_set_pwm(0,80); pca_set_pwm(1,80); pca_set_pwm(2,80); pca_set_pwm(3,80); pca_set_pwm(4,80); pca_set_pwm(5,80); delayms(500); while(1) {

if(set_f>adval) {

//B组电机

pca_set_pwm(4,93);//B组2号电机正旋转30° pca_set_pwm(5,93);//B组3号电机正旋转30° pca_set_pwm(3,55);//B组1号电机反转旋转36° delayms(500);

pca_set_pwm(5,80);//B组2号电机反转旋转30°

34

//0 //0 //0 //0 //0 //0

}

pca_set_pwm(4,80);//B组3号电机反转旋转30° delayms(500); //A组电机

pca_set_pwm(1,93);//A组2号电机正旋转30° pca_set_pwm(2,93);//A组3号电机正旋转30° pca_set_pwm(0,55);//A组1号电机反转旋转36° delayms(500);

//AB组电机同时旋转36度

pca_set_pwm(0,80);//B组1号电机反转旋转36° pca_set_pwm(3,80);//B组1号电机反转旋转36° delayms(500);

pca_set_pwm(2,80);//A组3号电机反转旋转30° pca_set_pwm(1,80);//A组2号电机反转旋转30° delayms(500);

else if(set_f==adval) { } else {

pca_set_pwm(4,93);//B组2号电机正转旋转30° pca_set_pwm(5,93);//B组3号电机正转旋转30°

35

for(i=0;i<3;i++) { }

pca_set_pwm(2,93);//A组2号电机正转旋转30° pca_set_pwm(1,93);//A组2号电机反转旋转30° pca_set_pwm(0,93);//A组2号电机反转旋转30° delayms(500);

pca_set_pwm(2,80);//A组3号电机反转旋转30° pca_set_pwm(1,80);//A组2号电机反转旋转30° pca_set_pwm(4,93);//B组2号电机正旋转30° delayms(500);

pca_set_pwm(0,80);//A组1号电机反转旋转30° pca_set_pwm(4,80);//B组2号电机反转旋转30° delayms(500);

}

}

}

pca_set_pwm(3,55);//A组2号电机反转旋转36° delayms(500);

pca_set_pwm(5,80);//B组3号电机反转旋转30° pca_set_pwm(4,80);//B组2号电机反转旋转30° pca_set_pwm(1,93);//A组3号电机正转旋转30° pca_set_pwm(2,93);//A组3号电机正转旋转30° pca_set_pwm(0,55);//A组3号电机反转旋转36° delayms(500);

pca_set_pwm(0,80);//A组1号电机正转旋转36° pca_set_pwm(3,80);//B组1号电机反转旋转36° pca_set_pwm(2,80);//A组3号电机反转旋转30° pca_set_pwm(1,80);//A组3号电机反转旋转30°

ADC0832子程序:

#ifndef _ADC_H_ #define _ADC_H_ #include

#define uchar unsigned char #define uint unsigned int

sbit ADCLK =P1^0; //时钟接口 sbit ADDI =P1^1; //数据输入接口 sbit ADDO =P1^1; //数据输出接口 sbit ADCS =P1^2; //使能接口

void ADC0832_start();

void ADC0832_start() {

36

//AD转换初始化

uchar ADC0832_read(uint CH);//CH=0选择通道ch0,=1选择ch1进行AD转换

}

ADCS=1; //重置ADC芯片 ADCS=0; //开启转化 ADDI=1;

ADCLK=1;

ADCLK=0; //第1个下降沿DI=1

uchar ADC0832_read(uint CH) {

37

uchar temp; uint i;

ADC0832_start(); //发送起始信号 if(CH==0) { } else { }

ADCLK=1; ADCLK=0;

ADDI=1;

ADCLK=1; ADDI=1;

ADCLK=1;

//否则,选择通道1 ADDI=1; ADCLK=1;

ADCLK=0; //第2个下降沿DI=1 ADDI=0;

//选择通道0

ADCLK=1;

ADCLK=0; //第3个下降沿DI=0

ADCLK=0; //第2个下降沿DI=1

ADCLK=0; //第3个下降沿DI=1

}

for(i=0;i<8;i++) { }

return temp;

temp=temp<<1;//每读取一位后将数据往左移动一位,最右端补0 ADDI=1;

if(ADDO) //如果读取数据为1,将数据写入缓存

temp+=0x01;

//拉高数据信号线

ADCLK=1; //拉高时钟信号线

ADCLK=0; //拉低时钟信号线,产生下降沿

显示屏子程序:

#ifndef _LCD_H #define _LCD_H

#include

#define uchar unsigned char//宏定义 #define uint unsigned int

#define LCD_DB P0

sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_E = P2^2; sbit PSB=P3^2;

void LCD_init();

//初始化函数

void LCD_write_command(uchar command); void LCD_write_data(uchar dat);

//写指令函数

//写数据函数

void LCD_disp_char(uchar x,uchar y,uchar dat);//显示一个字符, X(0-16),y(1-2)。 void lcd1602_write_String(uchar x,uchar y,uchar *p);//显示一个字符串,X(0-16),y(1-2)。

38

void lcd1602_write_pic(uchar add,uchar *pic_num); //写入自定义字符 void delay_n40us(uint n);

uchar code pic[8]={0x00,0x0e,0x0a,0x0e,0x00,0x00,0x00,0x00};//自定义“℃”字符 uchar code zeng[8]={0x04,0x0a,0x15,0x04,0x04,0x04,0x04,0x00};//自定义“↑”字符 uchar code jian[8]={0x00,0x04,0x04,0x04,0x04,0x15,0x0a,0x04};//自定义“↓”字符

uchar code ASCII[] = {'0','1','2','3','4','5','6','7','8','9',':','/','.',' '}; //LCD1602显示的字符数组

void LCD_init() { }

void LCD_write_command(uchar dat) { }

void LCD_write_data(uchar dat) {

LCD_RS=1;//数据 LCD_RW=0;//写入

39

//延时函数

LCD_write_command(0x38);//设置 8 位格式,2 行,5x7 LCD_write_command(0x38);//设置 8 位格式,2 行,5x7 LCD_write_command(0x38);//设置 8 位格式,2 行,5x7 LCD_write_command(0x0c);//整体显示,关光标,不闪烁 LCD_write_command(0x06);//设定输入方式,增量不移位 LCD_write_command(0x01);//清除屏幕显示 delay_n40us(100);

LCD_RS=0;//指令 LCD_RW=0;//写入 LCD_DB=dat; delay_n40us(3); LCD_E=1;//允许 delay_n40us(13); LCD_E=0;

LCD_DB=dat; delay_n40us(3); LCD_E=1;//允许 delay_n40us(13); LCD_E=0;

}

void LCD_disp_char(uchar x,uchar y,uchar dat) { }

void lcd1602_write_String(uchar x,uchar y,uchar *p) {

uchar add; if(y==1)

//在第1行显示

//在第2行显示

//在第3行显示

add=0x80+x; add=0xc0+x; add=0x90+x; add=0xd0+x;

//在第4行显示

uchar add; if(y==1)

//在第1行显示

//在第2行显示 //在第1行显示

//在第2行显示

add=0x80+x; add=0xc0+x; add=0x90+x; add=0xd0+x;

else if(y==2) else if(y==3)

else if(y==4)

LCD_write_command(add);//写入需要显示的地址 LCD_write_data(dat); //写入需要显示的内容

else if(y==2) else if(y==3) else if(y==4)

LCD_write_command(add); //写入需要显示的地址

while (*p!='\\0') //写入需要显示的内容,直到字符串全部显示完成

40

}

{ }

LCD_write_data(*p++);

void lcd1602_write_pic(uchar add,uchar *pic_num) { }

void delay_n40us(uint n) { }

电机驱动子程序:

#ifndef _SERVO_H #define _SERVO_H #include \"reg52.h\" #include

#define uchar unsigned char #define uint unsigned int

sbit SCL=P1^3; //定义时钟引脚

41

unsigned char i; add=add<<3; for(i=0;i<8;i++) { }

LCD_write_command(0x40|add+i); LCD_write_data(*pic_num++);

uint i; uchar j; for(i=n;i>0;i--) for(j=0;j<2;j++);

sbit SDA=P1^4; //定义数据引脚

#define PCA9685_adrr 0x80//1+A5+A4+A3+A2+A1+A0+w/r #define PCA9685_SUBADR1 0x2 #define PCA9685_SUBADR2 0x3 #define PCA9685_SUBADR3 0x4 #define PCA9685_MODE1 0x0 #define PCA9685_MODE2 0x1 #define PCA9685_PRESCALE 0xFE #define pwm0_ON_L 0x6 #define pwm0_ON_H 0x7 #define pwm0_OFF_L 0x8 #define pwm0_OFF_H 0x9 #define ALLpwm_ON_L 0xFA #define ALLpwm_ON_H 0xFB #define ALLpwm_OFF_L 0xFC #define ALLpwm_OFF_H 0xFD

void iic_delay()//延时5us {

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }

void iic_start()//scl高电平区间,sda一个下降沿启动信号 {

SDA=1; iic_delay(); SCL=1; iic_delay(); SDA=0; iic_delay(); SCL=0; iic_delay();

42

}

void iic_stop()//scl在高电平区间,sda一个上升沿信号 {

SDA=0; iic_delay(); SCL=1; iic_delay(); SDA=1; iic_delay(); }

void iic_wait_ack()//在scl高位时,从机拉低sda引脚表示应答 {

unsigned char i=0; SCL=1; iic_delay();

while((SDA==1)&&(i<255)) {

i++; } SCL=0; iic_delay(); }

void iic_init()//初始化IIC通讯引脚 {

SCL=1; iic_delay(); SDA=1; iic_delay(); }

void iic_send_ack(bit iic_ack)//接受完成之后,发送应答位,0应答继续发送,1不应答停止发送 {

SDA=iic_ack; SCL=1; iic_delay(); SCL=0;

43

iic_delay(); }

void iic_write_byte(unsigned char iic_byte) {

unsigned char i=0; for(i=0;i<8;i++) {

SCL=0; iic_delay();

SDA=iic_byte&0X80; iic_byte=iic_byte<<1; iic_delay(); SCL=1; iic_delay(); } SCL=0; iic_delay(); SDA=1; iic_wait_ack(); }

void iic_write(unsigned char slave_addr,unsigned char iic_addr,unsigned char iic_byte) {

iic_init(); iic_start();

iic_write_byte(slave_addr); iic_write_byte(iic_addr); iic_write_byte(iic_byte); iic_stop(); }

uchar iic_read_byte()//读字节,先读高位,左移 {

unsigned char i=0; unsigned char iic_byte=0; SCL=0; iic_delay();

44

SDA=1;

iic_delay(); for(;i<8;i++) {

iic_delay(); SCL=1; iic_delay();

iic_byte=(iic_byte<<1)|SDA; SCL=0; }

iic_delay(); return iic_byte; }

uchar iic_read(unsigned char slave_addr,unsigned char iic_addr) {

unsigned char iic_byte; iic_init(); iic_start();

iic_write_byte(slave_addr); iic_write_byte(iic_addr); iic_start();

iic_write_byte(slave_addr|0x01);//发送设备地址+读信号 iic_byte=iic_read_byte();

iic_send_ack(1);//发送非应答信号 iic_stop(); return iic_byte; }

void pca_set_freq()//频率设置为50hz(20ms) {

unsigned char prescale=132,oldmode,newmode; iic_write(0x80,0x00,0x0); oldmode=iic_read(0x80,0x00); newmode=(oldmode&0x7F)|0x10; iic_write(0x80,0x00,newmode);//进入sleep iic_write(0x80,0xFE,prescale);

iic_write(0x80,0x00,oldmode);//退出sleep

45

iic_write(0x80,0x00,oldmode|0xA1);//立即重启 }

void pca_set_pwm(unsigned char channel,unsigned char angle) {

unsigned int off=102+(angle*2.27); iic_write(0x80,0x06+4*channel,0); iic_write(0x80,0x07+4*channel,0); iic_write(0x80,0x08+4*channel,off); iic_write(0x80,0x09+4*channel,off>>8); }

46

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务