ZigBee开发(7)--基础实验AD

一、A/D转换的基本工作原理

将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是ADC

ADC:数模转换器,将时间和幅值连续的模拟量转化为时间和幅值离散的数字量,A/D转换一般要经过采样保持量化编码4个过程。

二、CC2530的A/D转换模块

CC2530的ADC模块支持最高14位二进制的模拟数字转换,具有12位的有效数据位,它包括一个模拟多路转换器,具有8个各自可配置的通道,以及一个参考电压发生器。

该ADC模块有如下主要特征:

<1> 可选取的抽取率,设置分辨率(7~12位)。

<2> 8个独立的输入通道,可接收单端或差分信号。

<3> 参考电压可选为内部单端、外部单端、外部差分或AVDD5。

<4> 单通道转换结束可产生中断请求。

<5> 序列转换结束可发出DMA触发。

<6> 可将片内温度传感器作为输入。

<7> 电池电压测量功能。

三、ADC模块的信号输入

 端口0引脚可以配置为ADC输入端,依次为AIN0~AIN7

<1> 可以把输入配置为单端输入或差分输入。

<2> 差分输入对:AIN0~AIN1、AIN2~AIN3、AIN4~AIN5、AIN6~AIN7。

<3> 片上温度传感器的输出也可以作为ADC的输入用于测量芯片的温度。

<4> 可以将一个对应AVDD5/3的电压作为ADC输入,实现电池电压监测。

<5> 负电压和大于VDD的电压都不能用于这些引脚。

<6> 单端电压输入AIN0~AIN7,以通道号码0~7表示;四个差分输入对则以 通道号码8~11表示;温度传感器的通道号码为14AVDD5/3电压输入的通道号码为15

四、ADC相关的几个概念

<1> 序列ADC转换:可以按序列进行多通道的ADC转换,并把结果通过DMA传送到存储器,而不需要CPU任何参与。

<2> 单通道ADC转换:在程序设计中,通过写ADCCON3寄存器触发单通道ADC转换,一旦寄存器被写入,转换立即开始。

<3> 参考电压:内部生成的电压、AVDD5引脚、适用于AIN7输入引脚的外部电压,或者 适用于AIN6~AIN7输入引脚的差分电压。

<4> 转换结果:数字转换结果以2的补码形式表示。对于单端,结果总是正的。对于差分配置,两个引脚之间的差分被转换,可以是负数。 当ADCCON1.EOC设置为1时,数字转换结果可以获得,且结果总是驻留在ADCH和ADCL寄存器组合的MSB段中。

<5> 中断请求:通过写ADCCON3触发一个单通道转换完成时,将产生一个中断,而完成 一个序列转换时,是不产生中断的。当每完成一个序列转换,ADC将产生 一个DMA触发。

<6> 寄存器:ADC有两个数据寄存器:ADCLADCH;三个控制寄存器:ADCCON1ADCCON2ADCCON3;分别用来配置ADC并返回转换结果。

【1】配置APCFG寄存器

当使用ADC时,端口0的引脚必须配置为ADC模拟输入。要配置一个端口0引脚为一个ADC输入,APCFG寄存器中相应的位必须设置为1。这个寄存器的默认值是0,选择端口0为非模拟输入,即作为数字I/O端口。

  注意:APCFG寄存器的设置将覆盖P0SEL的设置。

【2】配置ADCCON3寄存器

单通道的ADC转换,只需将控制字写入ADCCON3寄存器即可。

【3】ADC初始化

主要对端口的功能进行选择,设置其传输方向,并将端口设置为模拟输入。

【4】ADC数据采集

首先将ADCIF标志位清0,接着对ADCCON3寄存器设置,该寄存器一旦被写入,转换立即开启;然后等待ADCIF置1,这时候转换完成,读取数据即可。

/**************************************
程序描述:通过内部 AD 控制把温度信息通过
串口发送给上位机,部分芯片误差
较大,需要校准。手摸着芯片,温度
明显变大。
**************************************/
#include <ioCC2530.h>
//#include “InitUART_Timer.h” //注意在 option 里设置路径
#include<stdio.h>

#define uint unsigned int
#define uchar unsigned char

