Mini-DSO 采样原理深度解析:STC8 单片机 ADC 如何实现 250kHz 高速采样
【免费下载链接】Mini-DSO用STC单片机制作的简易示波器 / DIY Mini Digital Storage Oscilloscopes(DSO) with STC MCU项目地址: https://gitcode.com/gh_mirrors/mi/Mini-DSO
Mini-DSO 采样原理听起来很复杂,但当你真正读懂 STC8 单片机内置 ADC 的工作方式,会发现这块巴掌大的 DIY 示波器里藏着非常巧妙的工程智慧。本文从 ADC 时钟配置、逐点查询采样、触发预缓存到 Bandgap 电压校准,一步步拆解 Mini-DSO 如何用一颗 STC8A8K64S4A12(27MHz 主频)实现最高 250kHz 的等效采样率,把模拟信号变成 OLED 屏幕上稳定的波形。
Mini-DSO 是什么:一块 STC8 单片机做出来的示波器
Mini-DSO 是"用 STC 单片机制作的简易数字存储示波器",核心只有一颗 STC8A8K64S4A12 单片机、一块 SSD1306 OLED 屏、一个 EC11 编码器旋钮和简单的外围电路。它没有专用的 ADC 芯片,采样任务全部由 STC8 单片机内置的 12 位逐次逼近型 ADC 完成,这就是 Mini-DSO 采样原理最值得研究的地方。
硬件成本极低,功能却不含糊:支持 12 档横轴时间区间(500ms 到 100us)、最高 30V 电压量程、自动/普通/单次三种触发方式,还能测量波形频率。主控代码主要集中在 adc_stc8.c 和 chart.c 中,整体电路可以参考 Mini_DSO_Scheme_V0.3.pdf。
250kHz 采样率的由来:ADC 时钟是怎么配置的
要理解 Mini-DSO 采样原理,先要明白一个概念:STC8 内置 ADC 的转换速度由 ADC 时钟决定,而 ADC 时钟来自系统时钟分频。在 adc_stc8.h 中可以看到一串宏定义,比如:
ADC_SPEED_512 512 个时钟 → 最慢 ADC_SPEED_32 32 个时钟 → 最快27MHz 主频下,ADC 时钟配置为ADC_SPEED_32时,完成一次 12 位转换只需要约 4us,换算过来就是1 / 4us ≈ 250kHz 的采样率。这正是 Mini-DSO 高速采样的秘密:不是硬件有多豪华,而是把分频比压到了极限。
ADCInit()函数会根据当前时间档位动态设置ADCCFG寄存器,档位越"快",ADC 分频越小,转换速度越快。
ADC 采样核心流程:查询方式实现逐点采样
Mini-DSO 采样原理的第二个关键是查询式转换。ADCRead()函数执行以下步骤:
- 清零结果寄存器
- 通过
ADC_CONTR选择输入通道(如 P1.6 对应ADC_CHS_06) - 置位
ADC_START启动转换 - 循环等待
ADC_FLAG标志位置位 - 读取结果:
res = (ADC_RES << 8) | ADC_RESL
12 位结果被拆成高 8 位和低 8 位两个寄存器,合并后得到一个 0~4095 的原始 ADC 值。整个过程没有使用中断,代码路径极短,这正是能跑出 4us 采样间隔的前提——任何多余的操作都会拖慢采样节奏。
采样间隔怎么控制:从 500ms 到 100us 的 12 档位
Mini-DSO 采样原理中最巧妙的部分,是用延时函数精确控制采样间隔。屏幕横向共 4 格、每格 25 个采样点,共 100 个采样点组成一帧波形。switch_Dealy()根据当前时间档位插入不同的微秒级延时:
- 500ms 档:插入约 19.97ms 延时(每格 500ms)
- 100us 档:不插入延时,直接以 4us/点的极限速度连续采样
时间档位和 ADC 速度是联动的,ADCInit(scale_h)与switch_Dealy(scale_h)由同一个档位参数驱动。源码注释里标注了每个档位对应的转换耗时,比如ADC_SPEED_32在 27MHz 下就是 4us,开发者甚至用_nop_()空指令做单周期微调,精细到极致。
触发采样原理:预缓存与环形缓冲
对于观察一次性信号(如按键毛刺),Mini-DSO 采用预缓存 + 触发检测的策略。采样开始后,先把PRE_BUF_NUM个点存入预缓存数组,构成环形缓冲;随后持续采样并检测当前点与上一点是否跨过触发电压(上升沿或下降沿)。
一旦触发成功,就继续采集触发点之后的点,最后把"触发前的预缓存 + 触发后的采样"拼接成完整波形,让触发点恰好落在屏幕中心。这就是为什么 adc_stc8.c 里的GetWaveADC()那么长——它同时要处理自动、普通、单次三种触发模式。
注意:100us 档(250kHz 采样率)下触发计算来不及执行,所以代码里该档位仅支持自动触发模式,这正是单片机算力边界的真实体现。
校准的秘密:Bandgap 内部参考电压
采样精度靠什么保证?答案是 STC8 单片机内置的Bandgap 带隙基准电压。GetBGV()从 ROM 固定地址0xfdf7读取出厂校准的参考电压值(单位 mV),同时通过 ADC 第 16 通道(ADC_CHS_BG)实测 Bandgap 对应的 ADC 值,最终按公式计算真实电压:
Vx = BGV × ADCx × LSB ÷ ADCbg ÷ 100这样即使芯片个体存在差异,也能通过内部基准自动校正。这也是为什么 settings.h 里强调 LSB 分压系数上限不能超过 777——12 位 ADC 满量程 4095 与 BGV 值相乘会逼近 32 位整数的上限。
采样数据如何变成屏幕上的波形
拿到 100 个原始 ADC 值后,chart.c 负责把数据"翻译"成画面:根据自动/手动量程换算成毫伏电压,计算波形的最大最小值与频率,再按矢量或点阵模式绘制到 SSD1306 OLED 上。频率测量则通过查找触发点两侧的等值点间隔来完成。
上图是 Mini-DSO 与专业示波器的同信号对比,1kHz 方波的频率和幅值读数基本一致,验证了这套采样方案的实用性。
总结:Mini-DSO 采样原理给你的启发
回顾整个 Mini-DSO 采样原理,你会发现它没有高深的技术,却处处是工程取舍:用查询代替中断换速度、用延时控制采样间隔、用预缓存实现触发、用 Bandgap 做自校准。对单片机初学者来说,把 adc_stc8.c 和 chart.c 从头读一遍,比看十篇理论文章收获都大——250kHz 采样率,就是这么"抠"出来的。
【免费下载链接】Mini-DSO用STC单片机制作的简易示波器 / DIY Mini Digital Storage Oscilloscopes(DSO) with STC MCU项目地址: https://gitcode.com/gh_mirrors/mi/Mini-DSO
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考