蛇形机器人说明书

更新时间:2024-05-02 14:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

叶片轮式蛇形机器人

第一章

前言

蛇,属爬行纲,蛇亚目,脊椎动物,大部分是陆生,也有半树栖、半水栖和水栖的。蛇的行走千姿百态,或直线行走或弯蜒曲折而前进,这是由蛇的结构所决定的:蛇全身分头、躯干及尾三部分,蛇没有四肢,全身被鳞片遮盖。

蛇的运动方式:

一、弯蜒运动:爬行时,蛇体在地面上作水平波状弯曲,使弯曲处的后边施力于粗糙的地面,由地面的反作用力推动蛇体前进;

二、履带式运动:蛇没有胸骨,它的肋骨可以前后自由移动,肋骨与腹鳞之间有肋皮肌相连。当肋皮肌收缩时,肋骨便向前移动,带动宽大的腹鳞依次竖立而稍稍翘起,翘起的腹鳞就像踩着地面,但这时只是腹鳞动而蛇身没有动,接着肋皮肌放松,腹鳞的后缘施力于粗糙的地面,靠反作用把蛇体推向前方,这种运动方式产生的效果是使蛇身直线向前爬行,就像坦克;

三、伸缩运动:蛇身前部抬起尽力前伸,接触到支持的物体时,蛇身后部即跟着缩向前去,然后再抬起身体前部向前伸得到支持物,后部再缩向前去,这样交替伸缩,蛇就能不断地向前爬行,在受到惊动时,蛇身会很快地连续伸缩,加快爬行的速度,给人以跳跃的感觉。

蛇由于自身形状和运动特点使其适于在狭小空间和狭长管道以及各种地面(如硬地、沙地、软土等)上运动,蛇的多种运动形式及生理特点使它适应广泛的地理和自然环境。

1.1 研究蛇形机器人的背景和意义

2000年以来,仿生机器人学正在机器人领域占有越来越重要的位置。蛇形机器人是一种模仿蛇的运动机理和行为方式研制出的机器人,是近年来兴起的仿生机器人的一个新的分支。

蛇形机器人区别于传统的利用轮、腿或履带移动的机器人。它模仿蛇的动作,稳定性好、横截面小、高柔性,这些特点使得蛇形机器人能够进入因地震或火灾等灾害而倒塌的建筑物内部、原子反应堆和石油化工等领域的装置内部以及其他人们不能涉足的危险场所执行搜寻和检测维护任务,不仅使人更安全,也使探测、救援或维护更有效。

1

其模块化结构和高冗余度非常适应于条件非常恶劣而又要求高可靠性的战场、外层空间等环境,可用于战场上的扫雷、爆破,空间站的柔性机械手臂,通过能力很强的行星地表探测器等。

1.2国内外研究现状

随着人们对蛇形机器人的认识,世界各国都开展了蛇形机器人的研究并研制出多样机。日本的Hirose教授对蛇的运动形式有较深的研究,研制出了第一台蛇形机器人。他领导的Hirose Fukushima Lab 实验室研制开发的水中蛇形机器人,能够在水下以蛇形方式自由地游泳,和真蛇相比,动作惟妙惟肖,见图1-1;他们研制的另一种蛇形机器人长1.2米,由3节组成,用6个履带爬行,可以远程遥控,操作者可根据机器人捕捉到的画面反映的具体情况发出指令,让机器人停止、前进和改变方向,见图1-2。

图1-1 日本水中蛇形机器人 图1-2日本救援蛇形机器人

美国宇航局于1999年开始研究多关节的蛇形机器人,计划在其太空计划中用于行星地表探测以及空间站维护工作,其第三代蛇形机器人如图1-3所示,它的主体部分由约30个相同的类似于铰链的模块一起链接而成。这些模块由一个“中心脊骨”连接在一起,共同实现不同的功能。该机器人能完成蠕动前进.游动前进.翻越简单障碍物等功能。它们还可以盘绕和翻转以爬上和翻越障碍物。蛇形机器人的框架由聚碳酸酯材料制成,表面覆盖一层人工皮以防止火星环境的侵害。

德国人Gavin.H从约1997年开始从事蛇形机器人的研究工作,到目前为止共设计并制作了S1~S7七代蛇形机器人,图1-4为S5,图1-5为S7。S5已经达到相当高的

2

水平,特点是:各个关节形状尺寸不同,高度模拟生物蛇;但为二维结构,无法完成三维空间运动;依靠从动轮而不是摩擦运动,运动速度很高。

图1-3 美国宇航局的SnakeBot 图1-4 德国Gavin.H S5 图1-5 德国Gavin.H S7

