CC2540开发板学习笔记(六)——AD控制(自带温度计)

一、实验目的

     将采集的内部温度传感器信息通过串口发送到上位机

二、实验过程

1、寄存器配置

ADCCON1(0XB4)
ADC控制寄存器1
BIT7:EOC   ADC结束标志位
0:AD转换进行中                     1:AD转换完成
  BIT6:ST     手动启动AD转换
0:关闭                                  1:启动AD转换(需要BIT5:BIT4=11)
  BIT5:BIT4   AD转换启动方式
00:外部触发
01:全速转换,不需要触发
10:T1通道比较触发
11:手动触发
  BIT3:BIT2     16位随机数发生器控制位
00:普通模式(13x打开)
01:开启LFSR时钟一次(13x打开)
10:保留位
11:关
ADCC0N2(0XB5)
序列AD转换控制寄存器2
BIT7:BIT6        SREF      选择AD转换参考电压
00:内部参考电压(1.25V)
01:外部参考电压AIN7输入
10:模拟电源电压
11:外部参考电压AIN6-AIN7差分输入
  BIT5:BIT4      设置AD转化分辨率
00:64dec,7位有效      
01:128dec,9位有效、
10:256dec,10位有效
11:512dec,12位有效
  BIT3:BIT2:BIT1:BIT0
设置AD转换最末通道,如果置位时ADC正在运行,则在完成序列AD转换后立刻开始,否则置位后AD转换,转换完成后自动清0。
0000:AIN0
0001:AIN1
0010:AIN2
0011:AIN3
0100:AIN4
0101:AIN5
0110:AIN6
0111:AIN7
1000:AIN0-AIN1差分
1001:AIN2-AIN3差分
1010:AIN4-AIN5差分
1011:AIN6-AIN7差分
1100:GND
1101:保留
1110:温度传感器
1111:1/3模拟电源电压
ADCCON3(0XB5)
单通道AD转换控制寄存器3
BIT7:BIT6   SREF   选择单通道AD选择参考电压
00:内部参考电压(1.25V)
01:外部参考电压AIN7输入
10:模拟电源电压
11:外部参考电压AIN6-AIN7差分输入
  BIT5:BIT4       设置单通道AD转换分辨率
00:64dec,7位有效      
01:128dec,9位有效、
10:256dec,10位有效
11:512dec,12位有效
  BIT3:BIT2:BIT1:BIT0
设置AD转换最末通道,如果置位时ADC正在运行,则在完成序列AD转换后立刻开始,否则置位后AD转换,转换完成后自动清0。
0000:AIN0
0001:AIN1
0010:AIN2
0011:AIN3
0100:AIN4
0101:AIN5
0110:AIN6
0111:AIN7
1000:AIN0-AIN1差分
1001:AIN2-AIN3差分
1010:AIN4-AIN5差分
1011:AIN6-AIN7差分
1100:GND
1101:保留
1110:温度传器
1111:1/3模拟电源电压
TR0(0x624B) BIT0:置1表示将温度传感器与ADC连接起来
ATEST(0x61BD) BIT0:置1表示将温度传感器启用

2、源码

adc.h

#ifndef ADC_H_

#define ADC_H_



#include <ioCC2540.h>



#define uint unsigned int

#define uchar unsigned char



void AdcInit(void);//内部温度传感器



uint GetAdcValue(void);//得到单次转换的AD值



uint TempDeal(uint TempAdValue);//将温度传感器的Ad值转换成温度值,扩大100倍



void ChanceValueToString(uint Data ,uchar *Buff);//将数值转换为字符串











#endif
#include "adc.h"





void AdcInit(void)//内部温度传感器

{

  ADCCON1 = 0x33;//软件启动转换

  ADCCON3 = 0x3e;//内部参考电压,12位分辨率,选择温度传感器输入

  TR0 = 0x01;

  ATEST = 0x01;

//  ADCCON1 |= 0x40;//软件启动转换

}



uint GetAdcValue(void)

{

  uint AdValue=0;

  

  ADCCON1 |= 0x40;

  while(!(ADCCON1 & 0x80));

  AdValue = ADCL >>4;

  AdValue |= ADCH <<4;

  

  return AdValue; 

}



uint TempDeal(uint TempAdValue)//将温度传感器的Ad值转换成温度值,扩大100倍

{

  float Tempruture;

  Tempruture = (TempAdValue-1367.5)/4.5+2.5; 

  TempAdValue = (uint)(Tempruture*100);

  return TempAdValue;

}



void ChanceValueToString(uint Data ,uchar *Buff)//将数值转换为字符串

{

  Buff[0] = (Data/10000)+0x30; 

  Buff[1] = ((Data/1000)%10)+0x30; 

  Buff[2] = ((Data/100)%10)+0x30; 

  Buff[3] = '.'; 

  Buff[4] = ((Data/10)%10)+0x30; 

  Buff[5] = (Data%10)+0x30; 

  Buff[6] = '\n'; 

  Buff[7] = '\0';

}

sysclock

#ifndef SYSCLK_H_

#define SYSCLK_H_



#include<ioCC2540.h>



void SysClkSet_32M(void);//设置系统时钟为32MHz



#endif
#include "sysclk.h"





void SysClkSet_32M(void)//设置系统时钟为32MHz

{

  CLKCONCMD &= ~0x40;

  while(CLKCONSTA & 0x40);    

  CLKCONCMD &= ~0x47;  

}

usart0

#ifndef USART0_H_

#define USART0_H_



#include<ioCC2540.h>



#define uint unsigned int

#define uchar unsigned char





void UartInit(void);//115200



void Uart0_SendByte(uchar Byte);//发送一个数据



void Uart0_SendString(uchar *Buff);//发送一个字符串







#endif
#include"usart0.h"



void UartInit(void)

{  

  P2DIR &= ~0xc0;//备用位置1

  PERCFG &= ~0x01;//设置UART0高优先级 

  P0SEL |= 0x3c;//2 3 4 5作为外设 

  U0CSR = 0xc0;

  U0GCR = 11;  //设置波特率,可参考CC2530中文文档中的相应表格

  U0BAUD = 216; 

  EA=1;

  URX0IE=1;//接收中断  URX0IF--接收中断标志位   UTX0IF--发送完成标志位 

}



void Uart0_SendByte(uchar Byte)//发送一个字符

{

  U0DBUF=Byte; 

  while(!UTX0IF);

  UTX0IF=0;

}



void Uart0_SendString(uchar *Buff)//发送一串字符

{

  uchar *p;

  p=Buff;

  while(*p != 0)

  {

    Uart0_SendByte(*p);

    p++;

  }

}





#pragma vector = URX0_VECTOR   //中断向量

__interrupt void Uart0RxInt(void)

{

  URX0IF=0; 

  Uart0_SendByte(U0DBUF);

}

mian

#include<ioCC2540.h>

#include"sysclk.h"

#include"usart0.h"

#include"adc.h"



#define uint unsigned int

#define uchar unsigned char

void Delay(uint n);

uchar TempDis[8];



void main()

{

  SysClkSet_32M();//设置系统时钟为32MHz

  UartInit();     //115200

  

  while(1)

  {

    AdcInit();      //初始化ADC

    ChanceValueToString(TempDeal(GetAdcValue()),TempDis);//获取当前温度值并将其装换成字符串

    Uart0_SendString(TempDis);//打印温度值

    Delay(1000);

  }

}







void Delay(uint n)

{

  uint i,j;

  for(i=n;i>0;i--)

    for(j=5000;j>0;j--);

}

image

你可能感兴趣的:(学习笔记)