mini DSO STC15 开源示波器

2022-02-09 11:23:48 浏览数 (1)

没有哪个蓝孩子可以抵挡住一个示波器的诱惑,如果有,那就再加一台网络矢量分析仪。

阿巴阿巴,比如这个6W的示波器,我好喜欢

还有范老师给我测得电源纹波

今天带来的是一个卖79元的示波器,自己做估计20?25?搁我手里有啥不可能的,emmmm

多说无益,上图:

就是这个样子的

加外壳

背面

侧面

若干功能

如果不想折腾的,真的可以去买,79 嘛,又不贵。

这是初代的样子

这是用的元件

连线图

这个是接口图,看的更清晰

分压电路,不然你以为30V怎么测量的

阿巴阿巴,烧

编码器就完成了所有的逻辑,喜欢

和示波器的波形的比较

屏幕还是很亮的

keil编译

还有操作逻辑:

操作说明:

主界面-选项设置模式:

单击编码器:切换开始/暂停采样

双击编码器:切换波形水平滚动模式/选项设置模式

长按编码器:进入设置界面

旋转编码器:修改当前参数

按下同时旋转编码器:在参数间切换

主界面-波形水平滚动模式:

单击编码器:切换开始/暂停采样

双击编码器:切换波形水平滚动模式/选项设置模式

长按编码器:进入设置界面

旋转编码器:水平滚动波形(在暂停采样状态下有效)

按下同时旋转编码器:垂直滚动波形(仅在暂停采样状态下有效)

设置界面:

单击编码器:无效

双击编码器:无效

长按编码器:返回主界面

旋转编码器:修改当前选项

按下同时旋转编码器:切换选项

主界面参数:

横轴时间区间:

代码语言:javascript复制
"500ms", "200ms", "100ms", "50ms", "20ms", "10ms","5ms", "2ms", "1ms", "500us", "200us", "100us"

(100us仅在自动触发模式下可用)

纵轴电压区间:设定电压量程上限,最大30V,顺时针旋转编码器将电压上限设置为0则进入自动量程,逆时针旋转进入手动量程

触发值:设定触发电压值,触发位置被放在屏幕中心

触发方向:上下箭头,分别代表上升沿触发和下降沿触发

触发方式:

Auto(自动触发) :连续采样,指示灯始终点亮,通过单击编码器控制启停;触发成功时,触发点位于屏幕中心,触发失败则波形无规律滚动,屏幕左侧显示Fail标志

Normal(普通触发):等待预采样,待指示灯亮起表示预采样结束,这时可以输入信号;

触发成功后,显示波形,并继续等待下次触发;

如果有新的触发成功,则自动显示新的波形,如没有新的触发成功则屏幕波形保持并一直等待下次触发;

需注意设置正确的触发值,否则一直处于等待触发状态,屏幕不会显示波形

Single(单次触发):等待预采样,待指示灯亮起表示预采样结束,这时可以输入信号;

触发成功后,显示波形,并停止采样,需用户单击编码器开始下次采样

需注意设置正确的触发值,否则一直处于等待触发状态,屏幕不会显示波形

主界面状态显示:

Run:正在采样

Stop:停止采样

Fail:自动模式下,触发值超出波形范围引起触发失败

Auto:自动量程

设置界面选项:

PMode(绘图模式):

Vector:波形以矢量显示

Dots :波形以点阵显示

LSB(采样系数):分压系数的100倍,比如用10k加2k的电阻进行分压,分压系数为(10 2/2)=6,LSB理论取值为6x100=600,根据实际电阻精度进行微调

BRT:OLED亮度

保存设置:长按编码器退出设置界面时,设置界面和主界面的所有参数被保存到EEPROM

这个图是在上面都看不懂的情况下使用

缺陷:

1. 不能测量负电压。波形将在 0V 处停止。

2、如果高速采样输入PWM信号,采样结果会频繁跳到最大值。我向STC工程师询问了这个问题,但没有得到明确的解释。这个跳跃问题也和各个MCU的质量有关。

性能:

通道数:单通道

采样率:750kSa/s

模拟带宽:500kHz

储存深度:1k