挪威SINTEF研究基金会的波尔·利尔杰贝克等人日前研制成功了一种形似蟒蛇的消防机器人。这种被称为“安娜·康达”的蛇形机器人长度为3米,重量约70公斤,见图1-6。它可以与标准的消防水带相接并牵着它们进入消防队员无法到达的区域进行灭火。“安娜·康达”的行动非常灵活,可以非常迅速地穿过倒塌的墙壁,代替消防员进入高温和充满有毒气体的危险火灾现场。该机器人的能量供给方式也非常奇特,它能够直接从消防水带中获取前进的动力。“安娜·康达”全身共安装有20个靠水驱动的液压传动装置,由于每一个传动装置的开关都由计算机进行精确控制,使得机器人能够像蛇一样灵活的移动。

近年来,国内也开展了对蛇形机器人的研究工作。国防科大的Robosnake是国内最早报道的蛇形机器人,最初为二维结构,依靠从动轮前进,长约1.5米,重约3Kg。目前发展为三维结构,见图1-7。中国科学院沈阳自动化所开发出了一种实现三维空间运动的蛇形机器人,采用正交串联结构,可以完成蠕动前进、游动前进、滚转等运动,见图1-8。

3

图1-6 挪威“安娜·康达” 图1-7 国防科大RoboSnake 图1-8 中科院沈阳自动化所蛇形机器人

1.3 设计目的

设计一种具有新型运动机构的蛇形机器人,结构简单,能够提供超越目前大多数蛇形机器人的越障能力—能越过自身高度3倍以上的障碍物;运动速度快,结构、控制简单;能够进入狭小空间执行任务,攀爬楼梯,在崎岖的路面运行;有较强的负重能力,能够搭载各种传感器,用于搜救、侦察、反恐、进入危险区域探测等。

4

第二章 总体方案设计

2.1 方案选择

蛇形机器人已出现了多种结构形式,并实现了多种运动模式。蛇形机器人都是由多节组成,一般每个关节由两个舵机驱动,关节能够上下、左右运动。按照结构形式的不同,蛇形机器人可以分为两类:

一、由刚性杆组成的链状结构。目前此类蛇形机器人的代表机构有柔性关节单元蛇形机构及二自由度模块组成的蛇形机器人机构,见图2-1。这类蛇形机器人利用关节来产生驱动力,运动时多个关节舵机由处理器控制,协调动作形成仿蛇的曲线运动产生前进的动力,这种结构在平地能够达到较好的运动效果,但是在复杂地面(如乱石堆等)却不能有效的前进,原因在于这种结构的蛇形机器人身体必须不断扭动才能产生驱动力,身体摆动幅度大,当身体周围空间有障碍物限制其扭动时,便不能产生足够的驱动力使自身前进。所以适合在平坦的地面运动,能实现翻滚动作、卷住柱状物蜿蜒而上、穿上外衣能在水中游泳等,缺点是运动适应自然环境的能力不强且控制复杂,不适合在凹凸不平的自然环境中工作。

二、带有轮子或者履带的模块串连,运动直接由轮子、履带驱动或蛇体内的行波传播产生。目前此类蛇形机器人的代表机构有主动索状机构和变几何桁架结构,见图2-2。

图2-1 链状蛇形机器人 图2-2 轮状蛇形机器人

5

所示。

图3-8 改装完成后的舵机

3.6 关节处的装配

舵机动力输出采用2mm厚度铝片连接,舵机连接片结构如图3-9所示。

图3-9 舵机连接片结构 图3-10 三自由度关节处的装配

将舵机连接片安装到舵机动力输出轴上,并用螺栓通过连接片中间的轴承和固定孔将两个连接片固定在一起。安装上复位弹簧,并调整松紧度,使蛇身在运动时能产生扭转,起到减震作用,同时让叶片轮能更好地接触地面,得到更好的运动效果。关节处的装配如图3-10所示。

11

第四章 控制部分

4.1 无线遥控系统设计

该系统主要包括发射机电路和接收机电路。其中,发射机电路采用多个可变电位器将控制者的控制动作转变为模拟控制信号,发射端的单片机将输入的多路模拟信号经过A/D转换后变为数字信号,再进行编码并由串行口送到发射模块发射;接收机电路的任务则是把接收到的信号进行适当放大并从中解调出编码信号,然后通过接收端的单片机将该信号转换成相应的舵机控制信号和电动机驱动控制信号,从而完成对蛇形机器人的姿态和运动的控制。