/*===================UR0初始化函数====================*/
void usart_Init(void)
{
  PERCFG &= ~0x01;//位置 1 P0 口
  P0SEL |= 0x0c;//P0_2,P0_3用作串口,第二功能
  P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级
  U0CSR |= 0x80;//UART 方式
  U0UCR |= 0x0c;

  U0GCR |= 11;//U0GCR 与 U0BAUD 配合
  U0BAUD |= 216;// 波特率设为 115200

  U0CSR |= 0x40;//允许接收
  EA = 1;//开总中断
  URX0IE = 1;//开串口接收中断

  UTX0IF = 0;//UART0 TX 中断标志初始置位
  URX0IF = 0;//UART0 RX 中断标志初始置位
}
void usart_Send_Byte(uchar c)
{
  U0DBUF = c;
  while( !UTX0IF );//等待发送完成标志位置1
  UTX0IF = 0;
}
void usart_Send_String(uchar *data,uint len)
{
  while(len--)
  {
    usart_Send_Byte(*data++);
  }
}
/****************************************************************
温度传感器初始化函数
****************************************************************/
void initTempSensor(void)
{
  EA = 0;
  CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ晶振
  while(CLKCONSTA & 0x40); //等待晶振稳定为 32M
  CLKCONCMD &= ~0x47; //设置系统主时钟频率为
  //DISABLE_ALL_INTERRUPTS(); //关闭所有中断
  //InitClock(); //设置系统主时钟为 32M
  //TR0=0X01; //set ‘1’ to connectthe temperature sensorto theSOC_ADC.
  //ATEST=0X01; // Enablesthe temperature sensor
}
/****************************************************************
读取温度传感器 AD 值函数
****************************************************************/
float getTemperature(void){
  uint value;
  ADCCON3 = (0x3E); //选择 1.25V 为参考电压;12 位分辨率;对片内温度传感器采样
  ADCCON1 |= 0x30; //选择 ADC 的启动模式为手动
  ADCCON1 |= 0x40; //启动 AD 转化
  while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
  value = ADCL >> 4; //ADCL 寄存器低 4 位无效
  value |= (((uint)ADCH) << 4);
  return (value-1367.5)/4.5-4; //根据 AD 值,计算出实际的温度,芯片、
//手册有错,温度系数应该是 4.5 /℃
//进行温度校正,这里减去 4℃(不同芯片根据具体情况校正)
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
  uchar I;
  uchar TempValue[6];
  float AvgTemp;
  usart_Init(); //初始化串口
  initTempSensor(); //初始化 ADC
  while(1)
  {
    AvgTemp = 0;
    for(I = 0 ; I < 64 ; I++)
    {
      AvgTemp += getTemperature();
      AvgTemp=AvgTemp/2; //每次累加后除 2
    }
  /****温度转换成 ascii 码发送****/
    TempValue[0] = (unsigned char)(AvgTemp)/10 + 48; //十位
    TempValue[1] = (unsigned char)(AvgTemp)%10 + 48; //个位
    TempValue[2] = ‘.‘; //小数点
    TempValue[3] = (unsigned char)(AvgTemp*10)%10+48; //十分位
    TempValue[4] = (unsigned char)(AvgTemp*100)%10+48; //百分位
    TempValue[5] = ‘\0‘; //字符串结束符
    usart_Send_String( TempValue,6);
    //Delayms(2000); //使用 32M 晶振,故这里 2000 约等于 1S
  }
}

原文地址:https://www.cnblogs.com/tianxxl/p/9870721.html

时间: 2024-10-12 14:07:29

ZigBee开发(7)--基础实验AD的相关文章

ZigBee开发(2)--基础实验LED

CC2530 的 IO 口配置我们需要配置三个寄存器 P1SEL . P1DIR . P1INP.IO 口功能如下表所示: (详细参考 CC2530 datasheet.pdf) CC2530 datasheet.pdf 的链接https://pan.baidu.com/s/1nLjYI8LgqxPH6WHd_n1Szw * P1SEL (0:普通 IO 口 1:第二功能)* P1DIR (0:输入 1:输出 )* P1INP (0:上拉/下拉 1:三态 )  1 #include<ioCC25

「ZigBee模块」基础实验(5)串口通讯

