初窥ZIGBEE

要在zigbee的组网中加入烟雾传感器的模块,所以需要用到cc2530的ADC对传感器输出的模拟信号进行采样。下面是自己对实现用CC2530的ADC采集外部电压的程序过程。

以下是ADC的配置:

 #include<iocc2530.h>
#include"adc.h"
#include"uart.h"
#include<stdio.h>
#include"led.h" #define VDD_REF 3.3
float ADCValue = 0.0;//global ,传递电压值
/**************************************************************
*function:ADInit()
*This funciton is order to initialize ADC of CC2530
*单次采样,采用端口为P0.6
**************************************************************/
void ADInit(void)
{
uint ADCREGValue = ;
SET_IO_PORT_DIR(,,IO_IN);//设置P0..6为输入模式
ADC_ENABLE_CHANNEL(); //使能通道6作为ADC的采样通道
ADC_SINGLE_CONVERSION(ADC_REF_AVDD|ADC_12_BIT| ADC_AIN6); //配置ADC参数,参考电压为AVDD5引脚电压,抽取率为512(12位分辨率)
ADC_SAMPLE_SINGLE(); //启动单次采样 while(!(ADCCON1&0x80)) ;//等待AD转换完成
// while ( !ADCIF );
/*获取结果,并转换为电压*/
ADCREGValue = ADCL>>;//程序中设置的是12bit的精度,取低4位值
ADCREGValue |= ADCH<<; //高八位值
ADCValue = (float)(ADCREGValue/(float))*3.3;//此处有疑问,本来是12bit的精度,除数应该是4096的,但是得用2048才能得到准确的值
}

以下是UART0的配置:

#include<iocc2530.h>
#include"uart.h" void UARTInit(void)
{ PERCFG = ; //配置UART0的IO位置为备用位置1
P0SEL = 0x3c; //P0.2-PO.5设置为外设功能的端口
P2DIR &= ~(<<);//设置UART0为第一优先级,UART1为第二优先级,
U0CSR |= (<<); //select the mode as UART mode
U0GCR |= 0x09;
U0BAUD |= ; //
UTX0IF = ; //clear the interrupt flag
U0CSR |= (<<); //enable receive bit
IEN0 |= 0x84;
}
/*********************************************************
note: "length" is the length of one line
**********************************************************/
void UARTSend(char *data,int length)
{
int i;
for(i=;i<length;i++)
{
U0DBUF = *data;
data++;
while(UTX0IF==); // complete receive
UTX0IF = ; //clear the flag
}
U0DBUF =0x0A; //carriage return
while(UTX0IF==); // complete receive
UTX0IF = ;
}

以下是主函数:

#include<iocc2530.h>
#include"adc.h"
#include"uart.h"
#include"led.h"
#include<stdio.h>
#include <string.h> void delay(uint n);
void ClockInit(void); void main(void)
{
char i = ;
char TempValue[];
float average ;
char len;
P1_0 = ;
ClockInit();
UARTInit();
SET_IO_PORT_DIR(,,IO_OUT); //设置LED,作为ADC采样进行的标志
IO_FUNC_PORT_PIN(, , IO_FUNC_GIO);//INIT_LED();
IEN0 =IEN1=IEN2 =; while()
{
average = 0.0;
for(i=;i<;i++)//取64次均值
{
ADInit();
average +=ADCValue;
}
average /=;
LED();
sprintf(TempValue,"%fV\r",(float)average);//将数值格式化为字符串
len = strlen(TempValue);//字符串的长度
UARTSend(TempValue,len);//向串口发送数据
delay();
} } /***********************************************************
初始化时钟参数
*************************************************************/
void ClockInit(void)
{
CLKCONCMD = 0x28; //时器计数时钟设定为1M Hz, 系统时钟设定为32 MHz
while(CLKCONSTA & 0x40); //等晶振稳定
}

串口显示结果:

一开始的时候,读取出来的AD数值完全不对,最后发现是之前选取板子上的采样端口出现问题,换了P0.6之后,效果就好多了,估计就是由于端口复用的造成的影响。。弄好了基本的驱动,后面得开始将程序添加到ZIGBEE的模块中,实现组网。。

