没有哪个蓝孩子可以抵挡住一个示波器的诱惑,如果有,那就再加一台网络矢量分析仪。
阿巴阿巴,比如这个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
一些示波器的功能,未来看源码都可以找到
测量的接口
接下来看看源码实现:
这些头
- reg51,头文件
- global,因为需要大量的变量来实现复杂的逻辑,所以这个有用
- 还有关于测量,示波器是和时间强相关的仪器
- 因为电压到数字的转换就是ADC了,这里也需要重点处理
- 还有就是外设的引脚的连接,这里单独处理
- 因为实现了复杂的逻辑功能,每一次的设置都有很多的变量改变,这里也单独的进行了功能的封装
- 剩下就是处理屏幕的事情了,以后说
变量
延时
实现
引脚定义
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/
教程