各位大神们已经交作品了,本菜鸟还没做完,表示压力很大。活动虽然已经截止了,但东西还是要做出来,给论坛一个交代。这次作品是想借助【相差测距】测量两个板子之间的距离,并用LCD显示;并且设置距离上限值,超限后协调器端报警,可以应用于贵重物品防盗。
其实一直想等LCD调通之后再发的,但LCD比较老走的三线制spi,不能用例程里的spi,就自己用IO口模拟,时序图都对了,就是不出字,感觉是时间没控制好,目前还在紧张调试中。
关于相差测距:【ATMEL宣布AT86RF233 2.4GHz IEEE 802.15.4 无线电收发器能支持两个无线电设备之间的距离测量,也就是测距(ranging)。这项创新技术使用无线电信号之间的相差(phase difference)以测量,实现了无线网络内的物体追踪,用于工业和消费应用。相位测量相比今天市场上提供的通用距离测量技术,是并不复杂的技术,并且具有相似的测量精度和较低的整体系统成本。】
datasheet上有下面的介绍
40.11 Phase Difference Measurement
The Phase Difference Measurement Unit (PMU) is characterized by: Relative phase measurement of received signal
40.11.1 Overview
The AT86RF233 performs a phase measurement of a received signal relative to an internal reference. The derived value represents the phase delay of the received signal referenced to an internal reference signal in the receiver low-IF domain, see “Receiver (RX)” on page 974. The measured value is captured in register bits PMU_VALUE (register 0x3B, PHY_PMU_VALUE) and periodically updated.
The register bit PMU_IF_INVERSE controls the PMU Intermediate Frequency path.
The register bits PMU_VALUE signals the PMU measurement value
基本测距流程
细节流程
关于相差测距,研究了很久之后发现是个大坑。一位大神建议把那几个pmu对应的函数内部流程搞清楚,自己写。我表示力不从心啊,只好转到RSSI上。
Received Signal Strength Indication接收的信号强度指示,无线发送层的可选部分,用来判定链接质量,以及是否增大广播发送强度。通过接收到的信号强弱测定信号点与接收点的距离,进而根据相应数据进行定位计算的一种定位技术。
网上查了一些资料,RSSI=-(10*n*lgd+A) n代表传播指数,A代表距离1m时接受信号强度绝对值 单位dBm 根据这个公式的推导距离d
所以d=10^((ABS(RSSI)-A)/(10*n))
其中A值的最佳范围为45—49,n值最佳范围为3.25—4.5
于是根据公式编了一段计算距离的程序
// 距离dis=10^((ABS(RSSI)-A)/(10*n))
double bbb = abs(msg->rssi); //求出rssi的绝对值
double ccc=(bbb-48.0)/45.0;
double dis=exp10(ccc) ; //求出10的ccc次方
反复试了几次,A取了48,n取了4.5,可能不同的环境有差别吧
当然要添加头文件
#include "fastmath.h"
其中用到的两个数学函数
#define abs(x) fast_abs(x) //取绝对值
#define exp10(x) fast_exp10(x) //10的x次方
上视频
3米内,引脚输出低电平;
3-6米,脉冲;
6米以上,输出高电平。
上代码
在wsndemo.c中写的
- #if APP_COORDINATOR
- appUartSendMessage(ind->data, ind->size);
-
- if (APP_CommandsPending(ind->srcAddr)) {
- NWK_SetAckControl(APP_COMMAND_PENDING);
- }
-
- // 距离dis=10^((ABS(RSSI)-A)/(10*n))
- double bbb = abs(msg->rssi);
- double ccc=(bbb-48.0)/45.0;
- double dis=exp10(ccc) ;
-
- if(dis<3)
- {
- port_pin_set_output_level(PIN_PA13,0);
- }
- else if (dis<6)
- {
- port_pin_set_output_level(PIN_PA13,1);
- delay_ms(50);
- port_pin_set_output_level(PIN_PA13,0);
- }else
- {
- port_pin_set_output_level(PIN_PA13,1);
- }
-
- #endif
- return true;
- }
用LCD显示距离的话会直观很多,现在只好用这种笨办法演示一下。
ASF库里给的这几个例程确实很好用,我用的是wsndemo,其中终端通过appSendData()发数据,协调器通过appDataInd()接收数据。
小弟之前只玩过51,没用过库函数,结构体也不太明白。这次能参与到这个活动真挺幸运的,学到了很多东西。我读的是双控,一直在帮导师做PLC相关的项目,玩板子方面实在是菜鸟,以后还多向各位大神请教。
后面调好LCD再补充吧。
本帖最后由 义剑仗乾坤 于 2015-4-2 21:32 编辑