第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? ?總結
由于測量功能的實現比較簡單,所以我們這里只是簡單的進行了說明。如果大家要自己制作的話,建議實際操作下。
?