STM32W108無線射頻模塊AD轉換器應用實例

STM32W108無線射頻模塊AD轉換器應用實例 

 

STM32W108 AD轉換器是一個一階∑-△轉換器,具有以下特性:

l  分辨率可達12

l  採樣最小時間5.33us188KHz

l  6個外部和4個內部輸入源,可進行差分和單端轉換

l  兩個電壓轉換範圍(差分):-VREF~+VREF-VDD_PADS~+VDD_PADS

l  可選擇內部和外部參考標準VREF:內部的VREF可用於輸出

l  數字偏移和增益校準

l  專用DMA通道,通道支持一次和連續的操作模式

應用實例解析

編寫煙霧傳感器測試程序,讀取煙霧傳感器的AD值,並輸出到串口顯示。

9.3.1開發環境與硬件說明

硬件:STM32W108 無線開發板、煙霧傳感器、J-LINK調試器、PC機等。

軟件:IAR Embedded Workbench開發軟件、SimpleMac協議棧。

 

 

 

9.3.2 軟件設計與規劃

本實例煙霧傳感器中用到adc.c中的函數,有StStatus halStartAdcConversion(ADCUser id, ADCReferenceType reference, ADCChannelType channel, ADCRateTyperate),該函數是開啓AD轉換功能;其中ADCUser idadc.h中定義,有三種,本實例中用到ADC_USER_APPADCReferenceType reference爲參考類型,adc.h中定義,本實例中用ADC_REF_INTADCChannelType channel爲模擬輸入通道,在adc.h中定義,本實例中用到的是PA4作爲模擬輸入的通道;ADCRateType rateAD轉換頻率,在adc.h中定義,本實例中用到的是ADC_CONVERSION_TIME_US_40964096us12個有效位。

無線節點上電首先進行硬件初始化,然後等按鍵S2被按下,只要S2被按下,無線節點就週期性的進行AD轉換。

9.3.3 傳感器數據採集程序設計

在煙霧傳感器的驅動程序中涉及到了AD轉換的內容:

其中adc.h中的內容有:

static int16u adcData;             //DMA中的ADC轉換結果

 

在煙霧傳感器的驅動程序中涉及到了AD轉換的函數:

adc.c中的添加函數有:

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

功能描述:完成對AD轉換後數據的獲取

輸入參數:無

輸出參數:AD轉換後的16位無符號數

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

int16u  getData(void)

{   

int16s data; //存放AD轉換後的電壓的數值

while ( !(INT_ADCFLAG &  INT_ADCULDFULL));  //無效時,空等待

data=halConvertValueToVolts(adcData);  //AD轉換的電壓數據存至data變量中

    return (int16u)data;

}

 

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

功能描述:內部ADC初始化

輸入參數:無

輸出參數:無

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

void  halInternalInitAdc(void)

{

  //初始化狀態變量

  adcPendingRequests = 0;

  adcPendingConversion = NUM_ADC_USERS;

  adcCalibrated = FALSE;

  adcStaticConfig = ADC_1MHZCLK | ADC_ENABLE;  //初始化配置:1MHz, 低壓範圍

 

  // 設置所有ADC讀取無效

  adcReadingValid = 0;

 

  // 關閉ADC

  ADC_CFG = 0;  //禁用ADC,關閉HV緩衝區

  ADC_OFFSET = ADC_OFFSET_RESET;

  ADC_GAIN = ADC_GAIN_RESET;

  ADC_DMACFG = ADC_DMARST;

  ADC_DMABEG = (int32u)&adcData;

  ADC_DMASIZE = 1;

  ADC_DMACFG = (ADC_DMAAUTOWRAP | ADC_DMALOAD);

 

  //清空ADC中斷,並使能中斷

  INT_ADCCFG = INT_ADCULDFULL;

  INT_ADCFLAG = 0xFFFF;

  INT_CFGSET = INT_ADC;

 

  stCalibrateVref();         //校準參考電壓

}

 

 

