感知层编程实验五
南昌航空大学实验报告
二0二1年11月17日
课程名称: 感知层编程实验 实验名称:ADC编程
班级学号: 姓名: 同组人: 无
指导教师评定: 签名:
实验五 ADC编程
实验目的:
- 加深和巩固学生对于CC2530中ADC组件的理解和掌握
- 让学生初步掌握CC2530中ADC的使用,及其编程方法
- 提高学生的上机和编程过程中处理具体问题的能力
实验要求:
- 实验要求自己独立的完成;
- 编写和调试过程中出现的问题要做好记录,并事后总结到报告中
- 实验程序调试完成后, 用给定的平台进行测试,由老师检查测试结果,并给予相应的成绩
- 实验完成后,要上交实验报告。
实验内容:
- 开发一个新的应用,每秒钟获取一次传感数据。以下述顺序完成这个新应用的开发。
- 首先使得应用能够以1秒为周期获取电压及芯片内部温度;
- 然后在上述基础上通过光敏传感器获取光照强度值。
- 在实验报告中分别给出上述两个阶段的源码。
实验环境:
集成开发环境为IAR
实验过程:
这次主要考察的是传感器的使用,以及对CC2530的接口的使用,还有根据附录给的条件,通过得到的电压ADC去求cc2530芯片的内部温度。在IAR上写好代码,烧录,再利用串口调试助手观察输出情况,在测光敏传感器通过遮挡传感器观察数值的变化。
实验代码:
#include <ioCC2530.h>
#include <stdio.h>
#include <string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
float ADCValue = 0.0; //globacl ,传递电压值
void Delay(uint n){//延时函数
uint i,j;
for(i = 0;i < n*1000;i ++)
for(j = 0;j < 559;j ++);
}
void ClockInit(void){//初始化时钟
CLKCONCMD = 0x28; //时器计数时钟设定为1MHz, 系统时钟设定为32 MHz
while (CLKCONSTA & 0x40); //等晶振稳定
}
void InitUart(void){//初始化UART
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
void UartTX_Send_String(char *Data, int len){//发送数据
int j;
for (j = 0; j < len; j++){
U0DBUF = *Data++;
while (UTX0IF == 0);
UTX0IF = 0;
}
U0DBUF = 0x0A; // 换行
while (UTX0IF == 0);
UTX0IF = 0;
}
uint GetLight()//获取光照强度
{
uint value;
char i;
uint AdcValue;
AdcValue = 0;
for(i=0;i<4;i++)
{
ADCCON3 = 0xB6;
ADCCON1 = 0x70;
while(!(ADCCON1&0x80));
value = ADCL>>4;
value |= ((uint)ADCH << 4);
AdcValue += value;
}
value = AdcValue >> 2;
return value;
}
void ADInit(void){//获取电压值
uint ADCREGValue = 0;
ADCCON3 = (0x3F); //选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
ADCCON1 |= 0x30; //选择ADC的启动模式为手动
ADCCON1 |= 0x40;
while (!(ADCCON1 & 0x80)); //等待AD转换完成
ADCREGValue = ADCL >> 2; //程序中设置的是12bit的精度,取低4位值
ADCREGValue |= ADCH << 4; //高八位值
ADCValue = (float)(ADCREGValue *1151.2/ (float)2047);
}
void main(void){
uchar i = 0;
float average;
char strTemp[6];//保存温度
char TempValue[10];//保存电压
char LightValue[10];//保存光照
char len;//电压字节
ClockInit();//稳定时钟
InitUart();//初始化串口
P1_0 = 0;
while (1){
average = 0.0;
for (i = 0; i < 10; i++) {//取10次均值
ADInit();
average += ADCValue;
}
average /= 10;
sprintf(TempValue, "%.02fmV", (float)average); //将数值格式化为字符串
len = strlen(TempValue); //字符串的长度
UartTX_Send_String(TempValue, len); //向串口发送数据
UartTX_Send_String("\r", 1); //串口换行
average =(average - 1000.75) / 4.5;
memset(strTemp, 0, 6);
sprintf(strTemp, "%.02f",(float)average); //将浮点数转成字符串,保留2位小数位
len=strlen(strTemp);
UartTX_Send_String(strTemp, len); //通过串口发给电脑显示芯片温度
UartTX_Send_String("\r",1);//换行
average =2047-GetLight();
memset(LightValue, 0, 6);
sprintf(LightValue, "%.02f",(float)average); //将浮点数转成字符串,保留2位小数位
len=strlen(LightValue);
UartTX_Send_String(LightValue,len); //通过串口发给电脑显示光亮
UartTX_Send_String("\r",1);//换行
UartTX_Send_String("\r",1);//换行
P1_0 = ~P1_0;
Delay(2);
}
}
实验结果:
烧录后打开串口调试助手上可以看到串口分别输出电压,温度和光照强度,在通过遮挡光敏传感器的光照以及利用加强对光敏传感器的光照强度观察数值的变化。
实验总结:
本次实验我遇到的困难是对ADCCON3 设置的问题,最开始没找到ADCCON3正确的设置,还有一个便是通过电压ADC求内部芯片温度的公式问题,这个还是老师上课讲过才解了我的困惑。
通过本次实验加深和巩固对于CC2530中ADC组件的理解和掌握和初步掌握CC2530中ADC的使用,及其编程方法,温度方面老师讲了公式,但是套进去温度还是有问题输出到了30多度,后来经过调试才让它变成20多度。
附录:
ADCCON3: