第六章合集2:使用chatGPT編寫簡易示波器:touchGFX人機界面和數(shù)據(jù)采集

6.3.2數(shù)據(jù)采集界面設計
(1)修改上一節(jié)的動態(tài)圖例程,將AD采樣結(jié)果,定時更新到graph上顯示。
程序邏輯是,通過cubeMX配置ADC,通過DMA方式,將AD采樣的數(shù)據(jù)存儲在數(shù)組中,存儲數(shù)量達到規(guī)定的值后,產(chǎn)生DMA中斷。
在MainView.cpp的handleTickEvent()定期刷新函數(shù)中,判斷是否采樣結(jié)束。如果結(jié)束了,則將數(shù)組中的數(shù)據(jù),更新到graph動態(tài)圖中,達到定期更新顯示采樣數(shù)據(jù)的示波器效果。
1)查看STM32F469I-DISCO開發(fā)板的原理圖(官方文檔“mb1189.pdf”),找到連接端子“Arduino UNO connector”部分,了解輸出端子管腳配置,我們發(fā)現(xiàn),合適作為ADC1_IN9輸入通道使用的管腳為PB1管腳。

圖6-12 查看原理圖獲得AD輸入管腳
2)打開工程路徑下的cubeMX工程,并配置ADC1的輸入為IN9通道,DMA設置為“從外設到內(nèi)存”,優(yōu)先級可以設置為高。

?
圖 6-13 設置DMA方式將采樣結(jié)果直接搬運到內(nèi)存圖
3)設置AD采樣參數(shù)。
為得到最高采樣率(2.4MHz),首先在cubeMX的“Clock Configuration”界面,將PCLK2設置為72MHz(默認為90MHz),如下圖所示:

圖?6-14 設置采樣時鐘
然后回到ADC1的配置界面,對ADC1做如下設置:

圖?6-15 設置AD采樣參數(shù)圖
如上圖所示,我們將ADC的時鐘設置為“PCLK2 divided by2”,采樣精度默認為12位(每次轉(zhuǎn)換需要15個時鐘),將“Continuous Conversion Mode”設置為“Enable”確保連續(xù)采樣,并將“DMA Continuous Request”設置為“Enable”,確保DMA搬運能連續(xù)執(zhí)行。采樣時間設置為3個時鐘周期(讀者可以選擇比較長的采樣時間,獲得較低的采樣率)。
在本例中,采樣率的計算方式為:(PCLK2/2)/15=2.4MHz,只有將PCLK2設置為72MHz,才能使得ADC的時鐘(PCLK2/2)最高,即36MHz(該單片機的最高ADC時鐘),而默認的PCLK2為90M Hz,如果按照默認的PCLK2,是不能得到最高采樣率的,讀者可以嘗試修改PCLK2的參數(shù),體會最高采樣率的設置技巧。
4)點擊cubeMX右上角的“GENERATE CODE”,然后進入工程文件夾,打開生成的MDK工程,點擊并打開“main.c”,在用戶定義的變量區(qū),增加AdcConvertedValue數(shù)組和 adcDmaOverFlag變量,數(shù)組用來存儲每次采樣的100個數(shù)據(jù),變量用來確定100個數(shù)據(jù)是否已經(jīng)采樣完成。

圖 6-16 在主函數(shù)申明采樣數(shù)組和采樣結(jié)束標志位
在主函數(shù)中,當初始化完成之后,增加DMA傳輸語句,該行程序啟動DMA傳輸,將ADC采樣的數(shù)據(jù),無需CPU介入,直接搬運到數(shù)組中,存儲完100個數(shù)據(jù)之后,產(chǎn)生DMA中斷。在采樣存儲過程中,數(shù)據(jù)存儲的地址會自動增加。如下圖所示:

圖 6-17 在主函數(shù)初始化完成后啟動ADC的DMA傳輸模式
5)點擊并打開中斷響應文件“stm32f4xx_it.c”,找到cubeMX自動生成的DMA中斷函數(shù),在每次100個數(shù)據(jù)采樣完成之后,系統(tǒng)會自動進入這個中斷,并執(zhí)行中斷響應函數(shù)。在該函數(shù)中,我們將采樣結(jié)束標志位adcDmaOverFlag置為1。如下圖所示:

?
圖 6-18 采樣結(jié)束后進入DMA中斷響應函數(shù)
由于adDmaOverFlag變量是在“main.c”中定義的,因此在“stm32f4xx_it.c”中使用時,請在該文件的用戶變量定義區(qū)
“/* USER CODE BEGIN EV */”和“/* USER CODE END EV */”之間增加“extern uint8_t adDmaOverFlag;”,申明該變量是外部變量。
6)回到touchGFX軟件界面,將本程序不需要的滾動條及其交互刪除,如下圖所示:

圖 6-19 刪除滾動條及交互操作
然后設置動態(tài)圖控件,將圖形的顯示點數(shù)、可見范圍設置為100,并將數(shù)據(jù)范圍更改為0-4095(本例使用的是12位ADC,采樣結(jié)果最大為4095)。

圖 6-20 設置graph的顯示范圍
7)點擊右下角的“Generate Code”,重新生成代碼,使用MDK重新打開生成的工程,打開“MainView.hpp”,將其中滾動條響應函數(shù)“sliderValueChanged(int )”刪除。

圖 6-21 刪除滾動條交互操作響應函數(shù)
8)打開“MainView.cpp”,將其中的滾動條響應函數(shù)、隨機數(shù)發(fā)生器函數(shù)刪除,本例中不需要使用。

圖 6-22 刪除滾動條交互操作響應函數(shù)和隨機函數(shù)發(fā)生器
然后修改“MainView.cpp”,增加包含文件“main.h”(含ADC_HandleTypeDef結(jié)構(gòu)體的定義),增加外部變量“hadc1”、 AdcConvertedValue[100]”、
“adcDmaOverFlag”申明,這些變量均在main.c中定義。如下圖所示:

圖 6-23 修改“MainView.cpp”將采樣結(jié)果更新到動態(tài)圖顯示
如上圖所示,在handleTickEvent()函數(shù)中,每隔100個handleTickEvent周期(每個周期約20ms),查詢DMA中斷標志位adcDmaOverFlag是否為1,如果為1,則表示DMA中斷已經(jīng)產(chǎn)生,100個點已經(jīng)采樣結(jié)束,可以將100個采樣數(shù)據(jù)更新到動態(tài)圖上面進行顯示。顯示完畢之后,將DMA中斷標志位adcDmaOverFlag置為0,并重新開始下一輪采樣。下一輪新的100個采樣結(jié)果會將存儲在數(shù)組中舊的采樣結(jié)果覆蓋。
9)程序編譯,下載,在開發(fā)板背面的輸出端子PB1(A0)和GND管腳上,使用信號源,輸入幅值為3伏、直流偏移為1.5伏、頻率為100KHz、占空比為50%的方波,如下圖所示:

圖 6-24 方波信號輸入測試圖
開發(fā)板所顯示的動態(tài)圖如下:

圖?6-25 采樣結(jié)果顯示圖
由上圖可以看出,對于100KHz的輸入信號,每個周期約有24個采樣點,可驗證單通道采樣率為2.4MHz。
讀者可改變輸入波形,查看ADC采樣的波形圖,注意信號源給出的電壓范圍不要超過0-3.3伏,這是STM32F469的ADC的輸入范圍。