【安富萊二代示波器教程】第8章 示波器設計—測量功能

第8章?????? ?示波器設計—測量功能

? ? 二代示波器測量功能實現比較簡單,使用2D函數繪制即可。不過也專門開辟一個章節,為大家做一個簡單的說明,方便理解。

8.1? ? 水平測量功能

8.2? ? ?垂直測量功能

8.3? ? ?總結

?

?

8.1? 水平測量功能

水平測量方式的效果如下:

?

水平測量功能的數據顯示不要以窗口的形式呈現,因為將窗口顯示在波形顯示區上會造成波形刷新慢。當前的方案是在繪制完畢波形后,直接2D函數繪制測量窗口,這種方式的實際效果好很多。對應的代碼如下:

/***********************************************************************************************************    函 數 名: DSO_DrawCursorH*    功能說明: 繪制示波器的水平測量游標,用于測量幅值。*    形    參: 無          *    返 回 值: 無**********************************************************************************************************/void DSO_DrawCursorH(void){char buf[60];/* 第1步:繪制用于測量的兩個游標線********************************************************/GUI_SetColor(0x0040f0);/* 繪制橫線A */GUI_DrawHLine(g_Cursors->sCursorHA, DSOSCREEN_STARTX, DSOSCREEN_ENDX);GUI_DrawHLine(g_Cursors->sCursorHA+1, DSOSCREEN_STARTX, DSOSCREEN_ENDX); GUI_FillRoundedRect(50, g_Cursors->sCursorHA+3, 61, g_Cursors->sCursorHA+18, 3);/* 繪制橫線B */GUI_DrawHLine(g_Cursors->sCursorHB, DSOSCREEN_STARTX, DSOSCREEN_ENDX);GUI_DrawHLine(g_Cursors->sCursorHB-1, DSOSCREEN_STARTX, DSOSCREEN_ENDX); GUI_FillRoundedRect(50, g_Cursors->sCursorHB-18, 61, g_Cursors->sCursorHB-3, 3);/* 在橫線A和橫線B旁邊的小圓圈中顯示字母a和字母b */GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_Font20_ASCII);GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   GUI_DispCharAt('a', 51, g_Cursors->sCursorHA);GUI_DispCharAt('b', 51, g_Cursors->sCursorHB-19);/* 第2步:繪制游標數據顯示窗口********************************************************/GUI_SetColor(GUI_BLACK);GUI_FillRoundedRect(500, 55, 635, 135, 4);GUI_SetColor(GUI_WHITE);GUI_DrawRoundedRect( 499, 54, 636, 136, 4);GUI_SetColor(0x0040f0);GUI_FillRoundedRect(75 + 433 , 47 + 15, 86 + 433, 62 + 15, 3);                GUI_FillRoundedRect(75 + 433 , 45 + 45, 86 + 433, 60 + 45, 3);GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_Font20_1);GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   GUI_DispCharAt('a', 509, 59);GUI_DispCharAt('b', 509, 88);GUI_SetColor(GUI_YELLOW);GUI_SetFont(&GUI_Font16_1);GUI_DispCharAt('#', 511, 115);/* 第3步:計算豎線線A的數值***********************************************************/g_Cursors->WaveCursorA = (float)((g_Cursors->sCursorVA - 340) * g_CursorUintTable[TimeBaseId][0])/1000;if(g_CursorUintTable[TimeBaseId][1] == 1){sprintf(buf, "%5.1fus", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 2){sprintf(buf, "%5.3fms", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 3){sprintf(buf, "%5.2fms", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 4){sprintf(buf, "%5.1fms", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 5){sprintf(buf, "%5.3fs", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 6){sprintf(buf, "%5.2fs", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 7){sprintf(buf, "%5.1fs", g_Cursors->WaveCursorA);}GUI_DispStringAt(buf, 523, 63);/* 第3步:計算豎線線B的數值***********************************************************/g_Cursors->WaveCursorB = (float)((g_Cursors->sCursorVB - 340) * g_CursorUintTable[TimeBaseId][0])/1000;if(g_CursorUintTable[TimeBaseId][1] == 1){sprintf(buf, "%5.1fus", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 2){sprintf(buf, "%5.3fms", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 3){sprintf(buf, "%5.2fms", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 4){sprintf(buf, "%5.1fms", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 5){sprintf(buf, "%5.3fs", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 6){sprintf(buf, "%5.2fs", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 7){sprintf(buf, "%5.1fs", g_Cursors->WaveCursorB);}GUI_DispStringAt(buf, 523, 91);/* 第5步:計算豎線A豎線B的差值***********************************************************/if(g_CursorUintTable[TimeBaseId][1] == 1){sprintf(buf, "%5.1fus", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 2){sprintf(buf, "%5.3fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 3){sprintf(buf, "%5.2fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 4){sprintf(buf, "%5.1fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 5){sprintf(buf, "%5.3fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 6){sprintf(buf, "%5.2fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 7){sprintf(buf, "%5.1fs",(g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}GUI_DispStringAt(buf, 523, 115);/* 第6步:顯示水平線的計算數值***********************************************************/GUI_DispCharAt('#', 509+72, 115);g_Cursors->WaveCursorA = (float)((240 - g_Cursors->sCursorHA) * g_AttTable[Ch1AmpId][1]) / 50000;sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA);GUI_DispStringAt(buf, 518+72, 63);g_Cursors->WaveCursorB = (float)((240 - g_Cursors->sCursorHB) * g_AttTable[Ch1AmpId][1]) / 50000;sprintf(buf, "%5.3fV", g_Cursors->WaveCursorB);   GUI_DispStringAt(buf, 518+70, 91);sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA - g_Cursors->WaveCursorB);GUI_DispStringAt(buf, 520+70, 115);}

水平測量的實現比較簡單,就是2D函數調用和字符顯示。如果大家要自己實現,按照代碼中注釋的步驟制作即可。測量功能的調節是通過開發板上面的搖桿實現的。

8.2? ?垂直測量功能

垂直測量方式的效果如下:

?

垂直測量功能的數據顯示不要以窗口的形式呈現,因為將窗口顯示在波形顯示區上會造成波形刷新慢。當前的方案是在繪制完畢波形后,直接2D函數繪制測量窗口,這種方式的實際效果好很多。對應的代碼如下:

/***********************************************************************************************************    函 數 名: DSO_DrawCursorV*    功能說明: 繪制示波器的垂直測量游標,用于測量的時間。*    形    參: 無          *    返 回 值: 無**********************************************************************************************************/void DSO_DrawCursorV(void){char buf[60];/* 第1步:繪制用于測量的兩個游標線********************************************************/GUI_SetColor(0x0040f0);/* 繪制豎線A */GUI_DrawVLine(g_Cursors->sCursorVA, DSOSCREEN_STARTY, DSOSCREEN_ENDY);GUI_DrawVLine(g_Cursors->sCursorVA+1, DSOSCREEN_STARTY, DSOSCREEN_ENDY); GUI_FillRoundedRect(g_Cursors->sCursorVA+5, 47, g_Cursors->sCursorVA+16, 62, 3);/* 繪制豎線B */GUI_DrawVLine(g_Cursors->sCursorVB, DSOSCREEN_STARTY, DSOSCREEN_ENDY);GUI_DrawVLine(g_Cursors->sCursorVB-1, DSOSCREEN_STARTY, DSOSCREEN_ENDY);GUI_FillRoundedRect(g_Cursors->sCursorVB-16, 47, g_Cursors->sCursorVB-5, 62, 3);/* 在豎線A和豎線B旁邊的小圓圈中顯示字母a和字母b */GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_Font20_ASCII);GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   GUI_DispCharAt('a', g_Cursors->sCursorVA+6, 44);GUI_DispCharAt('b', g_Cursors->sCursorVB-15, 45);/* 第2步:繪制游標數據顯示窗口********************************************************/GUI_SetColor(GUI_BLACK);GUI_FillRoundedRect(500, 55, 635, 135, 4);GUI_SetColor(GUI_WHITE);GUI_DrawRoundedRect( 499, 54, 636, 136, 4);GUI_SetColor(0x0040f0);GUI_FillRoundedRect(75 + 433 , 47 + 15, 86 + 433, 62 + 15, 3);                GUI_FillRoundedRect(75 + 433 , 45 + 45, 86 + 433, 60 + 45, 3);GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_Font20_1);GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   GUI_DispCharAt('a', 509, 59);GUI_DispCharAt('b', 509, 88);GUI_SetColor(GUI_YELLOW);GUI_SetFont(&GUI_Font16_1);GUI_DispCharAt('#', 513, 115);/* 第3步:計算豎線A的數值***********************************************************/g_Cursors->WaveCursorA = (float)((g_Cursors->sCursorVA - 340) * g_CursorUintTable[TimeBaseId][0])/1000;if(g_CursorUintTable[TimeBaseId][1] == 1){sprintf(buf, "%5.1fus", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 2){sprintf(buf, "%5.3fms", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 3){sprintf(buf, "%5.2fms", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 4){sprintf(buf, "%5.1fms", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 5){sprintf(buf, "%5.3fs", g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 6){sprintf(buf, "%5.2fs",g_Cursors->WaveCursorA);}else if(g_CursorUintTable[TimeBaseId][1] == 7){sprintf(buf, "%5.1fs", g_Cursors->WaveCursorA);}/* 顯示豎線A數值 */GUI_DispStringAt(buf, 523, 63);/* 第4步:計算豎線B的數值***********************************************************/g_Cursors->WaveCursorB = (float)((g_Cursors->sCursorVB - 340) * g_CursorUintTable[TimeBaseId][0])/1000;if(g_CursorUintTable[TimeBaseId][1] == 1){sprintf(buf, "%5.1fus", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 2){sprintf(buf, "%5.3fms", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 3){sprintf(buf, "%5.2fms", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 4){sprintf(buf, "%5.1fms", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 5){sprintf(buf, "%5.3fs", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 6){sprintf(buf, "%5.2fs", g_Cursors->WaveCursorB);}else if(g_CursorUintTable[TimeBaseId][1] == 7){sprintf(buf, "%5.1fs", g_Cursors->WaveCursorB);}/* 顯示豎線B數值 */GUI_DispStringAt(buf, 523, 91);/* 第5步:計算豎線A豎線B的差值***********************************************************/if(g_CursorUintTable[TimeBaseId][1] == 1){sprintf(buf, "%5.1fus", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 2){sprintf(buf, "%5.3fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 3){sprintf(buf, "%5.2fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 4){sprintf(buf, "%5.1fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 5){sprintf(buf, "%5.3fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 6){sprintf(buf, "%5.2fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}else if(g_CursorUintTable[TimeBaseId][1] == 7){sprintf(buf, "%5.1fs",(g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));}/* 顯示豎線A和豎線B的差值 */GUI_DispStringAt(buf, 523, 115);/* 第6步:顯示水平線的計算數值***********************************************************/GUI_DispCharAt('#', 509+72, 115);g_Cursors->WaveCursorA = (float)((240 - g_Cursors->sCursorHA) * g_AttTable[Ch1AmpId][1]) / 50000;sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA);GUI_DispStringAt(buf, 518+72, 63);g_Cursors->WaveCursorB = (float)((240 - g_Cursors->sCursorHB) * g_AttTable[Ch1AmpId][1]) / 50000;sprintf(buf, "%5.3fV", g_Cursors->WaveCursorB);   GUI_DispStringAt(buf, 518+70, 91);sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA - g_Cursors->WaveCursorB);GUI_DispStringAt(buf, 520+70, 115);}

垂直測量的實現比較簡單,就是2D函數調用和字符顯示。如果大家要自己實現,按照代碼中注釋的步驟制作即可。測量功能的調節是通過開發板上面的搖桿實現的。

8.3? ?總結

由于測量功能的實現比較簡單,所以我們這里只是簡單的進行了說明。如果大家要自己制作的話,建議實際操作下。

?

轉載于:https://www.cnblogs.com/armfly/p/9253918.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習數據更換背景_開始學習數據科學的最佳方法是了解其背景

深度學習數據更換背景數據科學教育 (DATA SCIENCE EDUCATION) 目錄 (Table of Contents) The Importance of Context Knowledge 情境知識的重要性 (Optional) Research Supporting Context-Based Learning (可選)研究支持基于上下文的學習 The Context of Data Science 數據科學…

熊貓數據集_用熊貓掌握數據聚合

熊貓數據集Data aggregation is the process of gathering data and expressing it in a summary form. This typically corresponds to summary statistics for numerical and categorical variables in a data set. In this post we will discuss how to aggregate data usin…

IOS CALayer的屬性和使用

一、CALayer的常用屬性 1、propertyCGPoint position; 圖層中心點的位置,類似與UIView的center;用來設置CALayer在父層中的位置;以父層的左上角為原點(0,0); 2、 property CGPoint anchorPoint…

GridView詳解

快速預覽:GridView無代碼分頁排序GridView選中,編輯,取消,刪除GridView正反雙向排序GridView和下拉菜單DropDownList結合GridView和CheckBox結合鼠標移到GridView某一行時改變該行的背景色方法一鼠標移到GridView某一行時改變該行…

訪問模型參數,初始化模型參數,共享模型參數方法

一. 訪問模型參數 對于使用Sequential類構造的神經網絡,我們可以通過方括號[]來訪問網絡的任一層。回憶一下上一節中提到的Sequential類與Block類的繼承關系。 對于Sequential實例中含模型參數的層,我們可以通過Block類的params屬性來訪問該層包含的所有…

QZEZ第一屆“飯吉圓”杯程序設計競賽

終于到了飯吉圓杯的開賽,這是EZ我參與的歷史上第一場ACM賽制的題目然而沒有罰時 不過題目很好,舉辦地也很成功,為法老點贊!!! 這次和翰爺,吳駿達 dalao,陳樂揚dalao組的隊&#xff0…

談談數據分析 caoz_讓我們談談開放數據…

談談數據分析 caozAccording to the International Open Data Charter(1), it defines open data as those digital data that are made available with the technical and legal characteristics necessary so that they can be freely used, reused and redistributed by any…

數據創造價值_展示數據并創造價值

數據創造價值To create the maximum value, urgency, and leverage in a data partnership, you must present the data available for sale or partnership in a clear and comprehensive way. Partnerships are based upon the concept that you are offering value for valu…

Java入門系列-22-IO流

File類的使用 Java程序如何訪問文件?通過 java.io.File 類 使用File類需要先創建文件對象 File filenew File(String pathname);,創建時在構造函數中指定物理文件或目錄,然后通過文件對象的方法操作文件或目錄的屬性。 \ 是特殊字符&#xff…

缺了一部分

學Java好多年,也參與一次完整項目,覺得讓自己寫項目寫不出來,總覺得缺了一部分。 在這方面愚笨,不知道缺在哪里。以前覺得是知識不夠牢固,于是重復去學,發現就那些東西。如果沒有業務來熟悉的話&#xff0c…

卷積神經網絡——各種網絡的簡潔介紹和實現

各種網絡模型:來源《動手學深度學習》 一,卷積神經網絡(LeNet) LeNet分為卷積層塊和全連接層塊兩個部分。下面我們分別介紹這兩個模塊。 卷積層塊里的基本單位是卷積層后接最大池化層:卷積層用來識別圖像里的空間模…

數據中臺是下一代大數據_全棧數據科學:下一代數據科學家群體

數據中臺是下一代大數據重點 (Top highlight)Data science has been an eye-catching field for many years now to young individuals having formal education with a bachelors, masters or Ph.D. in computer science, statistics, business analytics, engineering manage…

net如何判斷瀏覽器的類別

回復:.net如何判斷瀏覽器的類別?瀏覽器型號:Request.Browser.Type 瀏覽器名稱:Request.Browser.browser 瀏覽器版本:Request.Browser.Version 瀏覽器Cookie:Request.Browser.Cookies 你的操作系統:Request…

AVS 端能力模塊

Mark 轉載于:https://www.cnblogs.com/clxye/p/9939333.html

pwn學習之四

本來以為應該能出一兩道ctf的pwn了,結果又被sctf打擊了一波。 bufoverflow_a 做這題時libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete會清0變量導致無法寫,一直沒構造出unsorted bin attack,后面根…

優化算法的簡潔實現

動量法 思想: 動量法使用了指數加權移動平均的思想。它將過去時間步的梯度做了加權平均,且權重按時間步指數衰減。 代碼: 在Gluon中,只需要在Trainer實例中通過momentum來指定動量超參數即可使用動量法。 d2l.train_gluon_ch7…

北方工業大學gpa計算_北方大學聯盟倉庫的探索性分析

北方工業大學gpa計算This is my firts publication here and i will start simple.這是我的第一篇出版物,這里我將簡單介紹 。 I want to make an exploratory data analysis of UFRN’s warehouse and answer some questions about the data using Python and Pow…

泰坦尼克數據集預測分析_探索性數據分析-泰坦尼克號數據集案例研究(第二部分)

泰坦尼克數據集預測分析Data is simply useless until you don’t know what it’s trying to tell you.除非您不知道數據在試圖告訴您什么,否則數據將毫無用處。 With this quote we’ll continue on our quest to find the hidden secrets of the Titanic. ‘The …

各種數據庫連接的總結

SQL數據庫的連接 return new SqlConnection("server127.0.0.1;databasepart;uidsa;pwd;"); oracle連接字符串 OracleConnection oCnn new OracleConnection("Data SourceORCL_SERVER;USERM70;PASSWORDmmm;");oledb連接數據庫return new OleDbConnection…

關于我

我是誰? Who am I?這是個哲學問題。。 簡單來說,我是Light,一個靠前端吃飯,又不想單單靠前端吃飯的Coder。 用以下幾點稍微給自己打下標簽: 工作了兩三年,對,我是16年畢業的90后一直…