国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> MM32/靈動微電子 >> MM32W無線MCU系列產品應用筆記 —— 數(shù)據采集儀器

MM32W無線MCU系列產品應用筆記 —— 數(shù)據采集儀器

關鍵字:靈動微電子 MM32W無線MCU 數(shù)據采集儀器 作者: 來源: 發(fā)布時間:2022-06-14  瀏覽:11
在前面一個章節(jié)中我們詳細介紹了基于MM32W系列芯片的串口透傳應用,該應用可以實現(xiàn)豐富的數(shù)據透傳方案,在本章節(jié)我們將再給大家介紹一個簡易而擴展性較強的應用方案——基于MM32W系列開發(fā)的數(shù)據采集儀器。
 
方案應用圖

 圖1 方案應用圖

在工業(yè)控制現(xiàn)場,常常需要實時采集大量的現(xiàn)場數(shù)據,如電壓、電流、溫度、濕度、氣壓等,往往這些小信號都是需要輸入到專業(yè)的數(shù)據采集模塊中進行處理,后者又將采集的數(shù)據傳輸?shù)街鳈C進行處理,由主機根據處理的結果,將控制信號傳輸給現(xiàn)場執(zhí)行模塊進行各種操作。目前數(shù)據的傳輸基本是基于有線的網絡,如RS485,CAN等。這些有線的網絡一般具有成本比較高、維護不方便等缺點。而無線傳輸相對具有一定的優(yōu)勢,如成本低、可靠性高、維護方便等。本文將介紹一個基于MM32W系列MCU的簡易藍牙數(shù)據采集系統(tǒng)實現(xiàn)過程。

硬件資源如下:

本方案基于MM32 BLE_Test Board進行測試驗證,為了簡易模擬實現(xiàn)傳感器信號的采集與處理過程,在硬件原理上,本方案直接使用DEMO板上自帶的ADC電位器RV1來調節(jié)不同的輸入信號情況,該信號連接到引腳PB0上,該引腳可復用為AD采樣通道CH8;使用PB1連接到綠色LED指示燈,可作為藍牙連接狀態(tài)的指示,且低功耗喚醒引腳選擇PA0配置為下拉輸入;藍牙相關的功能引腳與前面介紹的方案一致,此處不做過多展開。

硬件原理圖

圖2 硬件原理圖
 
軟件資源如下:

結合上述使用到的硬件資源,下面我們著重介紹軟件實現(xiàn)流程以及相關配置代碼,主要涉及ADC模擬通道以及相應引腳的配置,加上ADC采樣的配置及使用。

以下為主函數(shù)初始化配置及相關全局變量定義內容,主要將所有的外設資源、藍牙廣播報文以及藍牙協(xié)議棧初始化,并且以阻塞的的方式運行藍牙,代碼如下:

const unsigned char AdvDat_HRS[]=

{//定義廣播報文

0x02,0x01,0x06,

0x03,0x19,0x41,0x03,

0x07,0x03,0x0D,0x18,0x0A,0x18,0x0F,0x18


};


int main(void)


{

BSP_Init();//初始化 SPI IO 以及ADC

radio_initBle(TXPWR_0DBM, &ble_mac_addr);//初始化藍牙芯片及藍牙協(xié)議棧,并且定義發(fā)射功率 

ble_set_adv_data((unsigned char *)AdvDat_HRS, sizeof(AdvDat_HRS));//設置BLE廣播數(shù)據

SysTick_Count = 0;

while(SysTick_Count <= 1500){};//在初始化藍牙協(xié)議棧后等待至少5ms才能正式運行藍牙

Write_Iwdg_ON(IWDG_Prescaler_32, 0x4E2); //設置IWDG看門狗防止程序跑飛,1s不喂狗系統(tǒng)重啟

ble_run(160*2); //采用堵塞方式運行藍牙協(xié)議,廣播間隔時間為 200ms


}

下面再介紹一下ADC操作相關的幾個函數(shù):

//在需要往APP上報實時ADC轉換數(shù)值時調用下面獲取ADC通道平均采樣值的函數(shù)


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

