一、ADC简介

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

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

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

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

三、CC2530的A/D转换模块

ADC的主要特性如下:

● 可选的抽取率,这也设置了分辨率(7 到 12 位)

● 8 个独立的输入通道,可接受单端或差分信号

● 参考电压可选为内部单端、外部单端、外部差分或 AVDD5

● 产生中断请求

● 转换结束时的 DMA 触发

● 温度传感器输入

● 电池测量功能

四、一些关于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并返回转换结果。

五、ADC模块的信号输入

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

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

<2> 在选择差分输入的情况下,差分输入对:AIN0~AIN1、AIN2~AIN3、AIN4~AIN5、AIN6~AIN7。

<3>除了输入引脚 AIN0-AIN7,片上温度传感器的输出也可以选择作为 ADC的输入,用于温度测量。

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

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

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

题目:定时采集电压数据发送到上位机

将光照度传感器接到的Zigbee小模块上,每隔1秒以单通道的传送到上位机。上位机与CC2530的 串口0相连,系统时钟为传送到上位机。上位机与CC2530的 串口0相连,系统时钟为16MHz,波特率为9600BPS,发送数据采用查询的方式。数据帧有4个字节,格式如下: 0xFA (帧头) ADCH ADCL 0xAF (帧尾)

思路:

1.初始化定时器1,实现0.1秒定时。

 void Init_Timer1()
{
T1CC0L = 0xd4; //设置最大计数值的低8位
T1CC0H = 0x30; //设置最大计数值的高8位
T1CCTL0 |= 0x04; //开启通道0的输出比较模式
T1IE = ; //使能定时器1中断
T1OVFIM = ; //使能定时器1溢出中断
EA = ; //使能总中断
T1CTL = 0x0e; //分频系数是128,模模式
}

2.在定时中断函数中实现1秒定时。

 unsigned char count = ;
unsigned char F_time = ;
/*================定时器1服务函数====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定时器1通道0中断标志
count++;
if(count == ) //定时1秒到
{
F_time = ;
count = ;
}
}

3.按照参数要求初始化串口0。

 void Init_Uart0()
{
PERCFG = 0x00; //串口0的引脚映射到位置1,即P0_2和P0_3
P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能
U0BAUD = ; //16MHz的系统时钟产生9600BPS的波特率
U0GCR = ;
U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器
U0CSR |= 0xC0; //选择UART模式,使能接收器
UTX0IF = ; //清除TX发送中断标志
URX0IF = ; //清除RX接收中断标志
URX0IE = ; //使能URAT0的接收中断
EA = ; //使能总中断
}

4.设计字节数组发送函数。

unsigned char dat[];
/*===================UR0发送字符串函数==================*/
void UR0SendString(unsigned char *str, unsigned char count)
{
while(count--)
{
U0DBUF = *str++; //将要发送的1字节数据写入U0DBUF
while(!UTX0IF); //等待TX中断标志,即数据发送完成
UTX0IF = ;
}
}

5.初始化ADC (单通道采集)。

配置APCFG寄存器

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

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

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

 void Init_ADC0()
{
P0SEL |= 0x01; //P0_0端口设置为外设功能
P0DIR &= ~0x01; //P0_0端口设置为输入端口
APCFG |= 0x01; //P0_0作为模拟I/O使用
}

6.实现数据采集并发送到上位机。

 

配置ADCCON3寄存器

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

例子:ADCCON3 = (0x80 | 0x10 | 0x00); //参考电压选择AVDD5引脚,256 抽取率,AINO通道0

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

 /*===================读取ADC的数据====================*/
void Get_ADC0_Value()
{
ADCIF = ;
//参考电压选择AVDD5引脚,256抽取率,AIN0通道0
ADCCON3 = (0x80 | 0x10 | 0x00);
while(!ADCIF); //等待A/D转换完成,
dat[] = 0xaf;
dat[] = ADCH; //读取ADC数据低位寄存器
dat[] = ADCL; //读取ADC数据高位寄存器
dat[] = 0xfa;
}

完整代码:

 #include "ioCC2530.h"