输入阻抗:1MΩ

水平时基:50us-20s(1-2-5)

输入电压:0-32V

工作电压:4-5V

一些示波器的功能,未来看源码都可以找到

测量的接口

接下来看看源码实现:

这些头

  1. reg51,头文件
  2. global,因为需要大量的变量来实现复杂的逻辑,所以这个有用
  3. 还有关于测量,示波器是和时间强相关的仪器
  4. 因为电压到数字的转换就是ADC了,这里也需要重点处理
  5. 还有就是外设的引脚的连接,这里单独处理
  6. 因为实现了复杂的逻辑功能,每一次的设置都有很多的变量改变,这里也单独的进行了功能的封装
  7. 剩下就是处理屏幕的事情了,以后说

变量

延时

实现

引脚定义

OLED的连接

关于设置

编码器使用的是中断法

电池电压的测量使用了一个ADC

旋转中断的实现

这个值得看一下:

代码语言:javascript复制
void INT0_interrupt(void) interrupt INT_0

关键词声明,这个是中断

延时500us

判断这个中断引脚上面的信息

代码语言:javascript复制
bit EC11PressAndRotate;                                   
 // EC11编码器按下同时旋转标志位

如果有的话,就开始设置标志位

因为旋转编码器动了,接下来就是知道这个东西咋动的:

一个扫描的功能

里面需要注意的一个改变了多少步进的功能,我这里就先不分析,因为很长,比较占地方,我之后写一下这个编码器的使用。

这是一个设置的功能,实现在设置的文件里面

这个我称为,擦屁股,把中断恢复,等下次在激发

接下来看初始化:

代码语言:javascript复制
void init()
{
    InSettings = 0;         //初始化开机界面
    OptionInSettings = 0;   //初始化设置界面的选项编号
    OptionInChart = 0;      //初始化主界面的选项标号
    WaveScroll = 0;         //清零波形滚动标志
    OptionChanged = 0;      //清零设置修改标志
    ADCRunning = 1;         //置位采样标志
    ADCInterrupt = 0;       //清零ADC中断标志
    ADCComplete = 0;        //清零ADC完成标志
    WaveUpdate = 0;         //清零波形更新标志
    ClearWave = 0;          //清零清除波形标志
    ClearDisplay = 1;       //置位清空屏幕标志
    EC11PressAndRotate = 0; //清零编码器旋转标志
    UpdateVbat = 0;         //清零采样电池电压标志
    ADCComplete = 0;        //清零ADC完成采样标志
    WaveFreq = 0;           //清零波形频率
    TriPos = 50;            //初始化触发点位置
    TriPosOffset = 0;       //初始化触发点偏移量
    TriFail = 0;            //清零触发失败标志
    VMax = 0;               //清零波形电压最大值
    VMin = 0;               //清零波形电压最小值
    WaveLengthSumNum = 0;   //清零波形长度求和次数
    WaveLengthSum = 0;      //清零波形长度求和

    /* 波形滚动模式下正在采样则禁用外部中断0(编码器旋转)
       Disable external interrupt 0(Encoder rotation) in waveform scroll mode when sampling*/
    if (ADCRunning && WaveScroll)
        EX0 = 0;

    /* 获取内部参考电压值
       Get internal reference voltage */
    BGV = GetBGV();
}

里面的一些初始化是按照位定义的

这里是在一个处理,使用标志位更改了寄存器

获取参考电压

这个函数的功能是实现了,在运行功能的时候改变一些设置

翻译

这是电池电压的测量功能,写的很干净,学会了

更改OLED的亮度是写IIC的参数在里面

自己看注释,简单

然后开始把这些更改保存,下次使用

退出后刷新一下,启用新功能

主要逻辑好多,看不动了

我有空再写,累了。

张开心的祝福真不错!!!

代码语言:javascript复制
https://github.com/CreativeLau/Mini-DSO

源码位置

代码语言:javascript复制
https://oshwhub.com/sarins/minidso

JLC

代码语言:javascript复制
https://www.instructables.com/Upgrade-DIY-Mini-DSO-to-a-Real-Oscilloscope-With-A/

教程

0 人点赞