蛇形机器人动作较多,需要由两人协同控制,采用两个游戏手柄改装成无线遥控发射器。每一个游戏手柄有两个摇杆,每一个摇杆控制一个关节,能够控制蛇形机器人关节处主管上下、左右的两个舵机, 4个摇杆控制8个舵机,能实现左转、右转、抬头、低头、弯曲等动作,另外设计了3个通道的按键开关遥控来控制蛇形机器人的前进、后退、开关灯动作。

为了能够精确控制每个关节的转动角度,决定采用带A/D转换的单片机实现比例控制。游戏手柄上的每个摇杆控制两个可变电位器,可变电位器把5V电压平均分成360度,每一个小的刻度代表一定的电压值,发射单片机一直以一定的时间间隔去查询当前的速度值,当旋钮转动了一定角度时(即输入给发射单片机一定的电压值),单片机及时将读到的数值根据单片机内部已经设置好的计算公式,计算出模型应该前进的距离或者当前应该的速度,并根据此值设置相应的定时,计数器的初值,最后由系统外部驱动电路将接收单片机收到的电信号转换成相直的机械动作;当定时器溢出产生中断以后,外部相应的驱动电路也几乎同时的发出控制信号控制模型停止任何动作,发射单片机则继续查询外界是否有新的控制指令,如此循环下去。比例输出理论上分析可以达到0 V到+Vcc,然而实际中只能尽量逼近且在一个很小范围内的变动都必须视为0,这是因为普通的线性电位器由于精度和性能的限制导致其旋转角度是270度,表现在表盘上的剩下9O度在实际操作中并没有意义。

4.2 无线遥控器单片机选择

选择STC12C2052AD作为遥控发射器控制单片机。SSTC12C2052AD引脚图如图4-1

12

所示。

4.3 无线遥控器电路设计

根据需要的功能设计遥控控制电路如图4-2所示。

图4-1 STC12C2052AD单片机引脚功能图

图4-2 遥控发射器电路图

Pl口是比例遥控信号的输入端,P1.0至P1.7分别对应蛇形机器人从头到尾的8个舵

机;P3.0至P3.3与无线数据发射模块连接,负责传送数据给无线数据发射模块;当P3.4

口由高电平变为低电平时,则控制蛇形机器人前进,当P3.5口由高电平变为低电平时,

13

则蛇形机器人后退;当P3.7口由高电平变为低电平时,则LED灯点亮,再次变为高电平时,则LED灯熄灭。端口配置情况如表4-1所示。

表4.1 遥控发射器单片机端口配置表

端口 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.7 方向 输入 输入 输入 输入 输入 输入 输入 输入 输出 输出 输出 输出 输入 输入 输入 端口连接到 第一摇杆上下电位器 第一摇杆左右电位器 第二摇杆上下电位器 第二摇杆左右电位器 第三摇杆上下电位器 第三摇杆左右电位器 第四摇杆上下电位器 第四摇杆左右电位器 无线模块SDIO 无线模块GIO1 无线模块SCS 无线模块SCK 前进按键开关 后退按键开关 LED灯按键开关 有效电平 0~5V 0~5V 0~5V 0~5V 0~5V 0~5V 0~5V 0~5V 高/低 高/低 高/低 高/低 低 低 低 作用 控制第一关节舵机上下运动 控制第一关节舵机左右运动 控制第二关节舵机上下运动 控制第二关节舵机左右运动 控制第三关节舵机上下运动 控制第三关节舵机左右运动 控制第四关节舵机上下运动 控制第四关节舵机左右运动 无线模块SPI设置 接收单片机遥控控制信号 无线模块SPI设置 无线模块SPI设置 长按,蛇形机器人前进,松开停止 长按,蛇形机器人后退,松开停止 长按,控制LED灯打开,松开熄灭

由于使用了带A/D转换的单片机,所以整个电路系统具有简洁、灵活自由、易于控制、稳定性较好等优点,大大提高了智能化自动控制的程度,而且系统的性能也很好。由于单片机各个引脚都具有很多个功能,因此在程序设计中要特别注意它们的定义和对片内特殊功能寄存器的初始化设置,以便实现相应的功能。另外,从程序设计的角度来说,软件系统的可靠性高、运行速度快,只要得到需要改变的参数便可以在同一个子程序中实现速度的改变,充分体现了单片机的优势。

4.4 无线遥控器无线数据收发模块选择

无线数据发射与接收使用2.4G无线数据收发模块,芯片为A7105。其电路如图4-3所示。

14

4.5 无线遥控器的制作

图4-3 2.4G无线数据收发模块电路图

