ZigBee基础实验(七)--AD采集温度串口显示

发布者:渤海湾最新更新时间:2019-04-09 来源: eefocus关键字:ZigBee  采集温度  串口显示 手机看文章 扫描二维码
随时随地手机看文章

1、ADC 简介

  ADC 支持多达14 位的模拟数字转换,具有多达12 位有效数字位。它包括一个模拟多路转换器,具有多达8 个各自可配置的通道;以及一个参考电压发生器。转换结果通过DMA 写入存储器。还具有若干运行模式。

  ADC 的主要特性如下:

● 可选的抽取率,这也设置了分辨率(7 到12 位)
● 8 个独立的输入通道,可接受单端或差分信号
● 参考电压可选为内部单端、外部单端、外部差分或AVDD5
● 产生中断请求
● 转换结束时的DMA 触发
● 温度传感器输入
● 电池测量功能


 

2、ADC 操作

  本节描述了ADC 的一般安装和操作,并描述了CPU 存取的ADC 控制和状态寄存器的使用。

 

2.1、ADC 输入

  The signals on the Port 0 pins can be used as ADC inputs. In the following, these port pins are referred to as the AIN0–AIN7 pins. The input pins AIN0–AIN7 are connected to the ADC.


  可以把输入配置为单端或差分输入。在选择差分输入的情况下,差分输入包括输入对AIN0-1、AIN2-3、AIN4-5 和AIN6-7。电压不能为负或者大于VDD。这些输入对之间的区别书他们采用不同的模式进行转换。


  除了输入引脚AIN0-AIN7,片上温度传感器的输出也可以选择作为ADC 的输入,用于温度测量。为此寄存器TR0.ADCTM 和ATEST.ATESTCTRL 必须分别按2.10 节和寄存器描述所述设置。


  还可以输入一个对应AVDD5/3 的电压作为一个ADC 输入。这个输入允许诸如需要在应用中实现一个电池监测器的功能。注意在这种情况下参考电压不能取决于电源电压,比如AVDD5 电压不能用作一个参考电压。


  单端电压输入AIN0 到AIN7 以通道号码0 到7 表示。通道号码8 到11 表示差分输入,由AIN0–AIN1、AIN2–AIN3、AIN4–AIN5 和AIN6–AIN7 组成。通道号码12 到15 表示G N D(12)温度传感器(14),和AVDD5/3(15)。这些值在ADCCON2.SCH 和ADCCON3.SCH 域中使用。

 

2.2、ADC 转换序列(暂时难理解)

  ADC将执行一系列的转换,并把结果移动到存储器(通过DMA),不需要任何CPU 干预。


  转换序列可以被APCFG 寄存器影响,八位模拟输入来自I/O 引脚,不必经过编程变为模拟输入。如果一个通道正常情况下应是序列的一部分,但是相应的模拟输入在APCFG 中禁用,那么通道将被跳过。当使用差分输入,处于差分对的两个引脚都必须在APCFG 寄存器中设置为模拟输入引脚。


  The ADCCON2.SCH(用于定义转换序列) register bits are used to define an ADC conversion sequence from the ADC inputs.


  If ADCCON2.SCH is set to a value less than 8, the conversion sequence contains a conversion from each channel from 0 up to and including the channel number programmed in ADCCON2.SCH.(当设置该寄存器值小于8时,转换序列为从通道0到SCH定义的值,包括该值)


  When ADCCON2.SCH is set to a value between 8 and 12, the sequence consists of differential inputs, starting at channel 8 and ending at the programmed channel.(在8~12之间,为缠粉输入,通道从8到定义的值)


  For ADCCON2.SCH greater than or equal to 12, the sequence consists of the selected channel only.(如果大于12,则定义哪个就是哪个)

  PS:the channel define in the last of 2.1

 

