自控笔记

ARM7 I2C学习–LPC2138读写24C02

花费了好长时间终于把ARM7 I2C协议读写AT24C02程序编写成功了,期间犯了好多错误,导致搞了这么长时间,现在想起来真是郁闷,不过更让人郁闷的是昨天查英语6级的成绩,又一次没过,下一次又要改革,不知道猴年马月才能过呀!唉,跑题了,还是赶快进入正题吧!

编程环境:Keil4 for Arm

仿真工具:Protues 8.0

ARM7芯片:LPC2138

24C02芯片:FM24C02F(400KHz/10m)

有关ARM7的I2C协议和24C02读写规则请参照相关使用手册。

ARM7 I2C协议

ARM7采用主发送和主接收模式。

注意事项:

1、I2C总线必需接上拉电阻

(这一点我仿真的时候搞忘了,结果无法写入和读出数据,以为程序错误,浪费了好长时间)

2、仿真的时候注意24C02的最大时钟频率

(最开始的时候我是用FM24C02仿真的,没有发现它的最大时钟频率限制为100KHz,而我设置的时钟频率是大于100KHz,结果仍然无法写入和读取数据,搞得我把程序检查了好几遍,到最后要放弃的时候,才发现,然后改成了FM24C02F,郁闷啊!)

3、写入数据以后,需要有足够的延时,要不是读不出数据的,因为24C02有写入时间,延时太短,无法成功写入。

ARM7 I2C总线

Zigbee学习笔记之基础知识

Zigbee简介

ZigBee 是一种新兴的短距离、低功耗、低数据速率、低成本、低复杂度的无线网络技术;

ZigBee 采取了 IEEE 802.15.4强有力的无线物理层所规定的全部优点 :省电、简单、成本又低的规格;ZigBee增加了逻辑网络、网络安全和应用层;

ZigBee 的主要应用领域包括无线数据采集、无线工业控制、消费性电子设备、汽车自动化、家庭和楼宇自动化、医用设备控制、远程网络控制等场合;

ZigBee 无线 可使用的频段有 3 个,分别是 2.4GHz 的 ISM 频段、欧洲的 868MHz 频段、以及美国的 915MHz 频段,而不同频段可使用的信道分别是 16 、 1 、 10 个,在中国采用2.4G频段,是免申请和免使用费的频率。

Zigbee网络拓补结构

zigbee网络拓扑结构

ZigBee技术具有强大的组网能力,可以形成星型、树型和MESH网状网,可以根据实际项目需要来选择合适的网络结构;

MESH 网状网络拓扑结构的网络具有强大的功能,网络可以通过“多级跳”的方式来通信;该拓扑结构还可以组成极为复杂的网络;网络还具备自组织、自愈功能;

星型和族树型网络适合点多多点、距离相对较近的应用。

Zigbee网络设备类型

在Zigbee网络中存在三种逻辑设备类型:协调器、路由器、和终端设备。ZigBee 网络协调器也就是网络的中心节点; ZIGBEE 全功能设备(FFD)也就是网络中的路由或中继; 精简功能设备(RFD)也就是网络中的终端节点。 Zigbee网络由一个协调器以及多个路由器和多个终端设备组成。

协调器是整个网络的核心,它最主要的作用是启动网络,其方法是选择一个相对空闲的信道,形成一个PANID。它也会协助建立网络中的安全层以及处理应用层的绑定,当整个网络启动和配置完成之后,它的功能退化为一个普通的路由器。

路由器的主要功能是提供接力作用,能扩展信号的传输范围,因此,一般情况下它应该一直处于活动状态,不应休眠。

终端设备可以睡眠或者唤醒,因此可以用电池来供电。

Zigbee相关名词

PANID的出现一般是伴随在,确定信道以后的。PANID其全称是Personal Area Network ID,网络的ID(即网络标识符),是针对一个或多个应用的网络,一般是mesh或者cluster tree两种拓扑结构之一。所有节点的panID唯一,一个网络只有一个PANID,它是由pan协调器生成的,PANID是可选配置项,用来控制ZigBee路由器和终端节点要加入那个网络。文件f8wConfg.cfg中的 ZDO_CONFIG_PAN_ID 参数可以设置为一个 0~0x3FFF 之间的一个值。协调器使用这个值,作为它要启动的网络的 PAN ID。而对于路由器节点和终端节点来说只要加入一个已经用这个参数配置了PAN ID的网络。如果要关闭这个功能,只要将这个参数设置为0xFFFF。 要更进一步控制加入过程,需要修改 ZDApp.c 文件中的ZDO_NetworkDiscoveryConfirmCB 函数。当然了,如果ZDAPP_CONFIG_PAN_ID被定义为0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PANID(0~0x3FFF),XXX经过试验发现,这个随机的PANID并非完全随机,它有规律,与IEEE地址有一定的关系:要么就是IEEE地址的低16位,要么就是一个与IEEE地址低16位非常相似的值。如IEEE地址为0x8877665544332211,PANID很有可能就是2211,或相似的值;IEEE地址为0x8877665544337777,PANID很有可能就是3777,或其它相似的值。