了体积问题,使其刚好能够装入游戏手柄拆去震动电机的位置。

图4-4遥控单片机系统实物

无线数据发射模块安装在游戏手柄右侧拆去震动电机的位置,如图4-5所示。

根据设计电路图制作完成的遥控单片机系统实物如图4-4所示,制作时充分考虑

15

图4-14 直流电机驱动电路板正面 图4-15 直流电机驱动电路板背面

直流电机芯片驱动部分程序:

case 0x0B:SHI_NENG=1;//电机使能有效 YUN_A=0;

YUN_B=1;

break;

case 0x0C:SHI_NENG=1;//电机使能有效 YUN_A=1;

YUN_B=0; break;

case 0x0D:SHI_NENG=0;//按键离开时电机使能无效 break; default:break;

4.11 无线视频系统

无线视频系统采用2.4G无线摄像头和配套的接收器,标称有效距离100米。为了让无线摄像头在黑暗环境下也能够拍摄到图像,还安装了一颗高亮LED灯,LED灯可使用PWM脉冲进行调光控制。无线摄像头和LED灯一起安装在蛇形机器人头部。

4.12 电源系统

电源采用两块3.7V锂聚合物电池串联供电,经稳压电路后转变为5V,为单片机和舵机供电,稳压部分采用LM2596HVT-5.0V芯片,转换效率高。

经计算得出此蛇形机器人的评价工作电流约为1.2A(平均功率10W,平均电压8V),若要其能正常工作1小时,则需要选择总容量在1200mAh以上的两块电池。选

21

择两块600mah的电池串联供电。电路图见图4-16。

图4-16 5V稳压电路电路图

4.13 蛇形机器人实物

将所有的控制部分电路整合在一起,并用一块亚克力板封闭,防止碰撞损坏电路板,如图4-16所示。

图4-16 控制部分电路总装图

整个蛇形机器人机身除头尾有差异外,中间部分完全相同,一节就是一个模块,若要增加蛇形机器人越过障碍物的高度,只需要增加机身模块的个数就可以实现。为节约成本,蛇形机器人制作了5节,实物如图4-17所示。

22

图3-17 蛇形机器人攀爬阶梯

第五章 结论

5.1 组成

叶片轮式蛇形机器人由移动系统、姿态控制系统、遥控控制系统、无线视频系统、电源系统五个部分组成。

一、姿态控制系统

本叶片轮式蛇形机器人设计为5节,约半米长,共有4个关节,每个关节有三个自由度,两个可控制自由度,一个自平衡旋转自由度,通过控制关节处的舵机实现蛇形机器人姿态的改变。

二、移动系统

通过1个直流减速电机驱动10个叶片轮前进,比轮式驱动更容易越过障碍物。每个叶片轮由三片弹簧片相隔1200固定于轮轴上,每片都略微向后弯曲,以防止前进时将杂物卷起卡住叶片轮。

三、遥控控制系统

包括无线遥控发射器和无线遥控接收器。控制者通过无线摄像头传回的图像了解蛇形机器人周围地形情况,使用无线遥控发射器将控制信号传送给无线遥控接收器,单片机对信号进行处理后驱动直流减速电机和舵机,实现动作控制。

四、无线视频系统

通过无线摄像头将蛇形机器人周围图像传送到控制者的显示设备上,实现超视距

23

控制。

五、电源系统

采用两块3.7V的锂聚合物电池串联供电。

5.2 功能

一、可攀爬阶梯

在遥控控制下,蛇形机器人轻易就爬上了十几厘米高的阶梯,见图5-1;

图5-1 蛇形机器人攀爬阶梯 图5-2 蛇形机器人草地运行

二、可在草坪爬行

蛇形机器人在草坪爬行,如履平地,见图5-2; 三、翻越乱石堆

蛇形机器人能够轻易翻越乱石堆,见图5-3;

图5-3 蛇形机器人乱石堆运行 图5-4 蛇形机器人翻越深沟

四、翻越沟壑

蛇形机器人能够轻易翻越30cm宽,20cm深的沟壑,见图5-4。

5.3特点

一、越障性能强—能越过自身高度3倍以上的障碍物;可攀爬楼梯,在崎岖的路面运行;

24

二、控制简单; 三、结构简单; 四、尺寸小,重量轻。 五、运动速度快;

六、有较强的负重能力,能够搭载各种传感器以满足不同需要。

5.4 应用