2.3、Single ADC Conversion(单个ADC转换,2.2是设置一个ADC序列进行转换)

  In addition to this sequence of conversions, the ADC can be programmed to perform a single conversion from any channel(ADC能够配置从任何一个channel开执行一次单通道转换). Such a conversion is triggered by writing to the ADCCON3 register. (转换开始的条件->)The conversion starts immediately unless a conversion sequence is already ongoing, in which case the single conversion is performed as soon as that sequence is finished.

 

2.4、ADC Operating Modes

  本节描述:operating modes and initialization of conversions.

  The ADC has three control registers: ADCCON1, ADCCON2, and ADCCON3. These registers are used to configure the ADC and to report status.

  1. ADCCON1.EOC 位是一个状态位,当一个转换结束时,设置为高电平;当读取ADCH 时,它就被清除。

  2. ADCCON1.ST 位用于启动一个转换序列。当这个位设置为高电平,ADCCON1.STSEL 是11,且当前没有转换正在运行时,就启动一个序列。当这个序列转换完成,这个位就被自动清除。

  3. ADCCON1.STSEL 位选择哪个事件将启动一个新的转换序列。该选项可以选择为外部引脚P2.0 上升沿或外部引脚事件,之前序列的结束事件,定时器1 的通道0 比较事件或ADCCON1.ST 是1。

  4. ADCCON2 寄存器控制转换序列是如何执行的。

  5. ADCCON2.SREF 用于选择参考电压。参考电压只能在没有转换运行的时候修改。

  6. ADCCON2.SDIV 位选择抽取率(并因此也设置了分辨率和完成一个转换所需的时间,或样本率)。抽取率只能在没有转换运行的时候修改。

  7. 转换序列的最后一个通道由ADCCON2.SCH 位选择,如上所述。

  8. ADCCON3 寄存器控制单个转换的通道号码、参考电压和抽取率。单个转换在寄存器ADCCON3 写入后将立即发生,或如果一个转换序列正在进行,该序列结束之后立即发生。该寄存器位的编码和ADCCON2 是完全一样的。

 

2.5、ADC 转换结果

  数字转换结果以2 的补码形式表示。对于单端配置,结果总是为正。这是因为结果是输入信号和地面之间的差值,它总是一个正符号数(Vconv=Vinp-Vinn,其中Vinn=0V)。当输入幅度等于所选的电压参考VREF时,达到最大值。


  对于差分配置,两个引脚对之间的差分被转换,这个差分可以是负符号数。对于抽取率是512的一个数字转换结果的12 位MSB,当模拟输入Vconv 等于VREF 时,数字转换结果是2047。当模拟输入等于-VREF 时,数字转换结果是-2048。


  当ADCCON1.EOC 设置为1 时,数字转换结果是可以获得的,且结果放在ADCH 和ADCL 中。注意转换结果总是驻留在ADCH 和ADCL 寄存器组合的MSB 段中。

  当读取ADCCON2.SCH 位时,它们将指示转换在哪个通道上进行。ADCL 和ADCH 中的结果一般适用于之前的转换。如果转换序列已经结束, ADCCON2.SCH 的值大于最后一个通道号码,但是如果最后写入ADCCON2.SCH 的通道号码是12 或更大,将读回同一个值。

 

2.6、ADC 参考电压

  模拟数字转换的正参考电压可选择为一个内部生成的电压,AVDD5 引脚,适用于AIN7 输入引脚的外部电压,或适用于AIN6-AIN7 输入引脚的差分电压。


  转换结果的准确性取决于参考电压的稳定性和噪音属性。希望的电压有偏差会导致ADC 增益误差,与希望电压和实际电压的比例成正比。参考电压的噪音必须低于ADC 的量化噪音,以确保达到规定的SNR。

 

2.7、ADC 转换时间

  ADC 只能运行在32 MHz XOSC 上,用户不能整除系统时钟。实际ADC 采样的4 MHz 的频率由固定的内部划分器产生。执行一个转换所需的时间取决于所选的抽取率。总的来说,转换时间由以下公式给定:

Tconv = (抽取率+ 16) x 0.25 μs。

 

