STM32W108無線射頻模塊AD轉換器應用實例
STM32W108 AD轉換器是一個一階∑-△轉換器,具有以下特性:
l 分辨率可達12位
l 採樣最小時間5.33us(188KHz)
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 id在adc.h中定義,有三種,本實例中用到ADC_USER_APP;ADCReferenceType reference爲參考類型,adc.h中定義,本實例中用ADC_REF_INT,ADCChannelType channel爲模擬輸入通道,在adc.h中定義,本實例中用到的是PA4作爲模擬輸入的通道;ADCRateType rate爲AD轉換頻率,在adc.h中定義,本實例中用到的是ADC_CONVERSION_TIME_US_4096,4096us,12個有效位。
無線節點上電首先進行硬件初始化,然後等按鍵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煙霧傳感器的數字輸出端口與STM32W的PA3端口相連接 #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 . //配置PA4和PA5作爲複用輸出引腳,用於數據包的跟蹤 halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT); halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);
GPIO_IRQDSEL = PORTB_PIN(2); //連接IRQD到PB2/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.2V,AD轉換結果如圖:
操作各傳感器時,可以調節煙霧傳感器模塊上面的滑動變阻器,以改變傳感器的靈敏度。
本文出自《STM32W108嵌入式無線傳感器網絡》邱鐵,夏鋒,周玉編著.清華大學出版社,2014年5月