1. 程式人生 > >ble學習筆記六------------溫度感測器溫度採集

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.EOC0

ADCCON1.ST0

ADCCON1.STSEL 11

ADCCON2的設定和ADCCON3的配置是一樣的0011 1110

ADC參考電壓使用內部電壓採用12位精度採集,值為0x3e

示例程式碼如下:

複製lcd工程,新增如下程式碼:

ADC.h檔案如下:

/******************************************************************************

                  版權所有 (C), 2014-2020 

 ******************************************************************************

  文 件 名   : ADC.h

  版 本 號   : V1.0

  作    者   :  retacn

  生成日期   : 2014920

  功能描述   : ADC.c 的標頭檔案

  函式列表   :

  修改歷史   :

  1.日    期   : 2014920

    作    者   :  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

  生成日期   : 2014920

  功能描述   : ADC取樣

  函式列表   :

              ADC_Read

  修改歷史   :

  1.日    期   : 2014920

    作    者   :  retacn

    修改內容   建立檔案

******************************************************************************/

/*----------------------------------------------*

 * 包含標頭檔案                                   *

 *----------------------------------------------*/

#include <ioCC2540.h>

#include "common.h"

/*****************************************************************************

 函 數 名  : ADC_Read

 功能描述  讀取指定通道的電壓值

 輸入引數  : uint8 channel  通道號

 輸出引數  

 返 回 值  :

 注意   :

            預設讀取12位精度的電壓,讀取10次取平均值

 修改歷史      :

  1.日    期   : 2014920

    作    者   :  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

  生成日期   : 2014920

  功能描述   : ADC溫度採集

  函式列表   :

  修改歷史   :

  1.日    期   : 2014920

    作    者   :  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;

}