2.8、ADC 中断

  当通过写ADCCON3 触发的一个单个转换完成时,ADC 将产生一个中断。当完成一个序列转换时,不产生一个中断。

 

2.9、ADC DMA 触发(和ADC中断有种互补的感觉~)

  每完成一个序列转换,ADC 将产生一个DMA 触发。当完成一个单个转换,不产生DMA 触发。


  There is one DMA trigger for each of the eight channels defined by the first eight possible settings for ADCCON2.SCH。当通道中一个新的样本准备转换,DMA 触发是活动的。The DMA triggers are named ADC_CHsd in Following Table, where s is single-ended channel and d is differential channel。


  In addition, one DMA trigger, ADC_CHALL, is active when new data is ready from any of the channels in the ADC conversion sequence.


 

3、工程解析

从下面main函数可以看出,整个流程是先初始化串口收发(这个和上一节介绍的串口收发一模一样,请参考上一节);接着是初始化ADC将片上片上温度传感器的输出选择作为ADC 的输入用于温度测量;在while大循环内则是连续读取64次温度数据并求平均(代码中求平均方法有点怪),最后通过串口将采集的片内温度传感器数据输出。


 1 void main(void) 

 2 {   

 3     char i; 

 4     float AvgTemp;   

 5     char strTemp[6];

 6     

 7     InitUART();                           //初始化串口 

 8     InitSensor();                         //初始化 ADC 

 9     

10     while(1) 

11     { 

12         AvgTemp = GetTemperature();   

13         

14         for (i=0; i<63; i++) 

15         {    

16             AvgTemp += GetTemperature();  

17             AvgTemp = AvgTemp/2;          //每次累加后除 2 

18         }

19        

20         memset(strTemp, 0, 6);

21         sprintf(strTemp,"%.02f", AvgTemp);//将浮点数转成字符串

22         UartSendString(strTemp, 5);       //通过串口发给电脑显示芯片温度

23         DelayMS(1000);                    //延时

24     } 

25 }

 

其中initSensor()是对ADC进行初始化:

第3行#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)是关闭所有中断;

第4行为设置系统主时钟为32M,上一节中main函数最前面做的工作;

1 void InitSensor(void)

2 { 

3    DISABLE_ALL_INTERRUPTS();     //关闭所有中断 

4    InitClock();                  //设置系统主时钟为 32M 

5    TR0=0x01;                     //设置为1来连接温度传感器到SOC_ADC

6    ATEST=0x01;                   //使能温度传感

7 }   


第5行TR0=1为设置温度传感器连接到SOC_ADC:

第6行ATEST=1为使能温度传感器:

 

其中GetTemperature()函数用来获取温度传感器AD的值:

 1 /****************************************************************************

 2 * 名    称: GetTemperature()

 3 * 功    能: 获取温度传感器 AD 值

 4 * 入口参数: 无

 5 * 出口参数: 通过计算返回实际的温度值

 6 ****************************************************************************/

 7 float GetTemperature(void)

 8 { 

 9    uint  value; 

10    

11    ADCCON3  = (0x3E);            //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样

12    ADCCON1 |= 0x30;              //选择ADC的启动模式为手动

13    ADCCON1 |= 0x40;              //启动AD转化  

14    while(!(ADCCON1 & 0x80));     //等待 AD 转换完成 

15    value =  ADCL >> 4;           //ADCL 寄存器低 2 位无效,由于他只有12位有效,ADCL寄存器低4位无效。网络上很多代码这里都是右移两位,那是不对的

16    value |= (((uint)ADCH) << 4);

17    

18    return (value-1367.5)/4.5-5;  //根据 AD 值,计算出实际的温度,芯片手册有错,温度系数应该是4.5 /℃

19                                  //进行温度校正,这里减去5℃(不同芯片根据具体情况校正)

20 }


其中ADCCON3设置为0x3E,即选择内联参考电压,512采样率(12位有效位数),对片内温度传感器单通道采样!

其中 ADCCON1 |= 0x30 即Start select. Selects the event that starts a new conversion sequence(ADC启动模式为手动)

