回答

收藏

[评测分享] 【DS100手持数字示波器】5.示波器也能做表白神器?

#板卡评测 #板卡评测 3456 人阅读 | 0 人回复 | 2022-12-10

前言
示波器除了用来测试平时的通信波形,信号频率,信号噪声等等之外,还可以使用XY模式来显示一些好玩的图形,本文将使用正点原子DS100示波器的XY时基模式来显示李萨如图像。
本文会使用示波器显示一个跳动的爱心,以及一些李萨如图像。
试验环境
   由于本文并没有信号发生器,而正点原子DS100自带的信号发生器也只能输出一路信号,所以我试用瑞萨的单片机的两路DAC信号作为信号源,用于测试XY时基下的图形显示,也就是显示好玩的李萨如图像。

信号源:瑞萨RA4M2单片机两路DAC,精度为12bit,最大输出值为4096,最大输出电压为3.3V
DS100:两路示波器信号输入,CHA作为X轴,CHB作为Y轴。

示波器设置为XY模式方式:
按下M见,滚动滚轮I选中时基模式,滚动滚轮II选中XY,然后再次按下M确定即可,见下图:
试验
1. 首先是测试单片机的DAC模块是否能够正常输出正弦信号,这是后面试验的基础,设置时基模式为ROLLO机会YT。
然后编写一个测试代码:如下:
  其中,sin(xxx) * 2048 + 2048的目的是将DAC输出信号编程一个正数。
  让DAC0输出正弦波,DAC1输出余弦波。
  其中time_cnt就是0~2π,每次的增长周期为0.05,没1毫秒增长一次,这样可以让波形看起来更新连续,如果需要增加进行精度,可以修改为更小的值。

实现原理
  因为DAC不能输出负电压,所以需要将sin计算出来的负数部分进行偏移,实现原理见下方代码,sin最小值为-1,所以将DAC输出值偏移2048,然后加上剩余值2048,当sin计算值-1的时候,DAC则输出0,当sin计算值为1的时候,DAC输出4096
  1. dac_value[0] = (uint16_t)(sin(time_cnt) * (float)2048) + 2048;
  2.                 dac_value[1] = (uint16_t)(sin(time_cnt + 0.5*PI_MATH) * (float)2048) + 2048;

  3.                 Adc_OutputVal(DAC_DAC0, dac_value[0]);
  4.                 Adc_OutputVal(DAC_DAC1, dac_value[1]);
复制代码

   效果如下图,效果很好,表示可以进行接下来的工作了。


2. 先来测试一下李萨如图像。
使用单片机输出两路DAC正弦信号,使用了C语言标准库的sin函数,两路正弦波信号有相位差,相位差为0的时候显示的是一条斜线,随着相位差增加,会变为一个椭圆,当相位差为π/2的时候就会显示成一个圆形,见下方图片以及视频。
(1)上述步骤一不变,只需要将时基模式切换为XY即可,就可以看到一个圆形,见下图:

(2)调整DAC0与DAC1输出正弦信号的相位差就可以改变李萨如图像为椭圆或者斜线,见下视频。
代码中只需要修改DAC1输出的信号的相位差即可,其中change应该随着时间变化,变化的周期自行编写,最好是一个完整的sin信号输出周期之后在改变,不然图形显示不完整。
  1. dac_value[1] = (uint16_t)(sin(time_cnt + change*PI_MATH) * (float)2048) + 2048;
复制代码
视频:
  (3)输出一个有大小可变的圆。
   设置DAC0与DAC1的输出正弦信号的相位差为π/2,然后修改输出信号的幅值就可以修改圆形的半径,其中半径R_circle为周期可变的
  代码实现:
  1. dac_value[0] = (uint16_t)(sin(time_cnt) * (float)R_circle) + R_circle;
  2.                 dac_value[1] = (uint16_t)(sin(time_cnt + 0.5*PI_MATH) * (float)R_circle) + R_circle;

  3.                 Adc_OutputVal(DAC_DAC0, dac_value[0]);
  4.                 Adc_OutputVal(DAC_DAC1, dac_value[1]);
  5.                
  6.                 if (time_cnt > PI_DOUBLE)
  7.                 {
  8.                         time_cnt = 0.0f;
  9.                        
  10.                         R_circle -= 20;
  11.                         if (R_circle <= 100)
  12.                                 R_circle = 2048;
  13.                 }
  14.                 else
  15.                 {
  16.                         time_cnt += 0.05f;
  17.                 }
复制代码

  视频效果:

3. 输出爱心
  现在才轮到本文的重点,输出一个跳动的爱心。知道了上面的原理之后,我们可以用sin以及cos输出一个爱心,计算公式如下:
x = 2*sin(t)+sin(2*t)
y = -(2*cos(t)+cos(2*t))
同上述原理,DAC不能输出负数,y轴最小值会输出-3,所以我们需要将DAC的输出值分成6分,用于抵消负数,实现代码如下。
需要注意的是,测试中需要自己调整示波器的刷新频率以及单片机输出信号的切换频率,让两者保持在一个平衡点之后,刷新出来的爱心跳动才会稳定,不然会有一个余辉影响视觉效果。
  1. /* 输出爱心 */
  2.                 double x = (2 * sin(time_cnt) + sin(2 * time_cnt));
  3.                 double y = (2 * cos(time_cnt) + cos(2 * time_cnt));

  4.                 dac_value[0] = 4096-((uint16_t)((x * (float)love_R) + (3*love_R)));
  5.                 dac_value[1] = 4096-((uint16_t)((y * (float)love_R) + (3*love_R)));

  6.                 Adc_OutputVal(DAC_DAC0, dac_value[0]);
  7.                 Adc_OutputVal(DAC_DAC1, dac_value[1]);
  8.                 if (time_cnt > PI_DOUBLE)
  9.                 {
  10.                         time_cnt = 0.0f;
  11.                        
  12.                         love_chane_t ++;
  13.                        
  14.                         if (love_chane_t > 10)
  15.                         {
  16.                                 love_chane_t = 0;
  17.                                 love_R = (love_flg == 0) ? (love_R - 40) : (love_R + 40);
  18.                                 love_flg ^= 1;
  19.                         }
  20.                 }
  21.                 else
  22.                 {
  23.                         time_cnt += 0.05f;
  24.                 }
复制代码

爱心图片:

演示视频:

总结
示波器能玩的的花样还很多,还有大神能够用示波器玩游戏,看视频,总之能玩出很多新花样。
正点原子DS100虽然小巧,但是功能真的是样样俱到,用了该示波器,很多开发中的为都可以快速解决了。


关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

876 积分
16 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条