**函數(shù)信息 :Get_Adc_Average(uint8_t ADC_Channel_x,uint8_t times)     

**功能描述 :獲取幾次ADC1采樣值的平均值

**輸入參數(shù) :ADC_Channel_x , x為0~11

**輸出參數(shù) :puiADData為ADC讀到的值

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

u16 Get_Adc_Average(uint8_t ADC_Channel_x,uint8_t times)


{


u32 temp_val=0;


u8 t;


u8 delay;

for(t=0;t<times;t++)

{

temp_val+=ADC1_SingleChannel_Get(ADC_Channel_x);

for(delay=0;delay<100;delay++);

}

return temp_val/times;





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

**函數(shù)信息 :ADC1_SingleChannel_Get()       

**功能描述 :獲取ADC1轉換數(shù)據

**輸入參數(shù) :ADC_Channel_x , x為0~11

*puiADData ,ADC1實際轉換數(shù)據

**輸出參數(shù) :ucStatus ,0 表示數(shù)據獲取失敗,1 表示成功

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

u16 ADC1_SingleChannel_Get(uint8_t ADC_Channel_x)

{                 

u16 puiADData;

ADC_SoftwareStartConvCmd(ADC1, ENABLE); // ADCR寄存器的ADST位使能,軟件啟動轉換

while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0); //等待ADC轉換完成標志位置位

ADC_ClearFlag(ADC1, ADC_FLAG_EOC);//清除ADC轉換完成標志位置位

puiADData=ADC1->ADDATA&0xfff;//讀取ADC轉換值

return puiADData;


}


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

**函數(shù)信息 :void ADC1_SingleChannel(uint8_t ADC_Channel_x)     

**功能描述 :配置ADC1單次轉換模式

**輸入參數(shù) :ADC_Channel_x , x為0~11

**輸出參數(shù) :無

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

void ADC1_SingleChannel(uint8_t ADC_Channel_x)


{


ADC_InitTypeDef  ADC_InitStructure;   


RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


  
ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;//初始化ADC分頻

ADC_InitStructure.ADC_Mode = ADC_Mode_Single;//初始化ADC工作模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//禁止連續(xù)轉換

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //初始化ADC轉換對齊方式

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//初始化ADC采樣精度

ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC  

ADC_RegularChannelConfig(ADC1, DISABLE_ALL_CHANNEL , 0, 0); //屏蔽所有ADC通道

ADC_RegularChannelConfig(ADC1, ADC_Channel_x, 0, ADC_SampleTime_13_5Cycles); //使能選中通道

if(ADC_Channel_x == ADC_Channel_11)

{

ADC_VrefintCmd(ENABLE);//如果為通道11,則使能內部參考電壓

}

ADC_Cmd(ADC1, ENABLE); //使能ADC1

}

我們在gatt_user_send_notify_data_callback函數(shù)中給手機發(fā)送數(shù)據,該函數(shù)屬于回調函數(shù),協(xié)議棧會在系統(tǒng)允許的時候(異步)回調本函數(shù),該函數(shù)可用于藍牙模塊端主動發(fā)送數(shù)據之用,函數(shù)內部不得增加阻塞代碼。在本應用中我們在此函數(shù)中實現(xiàn)將ADC采集并且轉換后的數(shù)據傳輸給手機APP。詳細實現(xiàn)代碼如下:

//藍牙連接成功后協(xié)議在空閑的時候會調用本回調函數(shù)

