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 ,傳遞電壓值
/**************************************************************
*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的模塊中,實現組網。
評論