ble學習筆記六------------溫度感測器溫度採集
---------------------溫度感測器溫度採集
在使用者手冊的第十二章有詳細說明
ADC 結構圖如下:
Adc inputs
the registers TR0.ADCTM and
ATEST.ATESTCTRL must be set as described in the register descriptions in Section 12.2.10 and
Section 23.15.3 (CC253x) or Section 24.1 (CC2540), or Section 25.12 (CC2541).
開啟溫度感測器
TR0 = 0x01;
ATEST = 0x01;
採用手動觸發的方式進行ad取樣
Adc有三個控制暫存器ADCCON1 ADCCON2 ADCCON3
暫存器的設定如下:00110011
最低兩位始絡為11
ADCCON1.EOC為0
ADCCON1.ST為0
ADCCON1.STSEL 為11
ADCCON2的設定和ADCCON3的配置是一樣的0011 1110
ADC參考電壓使用內部電壓採用12位精度採集,值為0x3e
示例程式碼如下:
複製lcd工程,新增如下程式碼:
ADC.h檔案如下:
/******************************************************************************
版權所有 (C), 2014-2020
******************************************************************************
文 件 名 : ADC.h
版 本 號 : V1.0
作 者 : retacn
生成日期 : 2014年9月20日
功能描述 : ADC.c 的標頭檔案
函式列表 :
修改歷史 :
1.日 期 : 2014年9月20日
作 者 : retacn
修改內容 : 建立檔案
******************************************************************************/
#ifndef __ADC_H__
#define __ADC_H__
/*----------------------------------------------*
* 包含標頭檔案 *
*----------------------------------------------*/
#include "common.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
/*讀取溫度感測器值*/
extern uint16 ADC_Read (uint8 channel);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __ADC_H__ */
ADC.c檔案
/******************************************************************************
版權所有 (C), 2014-2020
******************************************************************************
文 件 名 : ADC.c
版 本 號 : V1.0
作 者 : retacn
生成日期 : 2014年9月20日
功能描述 : ADC取樣
函式列表 :
ADC_Read
修改歷史 :
1.日 期 : 2014年9月20日
作 者 : retacn
修改內容 : 建立檔案
******************************************************************************/
/*----------------------------------------------*
* 包含標頭檔案 *
*----------------------------------------------*/
#include <ioCC2540.h>
#include "common.h"
/*****************************************************************************
函 數 名 : ADC_Read
功能描述 : 讀取指定通道的電壓值
輸入引數 : uint8 channel 通道號
輸出引數 : 無
返 回 值 :
注意 :
預設讀取12位精度的電壓,讀取10次取平均值
修改歷史 :
1.日 期 : 2014年9月20日
作 者 : tetacn
修改內容 : 建立
*****************************************************************************/
/*channel 14*/
uint16 ADC_Read (uint8 channel)
{
int16 reading = 0;
/*0x01左移14,0001 1100*/
uint8 adcChannel = 0x01<<channel;
int16 Result = 0;
if (channel <= 7) // 通道0-7需要通過P0.0-P0.7輸入
{
/*adccfg=0xf2,1111 0010*/
/* | 0001 1100*/
/* 1111 1110*/
ADCCFG |= adcChannel;
}
uint8 i=0;
do{
/*adccon3=0xb6,1011 0110*/
/* 14 0001 0100*/
/* 0001 1110 */
/* | 20 0010 0000*/
/* 0011 1110*/
ADCCON3 = channel | 0x20; // 12位精度,啟動轉換
while (!(ADCCON1 & 0x80)); // 等待轉換完成
// 讀取取樣結果
reading = (int16)(ADCL);
reading |= (int16)(ADCH << 8);
reading >>= 4; // 丟棄低位
Result += reading; // 累加
}while(i++ < 10); // 連續取樣10次
if (channel <= 7)
{
ADCCFG &= (adcChannel ^ 0xFF);
}
return (Result/10);
}
Main.c檔案
/******************************************************************************
版權所有 (C), 2014-2020
******************************************************************************
文 件 名 : main.c
版 本 號 : V1.0
作 者 : retacn
生成日期 : 2014年9月20日
功能描述 : ADC溫度採集
函式列表 :
修改歷史 :
1.日 期 : 2014年9月20日
作 者 : retacn
修改內容 : 建立檔案
******************************************************************************/
/*----------------------------------------------*
* 包含標頭檔案 *
*----------------------------------------------*/
#include <stdio.h>
#include <ioCC2540.h>
#include "Lcd12864.h"
#include "adc.h"
/*----------------------------------------------*
* 巨集定義 *
*----------------------------------------------*/
#define TEMP_ADC_CHANNEL 14
int main(void)
{
float temp=0;
char LCDBuf[21] = {0};
SysStartXOSC(); // 啟動外部晶振
LCD12864_Init(); // LCD初始化
// 開啟溫度感測器
TR0 = 0x01;
ATEST = 0x01;
while(1)
{
temp = (ADC_Read(TEMP_ADC_CHANNEL) - 1340) /10.0;
sprintf(LCDBuf, " temp : %0.1f", temp); //
LCD12864_DisStr(3, LCDBuf);
SoftWaitUs(100000);
}
return 0;
}