一.补充基础知识 在CC2530 中,USART0 和USART1 是串行通信接口,它们能够分别运行于异步USART 模式或者同步SPI 模式.两个USART 的功能是一样的,并且各自有单独的IO 引脚.USART里面的A指的就是asynchronous(异步),S指的是synchronous(同步).这里我们使用异步通信方式. UART模式特征: ·一次传8或9个比特的数据 ·奇校验.偶校验或者无校验位 ·配置起始位和停止位点平 ·配置LSB或者MSB首先传送 ·独立收发中断 ·独立收发DMA

「ZigBee模块」基础实验(3)外部中断

1.实现功能 使用中断方式实现: 按键KEY1按下LED1依次亮灭 按键KEY2按下LED2依次亮灭 2.元件连接方式 P1_0连接LED1 P1_1连接LED2 P0_0连接KEY1 P0_1连接KEY2 3.中断相关寄存器 PXIEN P0IEN P1IEN P2IEN 地址 0xAB 0x8D 0xAC PX[7:0] 各个控制口中断使能 (0:中断禁止 1:中断使能) PICTL: D0~D3设置各个端口的中断触发方式(0:上升沿触发 1:下降沿触发) D7控制I/O引脚在输出模式下的驱

「ZigBee模块」基础实验(1)点亮LED

1.IO配置 CC2530 的 IO 口配置需要三个寄存器:PXSEL.PXDIR.PXINP . IO口寄存器 P0 P1 P2 地址 0x80 0x90 0xA0 PXSEL P0SEL P1SEL P2SEL 地址 0xF3 0xF4 0xF5 PX[7:0]功能设置寄存器,默认普通IO口 (0:普通 IO 口 1:第二功能) PXDIR P0DIR P1DIR P2DIR 地址 0xFD 0xFE 0xFF PX[7:0] 输入输出设置寄存器 (0:输入 1:输出) PXINP P0IN

「ZigBee模块」基础实验(2)按键

1.实现功能 按键KEY1按下LED1依次亮灭 按键KEY2按下LED2依次亮灭 2.元件连接方式 P1_0连接LED1 P1_1连接LED2 P0_0连接KEY1 P0_1连接KEY2 3.部分代码分析 按键需要消抖(因为按键选择之后的代码较少,直接写这里面啦) void keyScan() { if(KEY1 == 0) { delayms(10); if(KEY1 == 0) { while(!KEY1); LED1 = !LED1; } } if(KEY2 == 0) { delayms

[ZigBee] 4、ZigBee基础实验——中断

前言 上一篇介绍了CC2530的IO的基础知识,并用LED的控制来展示如何配置并控制GPIO的输出,用KEY状态的读取实验来展示如何读取GPIO的状态.从上一节的KEY状态读取的代码看出是采用轮训方式的,这种方式是很浪费资源,本节将介绍一种中断方式来替换轮训的方案. 一.中断 电路依然没变,若要使用CC2530的外部中断需要使用P0IEN.PICTL.P0IFG.INE1寄存器. 按键中断初始设置为: 1 /********************************************

[ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)

上一节讲了16位定时器1,本节讲8位定时器3和定时器4! 1.综述 Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has two independent capture/compare channels(独立的捕获/比较通道),each using one I/O pin per channel. Features: · Two capture/compare channels· Set, clear or toggle

[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)

1.定时器1概述 定时器1 是一个支持典型的定时/计数功能的独立16 位定时器,支持输入捕获,输出比较和PWM等功能.定时器有五个独立的捕获/比较通道.每个通道定时器要使用一个I/O 引脚.定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现. 定时器1 的功能如下: • 五个捕获/比较通道• 上升沿.下降沿或任何边沿的输入捕获• 设置.清除或切换输出比较• 自由运行.模或正计数/倒计数操作• 可被1,8,32 或128 整除的时钟分频器• 在每个捕

iOS开发最最基础之打包Ad Hoc应用

首先,介绍下什么是Ad Hoc? Ad Hoc简单的定义是:把iOS工程打包成ipa包后,通过Ad Hoc证书签名做分发测试的行为. Ad Hoc证书可以分为两类: 1.99美元的开发者账号生成的. 2.299美元的开发者账号生成的. 由于我没有299美元的开发者账号,故本文只针对99美元的开发者账号的情况作阐述. 接下来,我将从以下5点进行操作描述: 1.AppID(如果有配置好了,可以忽略). 2.certificate 3.device 4.profile 5.Xcode打包 1.AppI