void gatt_user_send_notify_data_callback(void){ 

static unsigned char HRMData[3]={0x00,0x00,0x01};//定義裝載ADC值的存儲區(qū)

static unsigned char SimBatt=100;//定義裝載ADC 百分數(shù)值的存儲區(qū)

static u8 Cont=0;//回調次數(shù)計數(shù)器

u16 Val=0;


Cont++; //每進一次該函數(shù)回調次數(shù)計數(shù)器+1

if (Cont >= 20)

{//每進入該回調函數(shù)20次才發(fā)送一次ADC數(shù)據

Cont = 0;        

Val = Get_Adc_Average(ADC_Channel_3,5); //獲取5次ADC轉換的平均值

Val = Val>>3; // 0~511 for HRM data

cur_notifyhandle = 0x12;//ADC數(shù)據回復句柄值

if (Val<0x100)

{

HRMData[0] = 0; //1Byte

HRMData[1] = Val;

sconn_notifydata(HRMData,2);//換算處理好ADC數(shù)據后通過藍牙發(fā)出

}

else

{

HRMData[0] = 1; //2Byte

HRMData[1] = Val;

HRMData[2] = Val>>8;

sconn_notifydata(HRMData,3);//換算處理好ADC數(shù)據后通過藍牙發(fā)出

}   


}

else if (10 == Cont) {//每進入該回調函數(shù)10次才發(fā)送一次ADC數(shù)據

Val = Get_Adc_Average(ADC_Channel_3,5); //獲取5次ADC轉換的平均值

Val = Val>>3;

SimBatt = (Val*100)>>9; //0~100

cur_notifyhandle = 0x18;//ADC百分數(shù)形式數(shù)據回復句柄值

sconn_notifydata(&SimBatt,1);/換算處理好ADC百分數(shù)后通過藍牙發(fā)出

}


}


除了上述關鍵的藍牙數(shù)據發(fā)送函數(shù)外,下面再簡單介紹一些與藍牙相關的特征值定義:

在const BLE_CHAR AttCharList[] 中定義了本案中的兩個特征值:

{TYPE_CHAR,0x11,ATT_CHAR_PROP_NTF, 0x12,0, 0x37,0x2A, UUID16_FORMAT},//ADC數(shù)值

{TYPE_CHAR,0x17,ATT_CHAR_PROP_RD|ATT_CHAR_PROP_NTF, 0x18,0,0x19,0x2A,UUID16_FORMAT},//百分數(shù)形式

在void att_server_rdByGrType( u8 pdu_type, u8 attOpcode, u16 st_hd, u16 end_hd, u16 att_type )中實現(xiàn)了自定義特征值服務聲明。

手機操作流程如下:

打開手機藍牙并打開 App,選擇HRM進入,點擊Connect按鈕開始搜索溫濕度藍牙設備。

選擇對應名稱(MM32W0_ADC)的藍牙設備并進行配對,等待連接成功。連接成功后會有相應提示,按鈕Connect名字會變成Disconnect。

連接成功后,在App界面上電池圖標會顯示從DEMO板上的電位器分壓得來的ADC數(shù)據信息(經過關系換算或以百分比形式,非實際轉換值)。

手機APP圖

圖3 手機APP圖

編輯:ls  最后修改時間:2022-06-14

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

欧美中文日韩一区久久| 美女极度色诱视频在线观看| 日韩欧美一区二区亚洲| 青青操精品视频在线观看| 久久99亚洲小姐精品综合| 六月丁香六月综合缴情| 欧美三级精品在线观看| 日韩不卡一区二区三区色图| 精品人妻精品一区二区三区| 人人妻在人人看人人澡| 91在线播放在线播放观看| 大香蕉伊人一区二区三区| 国产又粗又猛又大爽又黄同志| 爽到高潮嗷嗷叫之在现观看| 深夜福利亚洲高清性感| 日韩人妻有码一区二区| 日本高清加勒比免费在线| 欧美大胆女人的大胆人体| 国产日韩综合一区在线观看| 久热青青草视频在线观看| 草草视频福利在线观看| 欧美亚洲91在线视频| 麻豆国产精品一区二区| 亚洲黑人精品一区二区欧美| 在线免费国产一区二区三区 | 最新日韩精品一推荐日韩精品| 欧洲精品一区二区三区四区| 亚洲熟妇熟女久久精品| 三级高清有码在线观看| 亚洲高清亚洲欧美一区二区| 国产高清一区二区不卡| 久久亚洲国产视频三级黄| 国产亚州欧美一区二区| 99热九九热这里只有精品| 国产女优视频一区二区| 欧美日韩无卡一区二区| 好吊色欧美一区二区三区顽频| 国产亚洲二区精品美女久久| 日韩精品一级一区二区| 亚洲天堂精品一区二区| 亚洲一区二区精品免费|