zoukankan      html  css  js  c++  java
  • 【安富莱二代示波器教程】第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   总结

    由于测量功能的实现比较简单,所以我们这里只是简单的进行了说明。如果大家要自己制作的话,建议实际操作下。

  • 相关阅读:
    PAT 乙级 1012 数字分类 (20) C++版
    PAT 乙级 1026 程序运行时间(15) C++版
    PAT 乙级 1009 说反话 (20) C++版
    PAT 乙级 1042 字符统计(20) C++版
    PAT 乙级 1046 划拳(15) C++版
    PAT 乙级 1063 计算谱半径(20) C++版
    CentOS安装oracle12C
    linux端口详解
    yum提示字符编码错误
    securecrt中文乱码
  • 原文地址:https://www.cnblogs.com/armfly/p/9253918.html
Copyright © 2011-2022 走看看