其中 ADCCON1 |= 0x40 即Start a conversion sequence if ADCCON1.STSEL = 11 and no sequence is running(启动ADC转换)

其中 while(!(ADCCON1 & 0x80)) 即等待一次转换完成

第15、16行:是获得ADC采样的12位有效数据的值保存在value中

15    value =  ADCL >> 4;           //ADCL 寄存器低 2 位无效,由于他只有12位有效,ADCL寄存器低4位无效。网络上很多代码这里都是右移两位,那是不对的

16    value |= (((uint)ADCH) << 4);


但是value值只是ADC值,并不是温度值,需要转换,代码18、19行就是完成转换:(至于怎么算的我猜测应该有个公式对应!)

18    return (value-1367.5)/4.5-5;  //根据 AD 值,计算出实际的温度,芯片手册有错,温度系数应该是4.5 /℃

19                                  //进行温度校正,这里减去5℃(不同芯片根据具体情况校正)

4、实验现象

将程序烧入CC2530,用USB连接开发板与PC,可以用串口助手观察zigbee发来的温度数据,当用手触摸芯片时温度会有明显变化:


关键字:ZigBee  采集温度  串口显示 引用地址:ZigBee基础实验(七)--AD采集温度串口显示

上一篇:ZigBee基础实验(八)--定时器一
下一篇:ZigBee基础实验(六)--UART(串口收发)

推荐阅读最新更新时间:2024-03-16 16:27

基于ARM+Zigbee的温室大棚智能监控系统
平台选型说明 设计说明
[单片机]
基于ARM+<font color='red'>Zigbee</font>的温室大棚智能监控系统
ZigBee曝出严重漏洞 或引发新安全危机
    伴随科技的快速演进,物联网(The Internet of Things,IoT)概念再次兴起,人们身边的日常用品、终端设备、家用电器等也逐步被赋予了网络连接的能力。然而作为连接上述设备所广泛使用的重要无线互联标准之一,ZigBee技术却于近期召开的2015黑帽大会(BlackHat2015)上被曝出存在严重的安全漏洞,引发了业内的广泛关注。   ZigBee是一种低成本、低功耗、近距离的无线组网通讯技术。由于其名称(ZigBee,Zig“嗡嗡”,Bee“蜜蜂”)来源于蜜蜂的八字舞,所以该协议又被称为紫蜂协议。在理论层面上来说,它是基于IEEE802.15.4标准的低功耗局域网协议,主要适合用于自动控制和远程控制领域,可以嵌