一、能够进入因地震或火灾等灾害而倒塌的建筑物内部执行搜寻任务; 二、能够进入原子反应堆和石油化工等领域的装置内部执行检测任务; 三、能够进入人们不能涉足的生化等危险场所执行搜寻和检测维护任务; 四、条件非常恶劣而又要求高可靠性的战场、外层空间等环境,可用于战场上的扫雷、爆破,空间站的柔性机械手臂,通过能力很强的行星地表探测器等。

参考文献

[1]崔显世,颜国正.一个微小型仿蛇机器人样机的研究[J].机器人,1999,21(2):156—160

[2]刘华。颜国正,丁国清.仿蛇变体机器人运动机理研究[J].机器人,2002,24(2):154—158

[3]熊翔等.基于蛇类生物的仿生变体机器人研究[J].机电与控制学报,2001,(12) [4]汪洋等.蛇形机器人控制系统的设计与实现[J].机器人,2003,(11) [5]刘莹,张恺.应用单片机实现多通道无线比例控制.电气传动自动化, 2003年第25卷第1期

[6]赵敏.基于单片机的多通道比例遥控器.电子世界,2004年第12期 [7]冯建华,赵亮.单片机应用系统设计与产品开发,2004. 11 [8]赵建领.51系列单片机开发宝典,2007.4 [9]傅晓林.模拟电子技术,2002.10

[10]程开明,唐治德.数字电子技术,1992.5

[11]GM.Robot-Snake with Flexible Real-Time Control, http://ais.gmd.de/BAR/index.htm [12]http://www.snakerobots.com/ [13]Dr. Gavin Miller.

25

http://www.cs.cmu.edu/~biorobotics/projects/modsnake/index.html

[14]Nilsson Martin.Snake robot free climbing[J].IEEE Control Systems,1998.2:21— 26

[15]A behavior-based arm contoller.Jonathan H Connell, MIT AI Memo 1025,June1988 [16]The Mobile Robotics Lab at the University of Michigan (UM) .The OmniTread serpentine robot ,http://www.engin.umich.edu/research/mrl/00MoRob_6.html [17]How Snakes Walk.http://chabin.laurent.free.fr/snake.htm

附录

26

附录

27

附录

Ⅲ接收控制程序如下,发射程序与之类似,省略之。

/************************************************************************* ;filename :rf.c ;RF :A7105 ;rf crystal :16MHZ

;RF rate :250k

;mcu :STC12C2052AD ;writeby : ;describe :A7105 控制 ;notice

:Fdev 固定为 80k

;***********************************************************************/ #include \

28

U8 const code Rf_Rate_Tab[7] = {19,9,7,4,3,1,0}; //25k,50k,62.5k,100k,125k,250k,500k // A7105 寄存器默认配置