MQ2.h編寫(煙霧傳感器)

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

文件名:MQ2.h

版本號:v1.0

創建日期:2012-4-1

硬件描述:煙霧傳感器的數字輸出接STM32W芯片的PA3,模擬輸出接STM32W芯片的PA4

主要函數描述:MQSetStatus(int32u  status):設置對應引腳;

               MQGetStatus():獲得對應端口值

               MQGetDCData():獲得煙霧傳感器數字輸出的值

               MQADCInit():設置PA4爲模擬輸入狀態

               MQGetADCStart():開啓AD轉換

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

#ifndef   __MQ_H__

#define   __MQ_H__

 

//設置MQ2煙霧傳感器的數字輸出端口與STM32WPA3端口相連接

#define MBUS PORTA_PIN(3)

#define MBUS_INPUT_GPIO  GPIO_PAIN

#define MBUS_OUTPUT_GPIO GPIO_PAOUT

#define MBUS_GPIO_PIN    PA3_BIT

#define MBUS_WAKE_SOURCE 0x00000080

#define MBUS_SET  (GPIO_PASET_ADDR+((GPIO_PBCFGL_ADDR

-GPIO_PACFGL_ADDR)*(MBUS/8)))

#define MBUS_CLR  (GPIO_PACLR_ADDR+((GPIO_PBCFGL_ADDR

-GPIO_PACFGL_ADDR)*(MBUS/8)))

 

extern void MQSetStatus(int32u status);      //設置對應引腳;

extern u8 MQGetStatus();          //獲得對應端口值

extern u8 MQGetDCData();            //獲得煙霧傳感器數字輸出的值

extern void MQADCInit();    //設置PA4爲模擬輸入狀態

extern void MQGetADCStart();   //開啓AD轉換

#endif

 

MQ2.c編寫(煙霧傳感器)

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

文件名:MQ2.c

版本號:v1.0

創建日期:2012-4-1

硬件描述:煙霧傳感器的數字輸出接STM32W芯片的PA3,模擬輸出接STM32W芯片的PA4

主要函數描述:MQSetStatus(int32u  status):設置對應引腳;

               MQGetStatus():獲得對應端口值

               MQGetDCData():獲得煙霧傳感器數字輸出的值

               MQADCInit():設置PA4爲模擬輸入狀態

              MQGetADCStart():開啓AD轉換

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

#include PLATFORM_HEADER

#include BOARD_HEADER

#include "MQ2.h"

#include "hal/micro/micro-common.h"

#include  "hal/micro/cortexm3/micro-common.h"

#include "hal/micro/adc.h"

#include "stdio.h"

#define LOW 0//低電平

#define HIGH 1//高電平

 

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

功能描述:完成對特定端口的設置

輸入參數:status:端口參數,高電平或低電平

輸出參數:無

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

void MQSetStatus(int32u status)

{

     halGpioConfig(MBUS,GPIOCFG_OUT);

     if(MBUS/8 < 3)

    {       

         if(status==HIGH) //設置爲高電平

             *((volatile int32u *)MBUS_SET) = BIT(MBUS&7);       

        else  //設置爲低電平

            *((volatile int32u *)MBUS_CLR) =  BIT(MBUS&7);

  }

}

 

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

功能描述:完成獲取對應端口的值

輸入參數:無

輸出參數:對應端口的值

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

u8 MQGetStatus()

{

    return  (MBUS_INPUT_GPIO & (1<<MBUS_GPIO_PIN)) ? 1 : 0;

}

 

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

功能描述:完成對煙霧傳感器數字輸出的獲取

輸入參數:無

輸出參數:煙霧傳感器數字輸出值

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

u8 MQGetDCData()

{

     halGpioConfig(MBUS,GPIOCFG_IN);

     if(MQGetStatus()==0)

    {

         halCommonDelayMicroseconds(500);   //延時抗干擾

            if(MQGetStatus()==0)

                return 0;

            else

return  1;

    }

else

return  1;

}

 

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

