首頁(yè) > 評(píng)測(cè) > 【STM32H750B-DK評(píng)測(cè)】電機(jī)轉(zhuǎn)速檢測(cè)UI
【STM32H750B-DK評(píng)測(cè)】電機(jī)轉(zhuǎn)速檢測(cè)UI
- [導(dǎo)讀]
- 本帖最后由 吶咯密密 于 2022-10-25 16:05 編輯 2018年秋季,STM32正式收購(gòu)了TouchGFX -- 嵌入式GUI界面中間件軟件領(lǐng)先的開(kāi)發(fā)商。從此廣大嵌入式工程師擁有了優(yōu)質(zhì)的免費(fèi)的正式版TouchGFX ,用過(guò)TouchGFX的都知
本帖最后由 吶咯密密 于 2022-10-25 16:05 編輯
2018年秋季,STM32正式收購(gòu)了TouchGFX -- 嵌入式GUI界面中間件軟件領(lǐng)先的開(kāi)發(fā)商。從此廣大嵌入式工程師擁有了優(yōu)質(zhì)的免費(fèi)的正式版TouchGFX ,用過(guò)TouchGFX的都知道,TouchGFX在MCU系統(tǒng)上運(yùn)行的界面非常炫,堪比手機(jī)的APP界面,可以直接在TouchGFX拖拽式開(kāi)發(fā)UI界面,且可以直接用模擬器查看顯示效果,不用每次調(diào)試必須燒錄到MCU,所見(jiàn)即所得,同時(shí)ST收購(gòu)后直接嵌入開(kāi)發(fā)板例程,用戶購(gòu)買開(kāi)發(fā)板后直接便可以進(jìn)行UI開(kāi)發(fā),方便快捷。
TouchGFX是一款免費(fèi)的GUI工具,可以在STM32上運(yùn)行。在您的產(chǎn)品中包含GUI(圖形用戶界面)將有助于您設(shè)計(jì)對(duì)用戶更友好、更安全、更現(xiàn)代化的設(shè)備。STM32系列提供在嵌入式設(shè)備中添加類似智能手機(jī)的圖形用戶界面(GUI)所需的工具,加速了 “HMI of Things” 革命。
TouchGFX框架的架構(gòu)允許僅使用一個(gè)幀緩沖區(qū)在內(nèi)部存儲(chǔ)器上運(yùn)行,即使使用全屏動(dòng)畫和智能效果,仍然可以獲得高幀速率。
當(dāng)設(shè)備僅使用一個(gè)幀緩沖區(qū)時(shí),重要的是圖形框架不能在TFT控制器將像素輸出到屏幕的同時(shí)繪制新圖像到幀緩沖區(qū)。否則,結(jié)果將是舊幀和新幀的混合(圖像撕裂)。
TouchGFX通過(guò)增量算法來(lái)控制幀緩沖區(qū)的使用,該算法可以與輸出像素的TFT控制器同時(shí)更新幀緩沖,但總是只更新TFT控制器已傳輸?shù)南袼亍?/p>
TouchGFX負(fù)責(zé)所有這一切,允許應(yīng)用程序員專注于實(shí)現(xiàn)設(shè)計(jì),實(shí)現(xiàn)高達(dá)60 Hz幀率的平滑動(dòng)畫。
開(kāi)發(fā)環(huán)境:
如果只關(guān)注GUI的開(kāi)發(fā),不進(jìn)行MCU開(kāi)發(fā),在使用開(kāi)發(fā)板的情況下只需要使用如下兩個(gè)軟件:
TouchGFX Designer:TouchGFX Designer是GUI的集成開(kāi)發(fā)環(huán)境,所有與界面布局有關(guān)的工具都整合到了一起。
TouchGFX Designer軟件可直接在ST官網(wǎng)獲取,目前最新版本是4.20.0,本人使用4.20.0不好用,很容易報(bào)錯(cuò),不知道為啥,于是回退到了4.19.1。
下載完成后是一個(gè)集合包,其中包含一個(gè)完整的例程和TouchGFX Designer的安裝軟件,然后在這個(gè)路徑下雙擊安裝程序,一步步傻瓜安裝便可。
Microsoft Visual Studio:VS是美國(guó)微軟公司的開(kāi)發(fā)工具包系列產(chǎn)品。VS是一個(gè)基本完整的開(kāi)發(fā)工具集,它包括了整個(gè)軟件生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開(kāi)發(fā)環(huán)境(IDE)等等。直接跳轉(zhuǎn)官網(wǎng)下載免費(fèi)版,無(wú)需激活。
開(kāi)始第一個(gè)例程
打開(kāi)TouchGFX Designer軟件,依次點(diǎn)擊左邊菜單欄:Examples->Select Board Setup。
選擇對(duì)應(yīng)開(kāi)發(fā)板后可看到ST提供的各種例程,便可快速搭建一個(gè)基礎(chǔ)例程。
動(dòng)手開(kāi)發(fā):
整個(gè)系統(tǒng)分為兩個(gè)頁(yè)面:
開(kāi)始頁(yè)面:上電加載初始畫面,點(diǎn)擊畫面切換到電機(jī)轉(zhuǎn)速頁(yè)面。
速度檢測(cè)頁(yè)面:以折線圖的形式顯示實(shí)時(shí)的電機(jī)旋轉(zhuǎn)速度,當(dāng)一頁(yè)顯示完清屏顯示下一屏數(shù)據(jù)。
開(kāi)始頁(yè)面:
新建一個(gè)Screen,開(kāi)機(jī)需要一張圖片全屏顯示,先找一張.PNG圖片,將分辨率改為屏幕分辨率480*272。并將圖片放在項(xiàng)目目錄:TouchGFX->assets->images下。此時(shí)在TouchGFX Designer軟件中便會(huì)自動(dòng)加載進(jìn)來(lái)。
選擇添加圖片,將圖片框放大到整個(gè)頁(yè)面大小,選擇需要的圖片。
為了配合開(kāi)機(jī)頁(yè)面的效果,在圖片中的齒輪中心添加一個(gè)按鈕,并將按鈕的透明度調(diào)到最低,這樣再畫面中按鈕相當(dāng)于隱藏起來(lái),再給按鍵加一個(gè)交互事件,使之可以點(diǎn)擊跳轉(zhuǎn)下一個(gè)頁(yè)面。
電機(jī)旋轉(zhuǎn)速度檢測(cè)頁(yè)面:
該頁(yè)面由官方例程修改而來(lái),進(jìn)行了一定的美化,并將圖表類型進(jìn)行更改,使之顯示完一屏之后進(jìn)行清屏,便于顯示下一頁(yè)數(shù)據(jù)。上方有一個(gè)進(jìn)度條,用于顯示進(jìn)度,該精度條用于后續(xù)擴(kuò)展編碼器校正用。
頁(yè)面部分基本都是拖拽并設(shè)置參數(shù),不做贅述,如果想要進(jìn)行數(shù)據(jù)的顯示以及按鍵的響應(yīng)則需要進(jìn)行底層的代碼編寫。在設(shè)計(jì)完頁(yè)面效果及響應(yīng)屬性后點(diǎn)擊右下角Generate Code按鈕生成代碼,然后點(diǎn)擊左下角的File打開(kāi)工程文件夾,在該文件路徑下使用Visual Studio打開(kāi).sln文件
在Scree1View.cpp文件中編寫頁(yè)面中按鍵按下后需要響應(yīng)的函數(shù):
下面要在 Screen1ViewBase 類的子類 Screen1View 中添加按鈕響應(yīng)函數(shù)的聲明和函數(shù)體:
然后編寫實(shí)際的函數(shù)實(shí)現(xiàn),因?yàn)榇颂幮枰獙?shí)際的轉(zhuǎn)速,該部分需要MCU提供,因?yàn)殚_(kāi)發(fā)板不好外接電機(jī)輸入,此處采用隨機(jī)數(shù)轉(zhuǎn)化為速度值顯示。
- int point = 2900;
- static uint16_t randomish(int32_t seed)
- {
- static uint16_t last = 0;
- const uint16_t num = (seed * (1337 + last)) % 0xFFFF;
- last = num;
- return num;
- }
- Screen1View::Screen1View()
- {
- tickCounter = 0;
- /* staticGraph.setTouchable(true);*/
- dynamicGraph1.setTouchable(true);
- }
- void Screen1View::setupScreen()
- {
- Screen1ViewBase::setupScreen();
- }
- void Screen1View::tearDownScreen()
- {
- Screen1ViewBase::tearDownScreen();
- }
- void Screen1View::addRandomPoint()
- {
- int xIntervalSize = dynamicGraph1.getGraphRangeXMaxAsInt() - dynamicGraph1.getGraphRangeXMinAsInt();
- int yIntervalSize = dynamicGraph1.getGraphRangeYMaxAsInt() - dynamicGraph1.getGraphRangeYMinAsInt();
- if (point == 3101)
- {
- point = 2900;
- dynamicGraph1.clear();
- }
- //int randomX = (randomish(tickCounter) % xIntervalSize) + staticGraph.getGraphRangeXMinAsInt();
- int randomX = point++;
- int randomY = (randomish(tickCounter) % yIntervalSize) + dynamicGraph1.getGraphRangeYMinAsInt();
- dynamicGraph1.addDataPoint(randomY);
- boxProgress1.setValue((point-2900)/2);
- /*staticGraph.addDataPoint(randomX, randomY);*/
- // Update Text with inserted point
- Unicode::snprintf(insertedPointTextBuffer, INSERTEDPOINTTEXT_SIZE, "(%i, %i)", randomX, randomY);
- insertedPointText.invalidate();
- }
- void Screen1View::clearGraph()
- {
- /* staticGraph.clear();*/
- dynamicGraph1.clear();
- }
- void Screen1View::handleTickEvent()
- {
- if (tickCounter++ % 2 == 0 && autoModeButton.getState())
- {
- addRandomPoint();
- }
實(shí)際顯示效果如下。
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評(píng)論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開(kāi)放投稿
- NRF52810藍(lán)牙數(shù)字耳機(jī)找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開(kāi)發(fā)
預(yù)算:¥1100000015小時(shí)前
- 12V汽車啟動(dòng)電源項(xiàng)目BMS設(shè)計(jì)
預(yù)算:¥50000023小時(shí)前
- 數(shù)據(jù)可視化軟件 開(kāi)發(fā)
預(yù)算:¥5000023小時(shí)前
- PLC項(xiàng)目調(diào)試修改
預(yù)算:¥100001天前
- 起動(dòng)電機(jī)控制器開(kāi)發(fā)
預(yù)算:¥1100001天前