/*===============定时器1初始化函数==================*/
void Init_Timer1()
{
T1CC0L = 0xd4; //设置最大计数值的低8位
T1CC0H = 0x30; //设置最大计数值的高8位
T1CCTL0 |= 0x04; //开启通道0的输出比较模式
T1IE = ; //使能定时器1中断
T1OVFIM = ; //使能定时器1溢出中断
EA = ; //使能总中断
T1CTL = 0x0e; //分频系数是128,模模式
}
unsigned char count = ;
unsigned char F_time = ;
/*================定时器1服务函数====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定时器1通道0中断标志
count++;
if(count == ) //定时1秒到
{
F_time = ;
count = ;
}
}
/*===================UR0初始化函数====================*/
void Init_Uart0()
{
PERCFG = 0x00; //串口0的引脚映射到位置1,即P0_2和P0_3
P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能
U0BAUD = ; //16MHz的系统时钟产生9600BPS的波特率
U0GCR = ;
U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器
U0CSR |= 0xC0; //选择UART模式,使能接收器
UTX0IF = ; //清除TX发送中断标志
URX0IF = ; //清除RX接收中断标志
URX0IE = ; //使能URAT0的接收中断
EA = ; //使能总中断
}
unsigned char dat[];
/*===================UR0发送字符串函数==================*/
void UR0SendString(unsigned char *str, unsigned char count)
{
while(count--)
{
U0DBUF = *str++; //将要发送的1字节数据写入U0DBUF
while(!UTX0IF); //等待TX中断标志,即数据发送完成
UTX0IF = ;
}
}
/*===================ADC初始化函数====================*/
void Init_ADC0()
{
P0SEL |= 0x01; //P0_0端口设置为外设功能
P0DIR &= ~0x01; //P0_0端口设置为输入端口
APCFG |= 0x01; //P0_0作为模拟I/O使用
}
/*===================读取ADC的数据====================*/
void Get_ADC0_Value()
{
ADCIF = ;
//参考电压选择AVDD5引脚,256抽取率,AIN0通道0
ADCCON3 = (0x80 | 0x10 | 0x00);
while(!ADCIF); //等待A/D转换完成,
dat[] = 0xaf;
dat[] = ADCH; //读取ADC数据低位寄存器
dat[] = ADCL; //读取ADC数据高位寄存器
dat[] = 0xfa;
}
/*=======================主函数======================*/
void main()
{
Init_Uart0();
Init_Timer1();
Init_ADC0();
while()
{
if(F_time == ) //定时1秒时间到
{
Get_ADC0_Value(); //进行A/D转换并读取数据
UR0SendString(dat,); //向上位机发送数据
F_time = ; //定时1秒标志清0
}
}
}

CC2530ADC转换的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  3. ASP.NET_各个币种之间的汇率转换(实时)使用Yahoo汇率。

    近期开发支付平台的时候有运用到各国的实时汇率之间的转换问题,于是在往上找了很多相关资料,以下就是一些参考网址: 1.提供API接口的网站:https://www.showapi.com:这个网站有提供 ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  6. Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...

  7. React的使用与JSX的转换

    前置技能:Chrome浏览器   一.拿糖:React的使用 React v0.14 RC 发布,主要更新项目: 两个包: React 和 React DOM DOM node refs 无状态的功能 ...

  8. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  9. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

随机推荐

  1. 【Java】 Variable 变量

    什么是Variable变量? - 变量是内存中的一个存储区域 - 这个存储区域内的数据允许在同一类型范围内不断变化 - 是程序最基本的存储单元,包含三个要素[变量类型][变量名][存储的值] 为什么需 ...

  2. ES5与ES6 this 指向详细解析(箭头函数)

    首先要明白箭头函数的作用: 箭头函数除了让函数的书写变得很简洁,可读性很好外:最大的优点是解决了this执行环境所造成的一些问题.比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局性) ...

  3. E - Sum of gcd of Tuples (Hard) Atcoder 162 E(容斥)

    题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来.题解还是挺好的理解的. 首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值.有n个数, ...

  4. redis的安装(ubuntu版本)

    1.使用apt-get命令进行安装 安装gcc依赖 root@yatces-virtual-machine:~# apt-get update root@yatces-virtual-machine: ...

  5. tensorflow-参数、超参数、卷积核权值共享

    根据网上查询到的说法,参数就是在卷积神经网络中可以被训练的参数,比如卷积核的权值和偏移等等,而超参数是一些预先设定好并且无法改变的,比如说是卷积核的个数等. 另外还有一个最最基础的概念,就是卷积核的权 ...

  6. atom跨平台超好用的markdown实时预览

    https://atom.io/ sublime有预览markdown的插件,但仅限于每次在浏览器中预览,想要找一个能够实时在软件中预览的,终于发现了atom. 很多功能以插件的形式安装,theme也 ...

  7. CVE-2019-1388:Windows UAC 本地提权复现

    0x01 简介 用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制.其原理是通知用户是否对应用程序使用 ...

  8. AOP-SheepAspect

    转载https://www.cnblogs.com/InCsharp/p/5902133.html SheepAspect 简介以及代码示列: SheepAspect是一个AOP框架为.NET平台,深 ...

  9. C# WCF之用接口创建服务契约、部署及客户端连接

    服务契约描述了暴露给外部的类型(接口或类).服务所支持的操作.使用的消息交换模式和消息的格式.每个WCF服务必须实现至少一个服务契约.使用服务契约必须要引用命名空间System.ServiceMode ...

  10. Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析

    都0202 了 java 1.8 已经是主流 自动装箱 .拆箱已经很普遍使用了,那么有时候是不是会遇到坑呢? 我们先来看一段代码: public class TestWraperClass { pub ...