CC2530的ADC采集外部电压的更多相关文章

  1. 【CC2530入门教程-06】CC2530的ADC工作原理与应用

    第6课  CC2530的ADC工作原理与应用 广东职业技术学院  欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...

  2. 关于esp32的ADC采集

    对于ADC采集 程序源码如下: /* ADC1 Example This example code is in the Public Domain (or CC0 licensed, at your ...

  3. TMS320VC5509片内ADC采集

    1. ADC采集比较简单,内部的10位的ADC,AIN0-AIN3的输入,主要是用的CSL的库函数#include <csl_adc.h> ; Uint16 samplestoraage[ ...

  4. 关于右移和除法的关系 , ADC采集电量 ,ADC采集MIC(麦克风)

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  5. ADC采集电流相关知识

    1.AD电流采样电路,是把电路中的电流用采样元件转换为电压信号,然后用ADC量化转换为相应的数字信号.需要你在被采集端串联一个采样电阻,然后采集采样电阻两端的电压,这样就可以把电流输出变换为电压输出. ...

  6. 关于ADC采集

    对于ADC采集,想问的一些问题 1.如何初始化? 需要初始化 2.哪里可以看到是多少位采集? 3.8位ADC采集的误差是多少? 4.基准电压从哪里取?

  7. 关于使用单片机读取外部电压ADC阻抗匹配的问题

    单片机的基准电压一般为3.3V,如果外部信号超过了AD测量范围,可以采用电阻分压的方法,但是要注意阻抗匹配问题.比如,SMT32的模数输入阻抗约为10K,如果外接的分压电阻无法远小于该阻值,则会因为信 ...

  8. ADC 与实际电压值的关系

    1.首先确定ADC用几位表示,最大数值是多少.比如一个8位的ADC,最大值是0xFF,就是255. 2.然后确定最大值时对应的参考电压值.一般而言最大值对应3.3V.这个你需要看这个芯片ADC模块的说 ...

  9. STM32L15x——ADC采集DMA数据只第一次正确(已解决)

    前提:我用的芯片是STM32L系列,可能对其它STM32系列不完全适用,仅供参考! 一.问题描述 我在使用DMA方式读取单ADC单通道采集的数据时,发现只能正确的采集一次数据,后来的就一直与第一次的相 ...

随机推荐

  1. .NET和.NET Core Web APi FormData多文件上传对比

    前言 最近因维护.NET和.NET Core项目用到文件上传功能,虽说也做过,但是没做过什么对比,借此将二者利用Ajax通过FormData上传文件做一个总结,通过视图提交表单太简单,这里不做阐述,希 ...

  2. 【av68676164(p54)】段式和段页式虚拟存储

    段式存储管理 进程分段 把进程按逻辑意义划分为多个段,每段有段名,长度不定,进程由多段组成 例:一个具有代码段.数据段和堆栈段的进程 段式内存管理系统的内存分配 以段为的单位装入,每段分配连续的内存 ...

  3. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

  4. ECS7天实践进阶训练营Day1:使用阿里云ECS,快速搭建、管理VuePress静态网站

    一.概述 VuePress是2018年由尤雨溪发布的一个全新的基于Vue的静态网站生成器,它是一个非常轻量级的静态网站生成器.VuePress主要用于生成技术文档,其类似于Gitbook,我们可以用于 ...

  5. import android.support.annotation.NonNull;报错

    将import android.support.annotation.NonNull;换成import androidx.annotation.NonNull;

  6. ASP.NET Core3.x 基础(1)

    ASP.NET Core与2.x相比发生的一些变化: 项目结构 Blazor SignalR gRPC 关于Program类:Main方法,在系统执行时就会找到这个Main方法,实际上是配置了ASP. ...

  7. 2020-04-23:假设一个订单的编号规则是AAAAOrder2020-0000001,AAAAOrder2020-0000002....后面的数字是自增长,如果订单号码达到AAAAOrder2020-1000000(100万),数据库中应该有100万条数据,此时我随机删除2条数据(物理删除,且不考虑日志和备份),请问怎么找到删掉的数据的编号?给出解题思路即可,答案需要在1秒内运行得到。

    福哥答案2020-04-23: 分批查询:分成500次count(),每次count()肯定小于等于2000条数据,经过测试,一次count()在.1ms左右,500次就是500ms.二分法(时间微超 ...

  8. Homekit_二路继电器

    介绍一款二路继电器,使用Homekit进行控制,有兴趣的可以去以下链接看看: https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-11265006 ...

  9. 三分钟秒懂BIO/NIO/AIO区别?

    首先来举个例子说明吧,假设你想吃一份盖饭: 同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊! 同步非阻塞:在饭馆点完餐,就去遛狗了.不过溜一会儿,就回饭馆喊一声:好了没啊! 异步阻塞:遛狗 ...

  10. day 10 面向对象(=)

    1.魔法对象  __str _(self)     使用print(对象)输出的时候,自动调用该方法      return语句 返回一个值      class  类名:      del _str ...