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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM