首頁(yè) > 評(píng)測(cè) > 【STM32H750B-DK評(píng)測(cè)】電機(jī)轉(zhuǎn)速檢測(cè)UI

【STM32H750B-DK評(píng)測(cè)】電機(jī)轉(zhuǎn)速檢測(cè)UI

  
  • 作者:
  • 來(lái)源:
  • [導(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)化為速度值顯示。

  1. int point = 2900;
  2.  
  3. static uint16_t randomish(int32_t seed)
  4. {
  5.     static uint16_t last = 0;
  6.     const uint16_t num = (seed * (1337 + last)) % 0xFFFF;
  7.     last = num;
  8.     return num;
  9. }
  10.  
  11. Screen1View::Screen1View()
  12. {
  13.     tickCounter = 0;
  14.   /*  staticGraph.setTouchable(true);*/
  15.     dynamicGraph1.setTouchable(true);
  16. }
  17.  
  18. void Screen1View::setupScreen()
  19. {
  20.     Screen1ViewBase::setupScreen();
  21. }
  22.  
  23. void Screen1View::tearDownScreen()
  24. {
  25.     Screen1ViewBase::tearDownScreen();
  26. }
  27.  
  28. void Screen1View::addRandomPoint()
  29. {
  30.     int xIntervalSize = dynamicGraph1.getGraphRangeXMaxAsInt() - dynamicGraph1.getGraphRangeXMinAsInt();
  31.     int yIntervalSize = dynamicGraph1.getGraphRangeYMaxAsInt() - dynamicGraph1.getGraphRangeYMinAsInt();
  32.     if (point == 3101)
  33.     {
  34.         point = 2900;
  35.         dynamicGraph1.clear();
  36.     }
  37.     //int randomX = (randomish(tickCounter) % xIntervalSize) + staticGraph.getGraphRangeXMinAsInt();
  38.     int randomX = point++;
  39.     int randomY = (randomish(tickCounter) % yIntervalSize) + dynamicGraph1.getGraphRangeYMinAsInt();
  40.  
  41.     dynamicGraph1.addDataPoint(randomY);
  42.     boxProgress1.setValue((point-2900)/2);
  43.     /*staticGraph.addDataPoint(randomX, randomY);*/
  44.  
  45.     // Update Text with inserted point
  46.     Unicode::snprintf(insertedPointTextBuffer, INSERTEDPOINTTEXT_SIZE, "(%i, %i)", randomX, randomY);
  47.     insertedPointText.invalidate();
  48. }
  49.  
  50. void Screen1View::clearGraph()
  51. {
  52.    /* staticGraph.clear();*/
  53.     dynamicGraph1.clear();
  54. }
  55.  
  56. void Screen1View::handleTickEvent()
  57. {
  58.     if (tickCounter++ % 2 == 0 && autoModeButton.getState())
  59.     {
  60.         addRandomPoint();
  61.     }
  62.  
  63.  
復(fù)制代碼

實(shí)際顯示效果如下。

 

 

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評(píng)論

  • 聯(lián)系人:巧克力娃娃
  • 郵箱:board@21ic.com
  • 我要投稿
  • 歡迎入駐,開(kāi)放投稿

熱門標(biāo)簽
項(xiàng)目外包 more+