功能描述:設置PA4端口爲模擬輸入輸出

輸入參數:無

輸出參數:無

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

void MQADCInit()

{

     halGpioConfig(PORTA_PIN(4),GPIOCFG_ANALOG);

}

 

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

功能描述:完成對給定數字的顯示

輸入參數:無

輸出參數:無

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

void MQGetADCStart()

{   

     halAdcCalibrate(ADC_USER_APP);   //設置ADC校準

halStartAdcConversion(ADC_USER_APP,ADC_REF_INT,  ADC_SOURCE_ADC4_VREF2,ADC_CONVERSION_TIME_US_4096 ); //開啓AD轉換,ADC4,轉換速率4096

}

9.3.4 測試程序編寫

編寫測試程序源文件solar-system.c

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

文件名:solar-system.c

版本號:v1.0

創建日期:2012-4-1

硬件描述:對於無線節點上煙霧傳感器數字輸出接PA3,模擬輸出接PA4

主要函數描述:main( )函數實現對各個傳感器的控制。

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

#include  PLATFORM_HEADER

#include  BOARD_HEADER

#include  <stdio.h>

#include  <stdlib.h>

#include  <string.h>

#include  "error.h"

#include  "hal/hal.h"

#include  "include/phy-library.h"

#include  "hal/micro/cortexm3/iap_bootloader.h"

#include  "MQ2.h"

 

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

功能描述:完成對某種傳感器的檢測

輸入參數:無

輸出參數:無

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

int  main(void)

{

   boolean preesed = FALSE;

   halInit();//初始化硬件

   uartInit(115200, 8, PARITY_NONE, 1); //初始化UART

  .

  //配置PA4PA5作爲複用輸出引腳,用於數據包的跟蹤

   halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT);

  halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);

 

  GPIO_IRQDSEL = PORTB_PIN(2); //連接IRQDPB2/SC1RXD

 

  //允許IRQD標誌位激活任何的IRQD

  GPIO_INTCFGD = (3<<GPIO_INTMOD_BIT);

  INT_GPIOFLAG = INT_IRQDFLAG;

  INT_PENDCLR = INT_IRQD;

 

  INTERRUPTS_ON();

  halInitLed();   //初始化LED

  halInitButton(); //初始化按鍵

  halInternalInitAdc();//內部ADC初始化

  MQADCInit(); //煙霧傳感器接口初始化

  printf("Press S2 to begin ADC  Change\n");

  while(TRUE)

  {

      halCommonDelayMilliseconds(10);

      if (halGetButtonStatus(BUTTON_S2) ==  BUTTON_PRESSED||preesed == TRUE)

      {

        preesed = TRUE;

    

        /********讀取煙霧傳感器AD*******************/

        MQGetADCStart();       

        u16 mqacdata=getData();    

         u8 flag=0;

        if(mqacdata&(0x01<<15)!=0)

        {

            mqacdata=~(mqacdata-1);//負數,2進制補碼

            flag=1;

        }

       

        if(mqacdata<32768)

        {

            if(flag==1)

            {              

              printf("Smoke  -%d\n",mqacdata);

            }

            else

            {            

              printf("Current ADC:  %d\n",mqacdata);

            }

        }

         halCommonDelayMilliseconds(2000);//2000ms  

      }     

  }

}

9.3.5 測試結果及分析

煙霧傳感器的模擬輸出經過AD轉換後的值通過串口發送到PC機,AD轉換的電壓範圍最大爲1.2VAD轉換結果如圖

 

操作各傳感器時,可以調節煙霧傳感器模塊上面的滑動變阻器,以改變傳感器的靈敏度。

 

 

本文出自《STM32W108嵌入式無線傳感器網絡》邱鐵,夏鋒,周玉編著.清華大學出版社,20145

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章