cc2530 是用于2.4-ghz ieee 802.15.4、zigbee 和rf4ce 应用的一个真正的片上系统(soc)解决方案。它能够以非常低的总的材料成本建立强大的网络节点。
要在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 = 0;
set_io_port_dir(0,6,io_in);//设置p0..6为输入模式
adc_enable_channel(6); //使能通道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》》4;//程序中设置的是12bit的精度,取低4位值
adcregvalue |= adch《《4; //高八位值
adcvalue = (float)(adcregvalue/(float)2048)*3.3;//此处有疑问,本来是12bit的精度,除数应该是4096的,但是得用2048才能得到准确的值
}
以下是uart0的配置:
#include《iocc2530.h》
#include“uart.h”
void uartinit(void)
{
percfg = 0; //配置uart0的io位置为备用位置1
p0sel = 0x3c; //p0.2-po.5设置为外设功能的端口
p2dir &= ~(3《《6);//设置uart0为第一优先级,uart1为第二优先级,
u0csr |= (1《《7); //select the mode as uart mode
u0gcr |= 0x09;
u0baud |= 59; //19200
utx0if = 1; //clear the interrupt flag
u0csr |= (1《《6); //enable receive bit
ien0 |= 0x84;
}
/*********************************************************
note: “length” is the length of one line
**********************************************************/
void uartsend(char *data,int length)
{
int i;
for(i=0;i《length;i++)
{
u0dbuf = *data;
data++;
while(utx0if==0); // complete receive
utx0if = 0; //clear the flag
}
u0dbuf =0x0a; //carriage return
while(utx0if==0); // complete receive
utx0if = 0;
}
以下是主函数:
#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 = 0;
char tempvalue[10];
float average ;
char len;
p1_0 = 0;
clockinit();
uartinit();
set_io_port_dir(1,0,io_out); //设置led,作为adc采样进行的标志
io_func_port_pin(1, 0, io_func_gio);//init_led();
ien0 =ien1=ien2 =0;
while(1)
{
average = 0.0;
for(i=0;i《64;i++)//取64次均值
{
adinit();
average +=adcvalue;
}
average /=64;
led();
sprintf(tempvalue,“%fv\r”,(float)average);//将数值格式化为字符串
len = strlen(tempvalue);//字符串的长度
uartsend(tempvalue,len);//向串口发送数据
delay(20000);
}
}
/***********************************************************
初始化时钟参数
*************************************************************/
void clockinit(void)
{
clkconcmd = 0x28; //时器计数时钟设定为1m hz, 系统时钟设定为32 mhz
while(clkconsta & 0x40); //等晶振稳定
}
串口显示结果:
一开始的时候,读取出来的ad数值完全不对,最后发现是之前选取板子上的采样端口出现问题,换了p0.6之后,效果就好多了,估计就是由于端口复用的造成的影响。弄好了基本的驱动,后面得开始将程序添加到zigbee的模块中,实现组网。
南都华拓安徽项目总投资超30亿元,规划年产能6GWh
新能源汽车的眼睛:车灯
力源信息与安森美设立应用联合实验室
中芯热成推出光电成像芯片制备、测试及封装服务
曝华为P50将首发索尼最强CMOS
cc2530 adc测外部电压
中国联通和中国电信共建5G网络到底有哪些利和弊
2020第三季度笔记本电脑出货数据:惠普超越联想排名第一
物联网的隐私问题什么是关键
Waymo与Lyft达成合作 谁会成为这个强大联盟的又一受益者
人工智能引领智慧农业实现落地
中小学食堂快检室综合性建设方案所需的仪器有什么
2023年晶圆代工产值将减12% 台积电市占率55%居首
汽车对IVI和自动驾驶采用Linux开源和软件重用原则
黑雨blackra1n rc3和Redsn0w红雪 0.9
华为P40 Pro将搭载索尼IMX700,支持十六像素合一
求一种SEANTEC光伏储能系统热管理解决方案
曙光天津市政务云平台获得商用密评认证
UCOS-II操作系统在ZEVIO1020上移植过程的主要步骤详解
音箱功率参数的秘密