端点(endpoint):一个八位的数,用来定义不同的应用。一个设备包含了最多240个应用程序对象,每个应用程序对象在OSAL中对应了一个任务,当网络层接收到信息以后如何决定将此信息传递给哪个任务呢?ENDPOINT决定了传递方向。其中endpoint 0是每个设备都必须具有的,是用于寻址设备配置文件,是ZDO和APS之间的一个重要接口。endpoint 0xff是用在广播时,寻址所有活动的端点。在两个设备进行无线通信时,端点号必须相同,否则数据无法送达目的地址。

端点是一种网络通信中的数据通道,它是无线通信节点的一个通信部件,如果选择“绑定”方式实现节点间的通信,那么可以直接面对端点操作,而不需要知道绑定的两个节点的地址信息。端点的值和IEEE长地址(MAC地址)、16位短地址一样,是唯一确定的网络地址,通常结合绑定功能一起使用

簇(cluster):就是属性的集合。当一个任务接收到消息(这里所说的消息是指无线网络之中的数据)之后,一定会对消息进行处理。但是我们的应用肯定 不会盲目的处理所有消息,消息一定会被分门别类。“簇”代表了消息的类型,为与相同簇的消息具有相同的类型,而这个类型可以被用户自定义。像我们如果要控 制两组灯的开关,这时我们可以分配两个不同的CLUSTERID来区分,实现对不同灯的控制。注意接收设备的输入簇需与发送设备的输出簇相对应。

zigbee常见名词

绑定是一种两个(或者多个)应用设备之间信息流的控制机制。在最新的Z-Stack发布版本中,它被称为资源绑定,所有的设备都必须执行绑定机制。

绑定允许应用程序发送一个数据包而不需要知道目标地址。APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。

信道:Zigbee 2.4GHz的射频频段被分为16个独立的信道。每个设备都有一个DEFAULT_CHANLIST的默认信道集。协调器扫描自己的默认信道集合、并选择最小的信道作为自己所建网络的信道。中断点和路由器也要扫描默认信道集并选择一个信道上已经存在的网络加入。

Keil4 for ARM编译无法在Proteus上运行问题,以及Keil与Proteus的联调

一、Keil uVision4 for ARM编译无法在Proteus上运行问题

最近在学ARM7,昨天晚上在Keil uVision4上编写了一段LPC2138的小程序,编译后生成HEX文件,却发现在Proteus中无法仿真,但是在keil4上仿真却是正常的。以前在keil4上编写51单片机程序的时候从未出现过这种情况。在图书馆借的一本书上用的是Keil uVision3。折腾了一段时间,无果。

今天,继续昨天的工作。在上网搜索的过程总发现,有两种方法可以解决:

方法1:把生成的*.axf文件复制一份,修改后缀名*.elf。然后把这个elf文件加载到MCU中。

方法2:用记事本打开生成的*.hex文件,删除倒数第2行,保存。然后把这个hex文件加载到MCU中。

方法1经过我自己的验证没有成功,改用方法2后,问题得以解决。

二、Keil与Proteus的联调

首先需要下载vdmagdi.exe,然后安装。

安装后需要设置keil以及Proteus

1、打开Keil的安装根目录,在根目录下有一个配置设置文件:tools.ini,用记事本或其他文本编辑器的方式打开;

2、找到“[ARM]”,在代码的第7行就是,可以用“编辑==》查找”

3、在最后一行TDRV后面回车加上,TDRV11=BIN\VDMARM.DLL (“Proteus VSM Simulator”)(如果存在则不用添加),TDRV后面那个序号取决于实际情况,我的tools.ini [ARM]中最后一行TDRV序号是10,故我新增的一行为TDRV11,下面都以TDRV11为例;

