硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1418|回复: 2
收起左侧

【安富莱二代示波器教程】第8章 示波器设计—测量功能

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2018-7-2 14:59:38 | 显示全部楼层 |阅读模式
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=45785


第8章        示波器设计—测量功能

    二代示波器测量功能实现比较简单,使用2D函数绘制即可。不过也专门开辟一个章节,为大家做一个简单的说明,方便理解。
    8.1    水平测量功能
    8.2    垂直测量功能
    8.3     总结

8.1  水平测量功能
    水平测量方式的效果如下:
8.1.png
                              
水平测量功能的数据显示不要以窗口的形式呈现,因为将窗口显示在波形显示区上会造成波形刷新慢。当前的方案是在绘制完毕波形后,直接2D函数绘制测量窗口,这种方式的实际效果好很多。对应的代码如下:
  1. /*

  2. *********************************************************************************************************

  3. *    函 数 名: DSO_DrawCursorH

  4. *    功能说明: 绘制示波器的水平测量游标,用于测量幅值。

  5. *    形    参: 无         

  6. *    返 回 值: 无

  7. *********************************************************************************************************

  8. */

  9. void DSO_DrawCursorH(void)

  10. {

  11.      char buf[60];

  12.    

  13.      /* 第1步:绘制用于测量的两个游标线********************************************************/

  14.      GUI_SetColor(0x0040f0);

  15.    

  16.      /* 绘制横线A */

  17.      GUI_DrawHLine(g_Cursors->sCursorHA, DSOSCREEN_STARTX, DSOSCREEN_ENDX);

  18.      GUI_DrawHLine(g_Cursors->sCursorHA+1, DSOSCREEN_STARTX, DSOSCREEN_ENDX);

  19.      GUI_FillRoundedRect(50, g_Cursors->sCursorHA+3, 61, g_Cursors->sCursorHA+18, 3);



  20.      /* 绘制横线B */

  21.      GUI_DrawHLine(g_Cursors->sCursorHB, DSOSCREEN_STARTX, DSOSCREEN_ENDX);

  22.      GUI_DrawHLine(g_Cursors->sCursorHB-1, DSOSCREEN_STARTX, DSOSCREEN_ENDX);

  23.      GUI_FillRoundedRect(50, g_Cursors->sCursorHB-18, 61, g_Cursors->sCursorHB-3, 3);

  24.    

  25.      /* 在横线A和横线B旁边的小圆圈中显示字母a和字母b */

  26.      GUI_SetColor(GUI_BLACK);

  27.      GUI_SetFont(&GUI_Font20_ASCII);

  28.      GUI_SetTextMode(GUI_TEXTMODE_TRANS);                  

  29.      GUI_DispCharAt('a', 51, g_Cursors->sCursorHA);

  30.      GUI_DispCharAt('b', 51, g_Cursors->sCursorHB-19);

  31.    

  32.      /* 第2步:绘制游标数据显示窗口********************************************************/

  33.      GUI_SetColor(GUI_BLACK);

  34.      GUI_FillRoundedRect(500, 55, 635, 135, 4);

  35.      GUI_SetColor(GUI_WHITE);

  36.      GUI_DrawRoundedRect( 499, 54, 636, 136, 4);

  37.                              

  38.      GUI_SetColor(0x0040f0);

  39.      GUI_FillRoundedRect(75 + 433 , 47 + 15, 86 + 433, 62 + 15, 3);               

  40.      GUI_FillRoundedRect(75 + 433 , 45 + 45, 86 + 433, 60 + 45, 3);

  41.                              

  42.      GUI_SetColor(GUI_BLACK);

  43.      GUI_SetFont(&GUI_Font20_1);

  44.      GUI_SetTextMode(GUI_TEXTMODE_TRANS);                  

  45.      GUI_DispCharAt('a', 509, 59);

  46.      GUI_DispCharAt('b', 509, 88);

  47.    

  48.      GUI_SetColor(GUI_YELLOW);

  49.      GUI_SetFont(&GUI_Font16_1);

  50.      GUI_DispCharAt('#', 511, 115);



  51.      /* 第3步:计算竖线线A的数值***********************************************************/

  52.      g_Cursors->WaveCursorA = (float)((g_Cursors->sCursorVA - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

  53.      if(g_CursorUintTable[TimeBaseId][1] == 1)

  54.      {

  55.          sprintf(buf, "%5.1fus", g_Cursors->WaveCursorA);

  56.      }

  57.      else if(g_CursorUintTable[TimeBaseId][1] == 2)

  58.      {

  59.          sprintf(buf, "%5.3fms", g_Cursors->WaveCursorA);

  60.      }

  61.      else if(g_CursorUintTable[TimeBaseId][1] == 3)

  62.      {

  63.          sprintf(buf, "%5.2fms", g_Cursors->WaveCursorA);

  64.      }

  65.      else if(g_CursorUintTable[TimeBaseId][1] == 4)

  66.      {

  67.          sprintf(buf, "%5.1fms", g_Cursors->WaveCursorA);

  68.      }

  69.      else if(g_CursorUintTable[TimeBaseId][1] == 5)

  70.      {

  71.          sprintf(buf, "%5.3fs", g_Cursors->WaveCursorA);

  72.      }

  73.      else if(g_CursorUintTable[TimeBaseId][1] == 6)

  74.      {

  75.          sprintf(buf, "%5.2fs", g_Cursors->WaveCursorA);

  76.      }

  77.      else if(g_CursorUintTable[TimeBaseId][1] == 7)

  78.      {

  79.          sprintf(buf, "%5.1fs", g_Cursors->WaveCursorA);

  80.      }



  81.      GUI_DispStringAt(buf, 523, 63);

  82.    

  83.      /* 第3步:计算竖线线B的数值***********************************************************/

  84.      g_Cursors->WaveCursorB = (float)((g_Cursors->sCursorVB - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

  85.      if(g_CursorUintTable[TimeBaseId][1] == 1)

  86.      {

  87.          sprintf(buf, "%5.1fus", g_Cursors->WaveCursorB);

  88.      }

  89.      else if(g_CursorUintTable[TimeBaseId][1] == 2)

  90.      {

  91.          sprintf(buf, "%5.3fms", g_Cursors->WaveCursorB);

  92.      }

  93.      else if(g_CursorUintTable[TimeBaseId][1] == 3)

  94.      {

  95.           sprintf(buf, "%5.2fms", g_Cursors->WaveCursorB);

  96.      }

  97.      else if(g_CursorUintTable[TimeBaseId][1] == 4)

  98.      {

  99.          sprintf(buf, "%5.1fms", g_Cursors->WaveCursorB);

  100.      }

  101.      else if(g_CursorUintTable[TimeBaseId][1] == 5)

  102.      {

  103.          sprintf(buf, "%5.3fs", g_Cursors->WaveCursorB);

  104.      }

  105.      else if(g_CursorUintTable[TimeBaseId][1] == 6)

  106.      {

  107.          sprintf(buf, "%5.2fs", g_Cursors->WaveCursorB);

  108.      }

  109.      else if(g_CursorUintTable[TimeBaseId][1] == 7)

  110.      {

  111.          sprintf(buf, "%5.1fs", g_Cursors->WaveCursorB);

  112.      }

  113.      GUI_DispStringAt(buf, 523, 91);

  114.    

  115.    

  116.      /* 第5步:计算竖线A竖线B的差值***********************************************************/

  117.      if(g_CursorUintTable[TimeBaseId][1] == 1)

  118.      {

  119.          sprintf(buf, "%5.1fus", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  120.      }

  121.      else if(g_CursorUintTable[TimeBaseId][1] == 2)

  122.      {

  123.          sprintf(buf, "%5.3fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  124.      }

  125.      else if(g_CursorUintTable[TimeBaseId][1] == 3)

  126.      {

  127.          sprintf(buf, "%5.2fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  128.      }

  129.      else if(g_CursorUintTable[TimeBaseId][1] == 4)

  130.      {

  131.          sprintf(buf, "%5.1fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  132.      }

  133.          else if(g_CursorUintTable[TimeBaseId][1] == 5)

  134.      {

  135.          sprintf(buf, "%5.3fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  136.      }

  137.      else if(g_CursorUintTable[TimeBaseId][1] == 6)

  138.      {

  139.          sprintf(buf, "%5.2fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  140.      }

  141.      else if(g_CursorUintTable[TimeBaseId][1] == 7)

  142.      {

  143.          sprintf(buf, "%5.1fs",(g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  144.      }

  145.      GUI_DispStringAt(buf, 523, 115);

  146.    

  147.      /* 第6步:显示水平线的计算数值***********************************************************/

  148.      GUI_DispCharAt('#', 509+72, 115);



  149.      g_Cursors->WaveCursorA = (float)((240 - g_Cursors->sCursorHA) * g_AttTable[Ch1AmpId][1]) / 50000;

  150.      sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA);

  151.      GUI_DispStringAt(buf, 518+72, 63);

  152.    

  153.      g_Cursors->WaveCursorB = (float)((240 - g_Cursors->sCursorHB) * g_AttTable[Ch1AmpId][1]) / 50000;

  154.      sprintf(buf, "%5.3fV", g_Cursors->WaveCursorB);   

  155.      GUI_DispStringAt(buf, 518+70, 91);

  156.    

  157.      sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA - g_Cursors->WaveCursorB);

  158.      GUI_DispStringAt(buf, 520+70, 115);

  159. }
复制代码
水平测量的实现比较简单,就是2D函数调用和字符显示。如果大家要自己实现,按照代码中注释的步骤制作即可。测量功能的调节是通过开发板上面的摇杆实现的。


努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2018-7-2 15:00:54 | 显示全部楼层
8.2   垂直测量功能
    垂直测量方式的效果如下:
8.2.png
                              
垂直测量功能的数据显示不要以窗口的形式呈现,因为将窗口显示在波形显示区上会造成波形刷新慢。当前的方案是在绘制完毕波形后,直接2D函数绘制测量窗口,这种方式的实际效果好很多。对应的代码如下:
  1. /*

  2. *********************************************************************************************************

  3. *    函 数 名: DSO_DrawCursorV

  4. *    功能说明: 绘制示波器的垂直测量游标,用于测量的时间。

  5. *    形    参: 无         

  6. *    返 回 值: 无

  7. *********************************************************************************************************

  8. */

  9. void DSO_DrawCursorV(void)

  10. {

  11.      char buf[60];

  12.    

  13.      /* 第1步:绘制用于测量的两个游标线********************************************************/

  14.      GUI_SetColor(0x0040f0);

  15.    

  16.      /* 绘制竖线A */

  17.      GUI_DrawVLine(g_Cursors->sCursorVA, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

  18.      GUI_DrawVLine(g_Cursors->sCursorVA+1, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

  19.      GUI_FillRoundedRect(g_Cursors->sCursorVA+5, 47, g_Cursors->sCursorVA+16, 62, 3);



  20.      /* 绘制竖线B */

  21.      GUI_DrawVLine(g_Cursors->sCursorVB, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

  22.      GUI_DrawVLine(g_Cursors->sCursorVB-1, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

  23.      GUI_FillRoundedRect(g_Cursors->sCursorVB-16, 47, g_Cursors->sCursorVB-5, 62, 3);

  24.    

  25.      /* 在竖线A和竖线B旁边的小圆圈中显示字母a和字母b */

  26.      GUI_SetColor(GUI_BLACK);

  27.      GUI_SetFont(&GUI_Font20_ASCII);

  28.      GUI_SetTextMode(GUI_TEXTMODE_TRANS);                  

  29.      GUI_DispCharAt('a', g_Cursors->sCursorVA+6, 44);

  30.      GUI_DispCharAt('b', g_Cursors->sCursorVB-15, 45);



  31.      /* 第2步:绘制游标数据显示窗口********************************************************/

  32.      GUI_SetColor(GUI_BLACK);

  33.      GUI_FillRoundedRect(500, 55, 635, 135, 4);

  34.      GUI_SetColor(GUI_WHITE);

  35.      GUI_DrawRoundedRect( 499, 54, 636, 136, 4);

  36.                         

  37.      GUI_SetColor(0x0040f0);

  38.      GUI_FillRoundedRect(75 + 433 , 47 + 15, 86 + 433, 62 + 15, 3);               

  39.      GUI_FillRoundedRect(75 + 433 , 45 + 45, 86 + 433, 60 + 45, 3);

  40.                         

  41.      GUI_SetColor(GUI_BLACK);

  42.      GUI_SetFont(&GUI_Font20_1);

  43.      GUI_SetTextMode(GUI_TEXTMODE_TRANS);                  

  44.      GUI_DispCharAt('a', 509, 59);

  45.      GUI_DispCharAt('b', 509, 88);



  46.      GUI_SetColor(GUI_YELLOW);

  47.      GUI_SetFont(&GUI_Font16_1);

  48.      GUI_DispCharAt('#', 513, 115);



  49.      /* 第3步:计算竖线A的数值***********************************************************/

  50.      g_Cursors->WaveCursorA = (float)((g_Cursors->sCursorVA - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

  51.      if(g_CursorUintTable[TimeBaseId][1] == 1)

  52.      {

  53.          sprintf(buf, "%5.1fus", g_Cursors->WaveCursorA);

  54.      }

  55.      else if(g_CursorUintTable[TimeBaseId][1] == 2)

  56.      {

  57.          sprintf(buf, "%5.3fms", g_Cursors->WaveCursorA);

  58.      }

  59.      else if(g_CursorUintTable[TimeBaseId][1] == 3)

  60.      {

  61.          sprintf(buf, "%5.2fms", g_Cursors->WaveCursorA);

  62.      }

  63.      else if(g_CursorUintTable[TimeBaseId][1] == 4)

  64.      {

  65.          sprintf(buf, "%5.1fms", g_Cursors->WaveCursorA);

  66.      }

  67.      else if(g_CursorUintTable[TimeBaseId][1] == 5)

  68.      {

  69.           sprintf(buf, "%5.3fs", g_Cursors->WaveCursorA);

  70.      }

  71.      else if(g_CursorUintTable[TimeBaseId][1] == 6)

  72.      {

  73.          sprintf(buf, "%5.2fs",g_Cursors->WaveCursorA);

  74.      }

  75.      else if(g_CursorUintTable[TimeBaseId][1] == 7)

  76.      {

  77.          sprintf(buf, "%5.1fs", g_Cursors->WaveCursorA);

  78.      }



  79.      /* 显示竖线A数值 */

  80.      GUI_DispStringAt(buf, 523, 63);



  81.      /* 第4步:计算竖线B的数值***********************************************************/

  82.      g_Cursors->WaveCursorB = (float)((g_Cursors->sCursorVB - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

  83.      if(g_CursorUintTable[TimeBaseId][1] == 1)

  84.      {

  85.          sprintf(buf, "%5.1fus", g_Cursors->WaveCursorB);

  86.      }

  87.      else if(g_CursorUintTable[TimeBaseId][1] == 2)

  88.      {

  89.          sprintf(buf, "%5.3fms", g_Cursors->WaveCursorB);

  90.      }

  91.      else if(g_CursorUintTable[TimeBaseId][1] == 3)

  92.      {

  93.           sprintf(buf, "%5.2fms", g_Cursors->WaveCursorB);

  94.      }

  95.      else if(g_CursorUintTable[TimeBaseId][1] == 4)

  96.      {

  97.          sprintf(buf, "%5.1fms", g_Cursors->WaveCursorB);

  98.      }

  99.      else if(g_CursorUintTable[TimeBaseId][1] == 5)

  100.      {

  101.          sprintf(buf, "%5.3fs", g_Cursors->WaveCursorB);

  102.      }

  103.      else if(g_CursorUintTable[TimeBaseId][1] == 6)

  104.      {

  105.          sprintf(buf, "%5.2fs", g_Cursors->WaveCursorB);

  106.      }

  107.      else if(g_CursorUintTable[TimeBaseId][1] == 7)

  108.      {

  109.          sprintf(buf, "%5.1fs", g_Cursors->WaveCursorB);

  110.      }

  111.    

  112.      /* 显示竖线B数值 */

  113.      GUI_DispStringAt(buf, 523, 91);



  114.      /* 第5步:计算竖线A竖线B的差值***********************************************************/

  115.      if(g_CursorUintTable[TimeBaseId][1] == 1)

  116.      {

  117.          sprintf(buf, "%5.1fus", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  118.      }

  119.      else if(g_CursorUintTable[TimeBaseId][1] == 2)

  120.      {

  121.          sprintf(buf, "%5.3fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  122.      }

  123.      else if(g_CursorUintTable[TimeBaseId][1] == 3)

  124.      {

  125.          sprintf(buf, "%5.2fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  126.      }

  127.      else if(g_CursorUintTable[TimeBaseId][1] == 4)

  128.      {

  129.          sprintf(buf, "%5.1fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  130.      }

  131.      else if(g_CursorUintTable[TimeBaseId][1] == 5)

  132.      {

  133.          sprintf(buf, "%5.3fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  134.      }

  135.      else if(g_CursorUintTable[TimeBaseId][1] == 6)

  136.      {

  137.          sprintf(buf, "%5.2fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  138.      }

  139.      else if(g_CursorUintTable[TimeBaseId][1] == 7)

  140.      {

  141.          sprintf(buf, "%5.1fs",(g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

  142.      }

  143.    

  144.      /* 显示竖线A和竖线B的差值 */

  145.      GUI_DispStringAt(buf, 523, 115);



  146.      /* 第6步:显示水平线的计算数值***********************************************************/

  147.      GUI_DispCharAt('#', 509+72, 115);



  148.      g_Cursors->WaveCursorA = (float)((240 - g_Cursors->sCursorHA) * g_AttTable[Ch1AmpId][1]) / 50000;

  149.      sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA);

  150.      GUI_DispStringAt(buf, 518+72, 63);



  151.      g_Cursors->WaveCursorB = (float)((240 - g_Cursors->sCursorHB) * g_AttTable[Ch1AmpId][1]) / 50000;

  152.      sprintf(buf, "%5.3fV", g_Cursors->WaveCursorB);   

  153.      GUI_DispStringAt(buf, 518+70, 91);



  154.      sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA - g_Cursors->WaveCursorB);

  155.      GUI_DispStringAt(buf, 520+70, 115);

  156. }
复制代码
垂直测量的实现比较简单,就是2D函数调用和字符显示。如果大家要自己实现,按照代码中注释的步骤制作即可。测量功能的调节是通过开发板上面的摇杆实现的。

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2018-7-2 15:01:18 | 显示全部楼层
8.3   总结
    由于测量功能的实现比较简单,所以我们这里只是简单的进行了说明。如果大家要自己制作的话,建议实际操作下。

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 23:20 , Processed in 0.185930 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表