[安防电子]
基于MC9S08SH4和AD7705的智能传感器系统设计
近年来随着传感器技术和信息处理技术的快速发展,工程应用中对传感器的测量精度、数据传输距离和信息处理能力都提出了更高的要求。为了克服普通力敏、光敏传感器抗干扰能力差、传输距离短、调零难、测量节点无法直接与上位机通信等缺点,本文设计了一种以Freescale MC9S08SH4单片机 和AD7705为核心构成的智能传感器系统,在普通传感器上增加了软件调零、浮点数据处理、自动补偿、与上位机双向通讯、标准化数字输出等功能,可以很方便地实现上位机对数据的实时采集和处理,并具有测量精度高、结构紧凑、抗干扰能力强等特点。 1 系统组成   智能传感器系统由信号调理电路、A/D转换电路、主控电路、调零电路、RS-485通信电路和电源电路等模块组成。
[工业控制]
基于MC9S08SH4和<font color='red'>AD</font>7705的智能传感器系统设计
基于AD8367的自动增益控制电路分析
目前,自动增益控制(AGC)技术广泛用于接收机上,其基本作用是压缩输入信号的动态范围。由于各种发射机发射信号功率有大有小,发射机与接收机间的距离有远有近,以及电磁波在传播过程中的多径效应和衰减等原因,使得接收机接收到的有用信号强度波动范围较大,若接收信号强度过于微弱,可能会使得某些电路 (如检波器)不能正常工作而丢失信号;若接收机接收信号强度过大,可能造成放大器的非线性失真,因而在接收机种都必须采用自动增益控制技术,用来将大动态范围的信号调整在很小的波动范围内。实现对信号的自动增益控制方式有多种,市场上可供选择的集成化芯片也很多,其基本原理都是利用检波反馈方式控制压控放大器的放大系数,达到自动增益控制目的。本文主要分析了基于AD83
[嵌入式]
数据采集系统基于AD转换芯片AD0809
提起LABVIEW,就不能不涉及到数据采集和控制。 曾经在网上辩论过LV是不是通用编程语言,NI的创始人的一篇文章的标题就是“LV是通用语言吗”,这的确很难说,说它是通用语言,因为它的确具备了通用语言的基本能力,但是只能说是基本的,但是对很多VC容易实现的东西,在LV中却是个问题,尤其是系统相关的一些操作,所以,我个人更愿意认为,LABVIEW是倾向于测量和控制的硬件工程师的语言,它是语言,而不是一般意义上的专用软件,所以,LABVIEW逐渐成为工科院校学生的基本课程。 数据采集是LV最擅长的领域,对于开发过 单片机 的人来说,数据采集是再熟悉不过的了,如果想真正了解数据采集,就必须从AD,DA,COUNTER等转换芯片开始,数据
[单片机]
数据<font color='red'>采集</font>系统基于<font color='red'>AD</font>转换芯片<font color='red'>AD</font>0809
zigbee网络拓扑结构及节点设计
    1 引言     基于zigbee技术的无线传感器网络适用于网点多、体积小、数据量小,传输可靠、低功耗等场合,在环境监测、无线抄表、智能小区、工业控制等领域已取得一席之地 。同时,zigbee规范与协议日臻完善 。从zigbee1.0、zigbee1.1到目前最新的zigbee2007/pro,zigbee协议规范的演进对硬件系统提出了更高的要求 。     2 设计要求     2.1 zigbee网络结构     从网络结构上看,zigbee网络有星形,树形,网状3种模式,按照网络节点功能划分可分为终端节点(ep)、路由器节点(rp)和协调器节点(cp)3种 。其组织结构如图1示。 图1 zig
[网络通信]
CBFET运放AD843及其在阻抗匹配电路中的应用
    摘要: 介绍了CBFET(互补双极型场效应管)运算放大器AD843的主要功能特点及其在阻抗匹配电路中的应用。并通过几种阻抗匹配电路的比较说明了该芯片的独特性和优越性,最后给出了AD843的一个应用实例。     关键词: CBFET 运算放大器 阻抗匹配 AD843 在电路设计中的许多情况下需要进行阻抗匹配变换,以适应各种芯片或元件间的匹配。传统的阻抗匹配由分立器件组成,因而电路干扰大、调试麻烦、开发周期长并且维护困难。而一些运放集成芯片由于本身在结构上的设计局限(如频带宽度,输入偏置电路等),远远不能满足较宽频带和精确匹配的要求。CBFEY(互补双级型场效应管)运算放大器AD843却能以其独特的
[应用]
LeddarTech将在TECH.AD展示LiDAR技术的关键用途
LeddarTech®是LiDAR技术的行业领导者,提供市场上最通用和最具可扩展性的汽车和出行LiDAR平台,该公司将在柏林Automotive Tech.AD(汽车自动驾驶技术会议)上参展并登台亮相,由首席技术官Pierre Olivier先生发表演讲《用于自动驾驶的固态闪存传感器》。这场报告的时间是3月2日星期一8:55至9:20。Olivier先生将介绍LiDAR在ADAS和自动驾驶应用汽车生态系统中扮演的角色,并探讨LiDAR开发平台的前景。下午,Olivier先生还将现身TECH.AD上广受欢迎的“同行挑战”主题会;本次活动的时间为16:00至16:45,主题为《L5 AD车辆专用“安全”传感器套件》。 作为欧洲汽车
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved