公司动态

Mini-DSO 采样原理深度解析:STC8 单片机 ADC 如何实现 250kHz 高速采样

📅 2026/8/18 14:41:19
Mini-DSO 采样原理深度解析:STC8 单片机 ADC 如何实现 250kHz 高速采样
Mini-DSO 采样原理深度解析STC8 单片机 ADC 如何实现 250kHz 高速采样【免费下载链接】Mini-DSO用STC单片机制作的简易示波器 / DIY Mini Digital Storage Oscilloscopes(DSO) with STC MCU项目地址: https://gitcode.com/gh_mirrors/mi/Mini-DSOMini-DSO 采样原理听起来很复杂但当你真正读懂 STC8 单片机内置 ADC 的工作方式会发现这块巴掌大的 DIY 示波器里藏着非常巧妙的工程智慧。本文从 ADC 时钟配置、逐点查询采样、触发预缓存到 Bandgap 电压校准一步步拆解 Mini-DSO 如何用一颗 STC8A8K64S4A1227MHz 主频实现最高 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_RESL12 位结果被拆成高 8 位和低 8 位两个寄存器合并后得到一个 0~4095 的原始 ADC 值。整个过程没有使用中断代码路径极短这正是能跑出 4us 采样间隔的前提——任何多余的操作都会拖慢采样节奏。采样间隔怎么控制从 500ms 到 100us 的 12 档位Mini-DSO 采样原理中最巧妙的部分是用延时函数精确控制采样间隔。屏幕横向共 4 格、每格 25 个采样点共 100 个采样点组成一帧波形。switch_Dealy()根据当前时间档位插入不同的微秒级延时500ms 档插入约 19.97ms 延时每格 500ms100us 档不插入延时直接以 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),仅供参考