U8 const code A7105_Default_Par[51] = {

//0x00 register

0x00, // RESET register : not use on config //0x01 register

//#if(TEST_MODE) //

0xc2,

// direct mode

//#else

0x42, // MODE register: FIFO mode

//#endif

//0x02 register

0x00, // CALIBRATION register //0x03 register

RF_FIFO_LEN - 1, // FIFO1 register : packet length //0x04 register

//0x05 register

0x00, // fifo register,not use on config //0x06 register

0x00, // ID data register,not use on config

0xc0, // FIFO2 register : FIFO pointer margin threshold 16/48bytes(TX/RX)

//0x07 register

0x00, // RCOSC1 register 0x00, // RCOSC2 register 0x00, // RCOSC3 register //0x0a register

// 0x02, // CKO register,clk out enable,bit clock 0x00, // CKO disable

//0x0b register

0x01, // GPIO1 register :WTR output,enable GPIO1 output 0x09, // GPIO2 register :CD carrier detect,enable GPIO2 output // GPIO1,2按上面设置时,GPIO1保持为高电平, // 发送方发送一帧数据时,GPIO1会由高变低,接收方GPIO2也由高变低 //0x0d register

0x05, // CLOCK register: Crystal oscillator enable bit //0x0e register

0x01, // data rate select 250K

// data rate = system clock / 32*(SDR[7:0] + 1 // 0x04, // data rate = 100k //0x0f register

0x03, // PLL register1, LO channel number select

// channel = 0x14 RF frequency = 2400MHZ + 500K * 20 = 2.410GHZ //0x10 register

29

0x9e, // PLL register2,

// DBL = 1, crystal frequency double select

// RRC[1:0] = 00, Fpfd = Fcrystal(16MHZ) * (1 + DBL) /(RRC[1:0] + 1) = 32MHZ

// CHR[3:0] = 0x0F, channel frequency step setting

// channel setp frequency = 0.25 * Fpfd / (CHR[3:0] + 1) = 500KHZ //0x11 register

0x4b, // PLL register3 BIP[7:0] = 75 0x00, // PLL register4 BFP[15:8] = 0 0x00, //0x14 register // 0x06,

0x16, // 0x2b, /2^24 = 187.5KHZ

// 0x20, // 0x21, // 0x22, 0x23, //

0x24, // 0x25, // 0x26, // 0x27, // 0x28, // 0x29, // 0x2a, //

0x2b, // 0x2c, // 0x2d, // 0x2e, // 0x2f, //

0x30,

// 0x32, // 0x39, //0x16 register 0x12, //0x17 register

// PLL register5 BFP[7:0] = 0 // TX register1

// frequency deviation power setting = [110]

// TX modulation disable

// enable tx modulation //0x15 register // Fdev = 187k // TX register2

// Fpfd = 32MHZ,PDV[1:0] = 01,SDR[7:0] = 0000 0001 // Tx rate = Fpfd / (32 * (PDV[1:0]+1) * (SDR[7:0]+1)) = 250kbps // TX frequency deviation = Fpfd * 127 * 2^FDP[2:0] * (FD[4:0]+1) // Fdev = 15K @FD[2:0] = [110] // Fdev = 31k @FD[2:0] = [110] // Fdev = 46k @FD[2:0] = [110] // Fdev = 62k @FD[2:0] = [110]

// Fdev = 80k @FD[2:0] = [110]

// Fdev = 93k @FD[2:0] = [110] // Fdev = 108k @FD[2:0] = [110] // Fdev = 124k @FD[2:0] = [110] // Fdev = 139k @FD[2:0] = [110] // Fdev = 155k @FD[2:0] = [110] // Fdev = 170k @FD[2:0] = [110] // Fdev = 186k @FD[2:0] = [110]

// Fdev = 200k @FD[2:0] = [110] // Fdev = 217k @FD[2:0] = [110] // Fdev = 232k @FD[2:0] = [110] // Fdev = 248k @FD[2:0] = [110] // Fdev = 263k @FD[2:0] = [110]

// Fdev = 294k @FD[2:0] = [110] // Fdev = 400k @FD[2:0] = [110]

// Delay register1

// DPR[2:0] = 0, TDL[1:0] = 2, PDL[2:0] = 2

// TX setting delay = 20*(TDL[1:0]+1)*(DPR[2:0]+1) = 20*3 = 60us // PLL setting delay = 20*(PDL[2:0]+1)*(DPR[2:0]+1) = 20*3 = 60us 30

0xf8, // Delay register2

// Crystal turn on delay 2.5ms // AGC delay 40us

// RSSI measurement delay 10us //0x18 register

0x26, // RX register

// Demodulator filter bandwidth = 1M // Demodulator gain select * 3 // BPF bandwidth 500khz // Up side band select

// 0x36, // AFC = 1,frequency compensation select (auto) //0x19 register

0x80, // RX gain register1, 手动校验VGA, PGA gain 12db,mixer gain 24db, LNA gain 24db

//0x1a register

0x80, // RX gain register2, VGA calibrate upper limit target //0x1b register

0x00, // RX gain register3, VGA calibrate lower limit target

//0x1c register

0x0e, // RX gain register4, VGC calibrate continues until ID code word is received

// Mixer current select 1.2mA // LNA current select 2.0mA //0x1d register

0x32, // RSSI register RSSI 50 //0x1e register

0xc3, // ADC register //0x1f register

// 0x0f, // CODE register1, ID length 4 bytes, preamble length 4 bytes // 0x4f, // open manchester 0x5f, // open manchester, FEC //0x20 register

0x12, // CODE register2, //0x21 register

0x00, // CODE register3, //0x22 register

0x00, // IF calibration1, auto calibration IF //0x23 register

0x00, // IF calibration2, read only

//0x24 register

0x00, // VCO current calibration register //0x25 register

0x00, // VCO Single band calibration register1

// auto calibration //0x26 register

31

0x3a, // VCO Single band calibration register2 // REGA = 1.1V,VCO tuning voltage =0.3V //0x27 register

0x00, // battery register default //0x28 register

0x17, // TX test register default //0x29 register

0x47, // RX DEM test registe1 default //0x2a register

0x80, // RX DEM test register2 defalut //0x2b register

0x01, // charge pump current register // charge pump curretn = 1.0mA //0x2c register

0x05, // Crystal test register default //0x2d register

0x45, // PLL TEST register default //0x2e register

//0x2f register

0x00, // VCO test register2 default //0x30 register

0x01, // IFAT register default

0x18, // VCO test register1 default

//0x31 register

0x0f, // RScale register RSSI tuning scale default

//0x32 register

0x00 // Filter test register default };

/**************************************************************** name: ini rf input: none output: none

describe: 初始化A7105 notice:

creat date: 2009-5 creator:

****************************************************************/ void ini_rf(void) {

set_rf_io();

A7105_reset_chip(); delay_2us(50000); A7105_write_ID(); A7105_config_chip(); A7105_calibration();

32

A7105_setup_channel(3); A7105_setup_wpll(); delay_2us(100); A7105_entry_rx(); }

// 接收状态

/**************************************************************** name: A7105_config_chip input:

none

output: none describe: 配置A7105 notice: creat date:

2009-5

creator:

****************************************************************/ void A7105_config_chip(void) {

U8 i = 0;

// 0x00 mode register, for reset // 0x05 fifo data register

// 0x06 id code register

// 0x23 IF calibration II, only read // 0x32 filter test register for(i=0x01; i<=0x04; i++)

{

A7105_write_register(i,A7105_Default_Par[i]); } {

A7105_write_register(i,A7105_Default_Par[i]); } {

for (i=0x24; i<=0x31; i++) for(i=0x07; i<=0x22; i++)

A7105_write_register(i,A7105_Default_Par[i]); }

}

/**************************************************************** name: set_rf_io input: none output: none

describe: 上电时设置RF的I/O口方向及状态 notice: creat date: 2009-5 creator:

****************************************************************/ void set_rf_io(void)

33

{

RF_SCK_LOW(); RF_SDIO_LOW(); RF_SCS_HIGH(); RF_TX_PA_OFF(); }

RF_GPIO1_INPUT();

/******************************************************* name: input:

A7105_calibration none

output:

describe: 校验A7105

notice:1. RF 上电后一定要调用该程序对VCO进行校验2. 校验时需在 stby 状态 creat date:

2009-5

creator:

********************************************************/ void A7105_calibration(void) {

U8 temp = 0; // standby状态下校准IF

A7105_entry_stby();

A7105_write_register(RF_REG_CALIBRATION,0x01); do

{

temp = A7105_read_register(RF_REG_CALIBRATION); temp &= 0x01; }while(temp);

temp = A7105_read_register(RF_REG_IF_CALIBRATION1); temp &= 0x10; if(temp)

{

// 校准出错

}

// anual vco current band 3,vco band 1

A7105_write_register(RF_REG_VCO_CURRENT_CAL,0x13); A7105_write_register(RF_REG_VCO_BAND_CAL1,0x09); A7105_entry_stby();

}

/*************************************************** name: input: output: Describe: RFNotice: creat date:

A7105_entry_stby none none

进入等待模式 2009-5

34

creator:

***************************************************/ void A7105_entry_stby(void)

{

A7105_write_command(RF_CMD_STBY); delay_2us(100); }

/*************************************************** name: input:

A7105_setup_wpll none

output: none Describe: Notice:

creat date: 2008-7-20

creator:

***************************************************/ void A7105_setup_wpll(void) {

A7105_write_command(RF_CMD_PLL);

}

/*************************************************** name: A7105_setup_channel input: channel RF工作通道 output: none

Describe: 设置RF的工作频率 Notice:

creat date: 2008-8-7 creator: dengyihong

***************************************************/ void A7105_setup_channel(U8 channel)

{

A7105_write_register(RF_REG_PLL1,channel);

}

/*************************************************** name: input:

A7105_setup_data_rate

data_rate_cnt 要写入A7105的速率参数

output: none

Describe: 设置A7105的速率 Notice:

creat date: 2008-8-8 creator:

***************************************************/ void A7105_setup_data_rate(U8 data_rate_cnt) {

A7105_write_register(RF_REG_DATA_RATE,data_rate_cnt);

35

}

/*************************************************** name: rf_entry_rx input: none output: none

Describe: RF进入RX模式 Notice:

creat date: 2008-7-20 creator:

***************************************************/ void A7105_entry_rx(void) {

A7105_write_command(RF_CMD_RX); RF_TX_PA_OFF();

}

/*************************************************** FileName: rf_entry_tx input: none output: none

Describe: RF进入发射模式 Notice:

在进入发射状态时要改变载波频率

creat date: 2008-7-20 creator:

***************************************************/ void A7105_entry_tx(void)

{

A7105_write_command(RF_CMD_TX);

RF_TX_PA_ON();

}

/*************************************************** name: A7105_reset_chip input:

none

output: none

Describe: 软件复位A7105 Notice: creat date: 2009-5 creator:

***************************************************/ void A7105_reset_chip(void)

{

A7105_write_register(RF_REG_MODE,0x00); }

/*************************************************** name: A7105_reset_RX_fifo input:

none

36

// A7105芯片Reset output: none Describe: reset RX fifo Notice:

creat date: 2008-7-20 creator:

***************************************************/ void A7105_reset_RX_fifo(void) {

A7105_write_command(RF_CMD_RX_FIFO_RESET); }

/*************************************************** FileName: A7105_reset_TX_fifo input: output:

none none

Describe: reset TX fifo Notice: creat date: 2009-5 creator:

***************************************************/ void A7105_reset_TX_fifo(void) {

A7105_write_command(RF_CMD_TX_FIFO_RESET); }

/*************************************************** name: write_register input: 1.bits 写入寄存器的bit数 2.value 写寄存器的值 output: none

Describe: 写数据到RF内部的寄存器 Notice:

creat date: 2009-5 creator:

***************************************************/ void write_register(U8 bits,U8 value) {

U8 i = 0;

for(i=0; i

if(value & 0x80) {

RF_SDIO_HIGH(); } else

{

RF_SDIO_LOW();

37

}

RF_SCK_HIGH(); value <<= 0x01; RF_SCK_LOW(); }

}

/*************************************************** name: input:

read_register none

output: ret_byte

Describe: 读取RF寄存器的值

Notice: 1.在调用该函数时一定要先将MCU与SDIO相连的pin设置为输入

2.在调用该函数前一定要先写入需要读的寄存器地址 2009-5

creat date:

creator:

***************************************************/ U8 read_register(void) {

U8 i = 0;

U8 ret_byte = 0; RF_SDIO_INPUT(); for(i=0; i<0x08; i++) {

ret_byte <<= 0x01; if(GET_RF_SDIO()) {

ret_byte |= 0x01; }

RF_SCK_HIGH(); RF_SCK_LOW(); }

return ret_byte;

}

/*************************************************** name: input:

A7105_write_command

command: 写入到RF的命令

output: none Describe: 写命令到RF Notice:

creat date: 2009-5 creator:

***************************************************/ void A7105_write_command(U8 command) {

RF_SCS_LOW();

38

write_register(0x04, command); RF_SCS_HIGH(); }

/*************************************************** name: A7105_write_register input: 1. address 写寄存器的地址 2. value 写寄存器的值 output: none

Describe: 写数据到RF寄存器 Notice:

creat date: 2009-5 creator:

***************************************************/ void A7105_write_register(U8 address,U8 value)

{

RF_SCS_LOW(); address &= 0x7f; // write data register write_register(0x08,address); // write address write_register(0x08,value);

// write data

RF_SCS_HIGH(); }

/*************************************************** name: A7105_read_register input: address 写入要读寄存器的地址 output: temp

Describe: 从RF寄存器读数据 Notice: creat date:

2009-5

creator:

***************************************************/ U8 A7105_read_register(U8 address) {

U8 temp = 0;

RF_SCS_LOW(); address &= 0x7f; address |= 0x40;

write_register(0x08,address); // RF_SDIO_INPUT(); temp = read_register();

RF_SCS_HIGH(); return temp; }

/*************************************************** name: input:

A7105_write_ID none

39

output: none Describe: 写入ID Notice:

creat date: 2009-5 creator:

***************************************************/ void A7105_write_ID(void) {

RF_SCS_LOW();

write_register(0x08,RF_REG_ID_DATA); write_register(0x08,RF_ID_CODE0); write_register(0x08,RF_ID_CODE1); write_register(0x08,RF_ID_CODE2); write_register(0x08,RF_ID_CODE3);

RF_SCS_HIGH(); }

/*************************************************** name: A7105_read_ID input:

none

output: none

Describe: 从RF中读ID Notice: creat date:

2009-5

// write address // 写ID code

creator:

***************************************************/ void A7105_read_ID(U8 *read_ptr) {

U8 id_buff[4] = {0};

RF_SCS_LOW();

write_register(0x08,(RF_REG_ID_DATA | 0x40)); // 先写入要读的寄存器地址 RF_SDIO_INPUT(); *read_ptr++ = read_register(); *read_ptr++ = read_register(); *read_ptr++ = read_register(); *read_ptr++ = read_register(); RF_SCS_HIGH(); }

/*************************************************** name: write_data_to_fifo input: send_cnt 写入的字节数 output: none

Describe: 写数据到FIFO中 Notice:

creat date: 2009-5 creator:

40

本文来源:https://www.bwwdw.com/article/x41g.html

Top