「AI编程记录--含源码」用一晚上的时间写一个esp32的示波器

电子工程世界 2026-07-17 08:00

先叠buff,这是玩具!玩具!玩具!

 

这是一个使用一晚上时间,指挥AI智能体实现的esp32示波器。这个也只是玩具级的demo。适配了lvgl,使用lvgl的划线功能绘制图像。代码默认开启GPIO0作为输入通道,50KHz的采样率,自动识别输入波形的频率,然后再截取固定相位的波形显示在屏幕上(3个周期)。 



ESP32-C6 LCD 示波器 — 从零实现方案


背景:

已有条件:ESP32-C6 + ST7789T LCD (320×172 横屏已配好) + LVGL 已能正常显示(直接拿微雪或者其他成品代码给AI作参考适配就行了,不要闲着没事儿干丢屏驱芯片的手册,让AI给你写驱动)。 目标:实现简易示波器,ADC 采样率 50KHz,GPIO0 模拟输入。

数据流

  • ADC 采样(50KHz) → 触发(稳住波形) → 测量(频率+幅度) → LVGL 显示(波形+数字)


步骤 1:ADC 采样 + 校准

做什么

用 ESP-IDF 连续 ADC 驱动持续采集 GPIO0 的模拟信号,校准后以 mV 单位输出。

具体步骤

  1. 新建  组件
  • 配置连续 ADC:ADC1_CH0 (GPIO0),12bit,ADC_ATTEN_DB_12,50KHz
  • 分配环形缓冲区 8192 采样点(163ms @50KHz,兼顾 10Hz~25kHz)
  • 初始化时调用  创建校准句柄
  • 提供  接口:拷贝缓冲区并逐样本调用  转为 mV
  • 在  中初始化 ADC,循环调用 snapshot,通过  打印前 20 个值
  • 验收

    自己做这一部分的验收工作,确认adc连续采样已经可以工作了。


    步骤 2:边沿触发

    做什么

    在采样数据中找到上升过中点的位置,让波形从固定相位开始,显示不漂移。

    具体步骤

    1. 在 oscilloscope 组件中新建  和 
  • 实现函数:遍历数据找第一个  的索引
  • mid 由调用者传入(通常为 
  • 找不到时返回 
  • 在主循环中:触发成功则从触发点取数据,失败则取缓冲区末尾
  • 验收


    步骤 3:Vpp 测量

    做什么

    从一段采样数据中算出峰峰值电压。

    具体步骤

    1. 在 oscilloscope 组件中新建  和 
  • 实现测量函数:遍历数据找 min_mV 和 max_mV
  • 单位为伏特
  • 在主循环中调用,通过  打印 Vpp
  • 验收


    步骤 4:频率测量 — 过零点法

    做什么

    统计上升过中点的次数和间距,计算基波频率。

    具体步骤

    1. 在  中增加过零点测频函数
  • 找信号 min/max,计算中点 mid
  • 收集最多 64 个上升过零点位置(
  • 计算相邻过零点间距的平均值 → 平均周期
  • 频率 = 采样率 / 平均周期
  • 不足 2 个过零点时返回 0(无效)
  • 在主循环中调用, 打印频率
  • 验收

    注意


    步骤 5:频率测量 — FFT(可选 fallback)

    做什么

    为过零点失败的场景提供备选频率检测。此步骤可选,过零点法已覆盖绝大多数场景。

    具体步骤

    1. 在 oscilloscope 组件中新建  和 
  • 实现 512 点 Cooley-Tukey FFT:bit_reverse + 蝶形运算
  • 实现 magnitude 计算:
  • 在 measure 中:对数据加 Hann 窗后送入 FFT
  • 搜索峰值时跳过 bin 0-3(DC 泄漏区)
  • 抛物线插值提高频率精度
  • 测量策略:过零点优先,FFT 仅在过零点返回 0 时使用
  • 验收

    注意


    步骤 6:波形显示 — 基础版

    做什么

    在 LVGL 上画出波形,先实现最简单的版本:直接显示采样数据,不做周期缩放。

    具体步骤

    1. 在 oscilloscope 组件中新建  和 
  • 初始化:设置屏幕黑色背景,创建  对象
  • 分配  静态数组
  • 更新函数:将 320 个采样点映射到屏幕坐标
  • 底部预留 16px 不画波形(留给文字)
  • 主循环中调用  + ,间隔 50ms
  • 验收


    步骤 7:固定 3 周期显示

    做什么

    根据测量的周期,自动缩放波形,始终显示 3 个完整周期。

    具体步骤

    1. 在  的 info 结构体中增加  字段
  • 在  中计算:
  • UI 更新函数中:
  • 用线性插值将 src_len 个采样重采样到 320 像素:
  • 将插值结果映射到 Y 坐标
  • 验收

    注意


    步骤 8:参考线 + 信息文字

    做什么

    叠加 1.65V 参考线和频率/Vpp 数字显示。

    具体步骤

    1. 创建第二条  作为参考线,水平画在  位置(1.65V),颜色暗青色
  • 创建  底部居中对齐,绿色文字,字体 
  • 格式:(频率和 Vpp 之间 4 个空格)
  • 频率 >= 1000 时用  格式
  • 无效频率时显示 
  • 验收


    步骤 9:整合主循环

    做什么

    将所有模块串联到的主循环中。

    具体步骤

    1.  中依次初始化:LCD → LVGL → ADC → UI
    • app_main
  • 延迟 100ms 等待 ADC 缓冲区填满
  • 主循环:
    • vTaskDelay(50ms)
    • lv_timer_handler()
    • osc_ui_update()
    • osc_measure()
    • osc_trigger_rising()
    • osc_adc_snapshot()
    • 调用  获取一帧 mV 数据
    • 调用  找触发点
    • 从触发点取后续数据,调用  测量频率和 Vpp
    • 调用  更新波形和文字
    • 调用  刷新显示
    •  间隔

    验收

    •  接信号发生器,波形稳定显示 3 个周期
    •  频率和 Vpp 数字合理
    •  切换波形类型(正弦/方/三角)和频率,1 秒内稳定
    •  长时间运行不死机(看门狗不触发)


    这上面的步骤,FFT部分可以不需要做,其他的,遇到AI写Lvgl界面错误的,例如文字旋转丢失,位置不正确,波形绘制上下颠倒什么的,自己根据情况反馈给AI修正即可。




    源码地址:https://gitee.com/walker2048/eetree-occurrence/tree/master/oscilloscope-c6




    · END ·

    请将我们设为“星标”,这样就会第一时间收到推送消息。

    欢迎关注EEWorld旗下订阅号:“机器人开发圈”



    声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
    AI 示波器
    more
    一文了解示波器前生今世!
    快速了解RIGOLMHO98示波器,填写问卷赢京东卡!
    基于 FPGA 的便携式 DDS 信号发生器与示波器
    工程师经常用示波器测试的振铃信号,很可能是假的
    7nm光刻机未现身!新凯来亮相2款EDA、1台示波器和16款“山系”设备,万里眼CEO公开发声:聚焦解决西方“卡脖子”技术!
    国际国内示波器排行榜
    打破西方封锁,全球第二!一文读懂国产首款90GHz示波器对我国高端芯片产业发展意味着什么?
    加班调板子,示波器老抓不到波形?
    基于 FPGA Vivado 示波器设计(附源工程)
    1500多家中企被制裁!“中国标尺”万里眼高端示波器,突破西方封锁!
    Copyright © 2025 成都区角科技有限公司
    蜀ICP备2025143415号-1
      
    川公网安备51015602001305号