4、把TDRV11添加到[ARM]下面第三行CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV9)里面,变为CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV9,TDRV11)

5、找到[ARMADS],和上面修改方法和过程一样。

6、重启keil软件,在“Options for Target”中的“Debug”和“Uitilities”栏,你会发现下拉框中多了Proteus VSM simulator选项

keil4

7、在Keil中要设置的地方有两个,打开“Options for Target”,一个是“Debug”中右上方的下拉菜单中要选择Proteus VSM simulator,并在“setting”中,把IP改为:127.0.0.1或者localhost;另一个是“Uitilities”的下拉菜单中也要选择Proteus VSM simulator。

keil4

8、在Proteus中要设置的地方有一个,在菜单栏的“debug”的下拉菜单中,选中“remote debug monitor”

keil4

系统辨识之递推极大似然法参数估计

设仿真对象

题目

噪声ε(k)是均值为0,方差为1的正态分布不相关随机噪声,输入u(k)采用幅值为1的伪随机码,采用递推极大似然法进行系统辨识

递推极大似然法递推公式:

递推公式

递推公式(1)(2)(5)

系统输入输出序列以及噪声的产生

输入序列的产生
系统的输入可以采用M序列,M序列称为伪随机二位式序列,它是一种具有某些伪随机信号的统计特性的信号,具有二位式特征。二电平M序列与二位白噪声序列的自相关函数不同,但可把二电平M序列的自相关函数近似看做二位白噪声序列。

M序列发生器

M序列发生器

M序列采用四级移位寄存器,初始值设为1010。
M序列的产生步骤:
(1)设置初始值x1=1,x2=0,x3=1,x4=0
(2)x3=1与x4=0异或,将值赋给x0
(3)将x1,x2,x3,x4移位,即x4=x3,x3=x2,x2=x1,x1=x0
(4)从步骤(2)开始循环,直至满足循环次数

M序列

M序列

噪声序列和输出序列的产生
要求噪声序列为均值为0,方差为1的正态分布不相关随机噪声。可知噪声是标准正态分布随机序列。在Matlab中,产生标准正态分布的随机数或矩阵可以用randn函数或normrnd函数。randn函数产生的随机序列必然服从标准正态分布,normrnd函数既可以产生标准正太分布随机序列也可以产生非标准正太分布随机序列产生标准正态分布分布需要给出其方差1。randn函数或normrnd函数产生标准正太分布的用法如下:
randn(m, 1)
normrnd(0, 1, 1, m)
其中m表示产生标准正态分布随机序列的个数。
由仿真对象结合噪声序列、输入序列,以及输入输出初值,y(2),y(1),u(2),u(1)可以产生输出序列。

不相关随机噪声

系统随机噪声

递推极大似然法对系统辨识过程

递推极大似然法对系统辨识过程如下:

(1)首先产生具有四位移位寄存器的M序列当作输入u(k);

(2)然后产生值为0,方差为1的正态分布不相关随机噪声ε(k)

(3)根据仿真对象的差分方程,和已知的输入u(k)以及不相关随机噪声ε(k)产生输出y(k)

(4)根据近似极大似然的递推公式,估计出参数θ(^)的值,具体递推过程如下

1设置所需初始值:e(2),e(1),ψ1,θ(^)0,P0

2根据公式(3)和(4)求出eN+1

3根据公式(2)求出θ(^)N+1

4根据公式(1)求PN+1

5根据公式(5求ψN+1

6从1处开始循环,直至最后一个观测值结束。或者,判断Max{|(θ(^)N+1-θ(^)N)/θ(^)N|}<10-4是否成立,若成立则停机,若不成立则从1处循环。

程序流程概图

程序流程概览

结果与分析

利用Matlab对仿真系统进行了辨识。通过Matlab产生的输入输出样本,利用近似极大似然法的递推公式,编程辨识出了系统的参数。极大似然估计出的参数及误差,如下表所示:

参数

a1

a2

b1

b2

c1

c2

参数真值

1.642

0.715

0.39

0.35

-1

0.2

参数估计值

1.6462

0.7204

0.3877

0.3565

-0.9932

0.1998

绝对误差

0.0042

0.0054

-0.0023

0.0065

0.0068

-0.0002

相对误差

0.256%

0.755%

0.590%

1.857%

0.680%

0.100%

系统误差曲线

绝对误差曲线

真值与估计值的对比

估计值与真值的对比

Matlab源程序: