网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

先叠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. 新建 组件

  • osc_adc.c

  • include/osc_adc.h

  • components/oscilloscope/

配置连续 ADC:ADC1_CH0 (GPIO0),12bit,ADC_ATTEN_DB_12,50KHz

分配环形缓冲区 8192 采样点(163ms @50KHz,兼顾 10Hz~25kHz)

初始化时调用 创建校准句柄

  • adc_cali_create_scheme_curve_fitting()

提供 接口:拷贝缓冲区并逐样本调用 转为 mV

  • adc_cali_raw_to_voltage()

  • osc_adc_snapshot(buf, max)

在 中初始化 ADC,循环调用 snapshot,通过 打印前 20 个值

  • ESP_LOGI

  • app_main

验收
  • 编译烧录,串口持续输出采样值

  • GPIO0 接 GND → 打印值 ≈ 0mV

  • GPIO0 接 3.3V → 打印值 ≈ 2500~3300mV(C6 满量程不是 3.3V)

  • 接 1kHz 正弦波 → 数据有明显周期性高低变化

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

步骤 2:边沿触发做什么

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

具体步骤

  1. 在 oscilloscope 组件中新建 和

  • osc_trigger.c

  • include/osc_trigger.h

实现函数:遍历数据找第一个 的索引

  • data[i] >= mid && data[i-1] < mid

mid 由调用者传入(通常为 )

  • (min + max) / 2

找不到时返回

  • found=false

在主循环中:触发成功则从触发点取数据,失败则取缓冲区末尾

验收

  • 主循环:snapshot → 触发 → 打印触发位置

  • 接正弦波,串口持续输出触发索引,值应在合理范围内跳动

  • 后续接上波形显示后,波形应稳定不左右滚动

步骤 3:Vpp 测量 做什么

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

具体步骤

  1. 在 oscilloscope 组件中新建 和

  • osc_measure.c

  • include/osc_measure.h

实现测量函数:遍历数据找 min_mV 和 max_mV

单位为伏特

  • Vpp = (max_mV - min_mV) / 1000.0

在主循环中调用,通过 打印 Vpp

  • ESP_LOGI

验收
  • 接 1kHz 正弦波(信号发生器设置 1Vpp)→ 打印 Vpp ≈ 1.0V

  • 接 1kHz 方波(信号发生器设置 3Vpp)→ 打印 Vpp ≈ 3.0V

  • 误差 < 10%

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

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

具体步骤

  1. 在 中增加过零点测频函数

  • osc_measure.c

找信号 min/max,计算中点 mid

收集最多 64 个上升过零点位置()

  • data[i] >= mid && data[i-1] < mid

计算相邻过零点间距的平均值 → 平均周期

频率 = 采样率 / 平均周期

不足 2 个过零点时返回 0(无效)

在主循环中调用, 打印频率

  • ESP_LOGI

验收
  • 1kHz 正弦波 → 打印 ≈ 1000Hz,误差 < 5%

  • 100Hz 正弦波 → 打印 ≈ 100Hz

  • 10kHz 正弦波 → 打印 ≈ 10000Hz

  • 535Hz 方波 90%占空比 → 打印 ≈ 535Hz(不会误判为 1070Hz 二次谐波)

注意
  • < 200Hz 时频率读数会跳变(163ms 缓冲区内周期数太少),这是正常的,后续可用多帧平滑改善

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

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

具体步骤

  1. 在 oscilloscope 组件中新建 和

  • osc_fft.c

  • include/osc_fft.h

实现 512 点 Cooley-Tukey FFT:bit_reverse + 蝶形运算

实现 magnitude 计算:

  • sqrt(re² + im²)

在 measure 中:对数据加 Hann 窗后送入 FFT

搜索峰值时跳过 bin 0-3(DC 泄漏区)

抛物线插值提高频率精度

测量策略:过零点优先,FFT 仅在过零点返回 0 时使用

验收

  • 过零点失败时(如噪声信号),FFT 仍能给出近似频率

  • 1kHz 正弦波 FFT 结果 ≈ 1000Hz

注意
  • fft_len 必须是 2 的幂

    否则 bit_reverse 死循环。用 计算

    • while (n*2 <= limit) n*=2

  • ESP32-C6 无 FPU,2048 点 FFT 会触发看门狗,限制在 512 点

  • 方波的二次谐波比基波还强时 FFT 会误判,所以过零点必须是主方案

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

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

具体步骤

  1. 在 oscilloscope 组件中新建 和

  • osc_ui.c

  • include/osc_ui.h

初始化:设置屏幕黑色背景,创建 对象

  • lv_line

分配 静态数组

  • lv_point_t[320]

更新函数:将 320 个采样点映射到屏幕坐标

  • y = disp_h - 1 - (mV × disp_h / 3300)

  • X = 采样索引 (0~319)

  • Y = 翻转映射:,高电压在顶部

底部预留 16px 不画波形(留给文字)

主循环中调用 + ,间隔 50ms

  • lv_timer_handler()

  • osc_ui_update()

验收
  • 接 1kHz 正弦波 → 屏幕上能看到绿色波形

  • 波形幅度随信号发生器电压变化而变化

  • 接 5kHz 信号 → 波形变密(周期多),但仍能看到

步骤 7:固定 3 周期显示 做什么

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

具体步骤

  1. 在 的 info 结构体中增加 字段

  • period_samples

  • osc_ui.h

在 中计算:

  • period_samples = sample_rate / frequency + 0.5

  • osc_measure.c

UI 更新函数中:

  • src_len > wave_len

  • src_len = wave_len

  • src_len = period_samples × 3

  • 计算要显示的采样数:

  • 如果 ,则 (数据不够就全显示)

用线性插值将 src_len 个采样重采样到 320 像素:

  • frac = i × (src_len-1) / 319

  • 对每个像素 i,计算对应的采样索引

  • 取相邻两个采样点线性插值

将插值结果映射到 Y 坐标

验收

  • 1kHz 正弦波 → 屏幕上恰好 3 个完整周期

  • 切换到 5kHz → 仍然 3 个周期

  • 切换到 100Hz → 仍然 3 个周期

  • 10kHz 信号 → 仍然 3 个周期

注意
  • 可能小于 320(高频时),这是正常的,插值会拉伸,不需要加 的限制

    • >= 320

    • period_samples × 3

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

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

具体步骤

  1. 创建第二条 作为参考线,水平画在 位置(1.65V),颜色暗青色

  • y = disp_h/2

  • lv_line

创建 底部居中对齐,绿色文字,字体

  • lv_font_montserrat_14

  • lv_label

格式:(频率和 Vpp 之间 4 个空格)

  • "%.0fHz %.2fVpp"

频率 >= 1000 时用 格式

  • "%.2fkHz"

无效频率时显示

  • "---"

验收
  • 屏幕上有一条暗色水平参考线

  • 底部居中显示绿色文字,如

    • 1.00kHz 1.50Vpp

  • 频率和幅度随信号变化实时更新

步骤 9:整合主循环 做什么

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

  • main/main.c

具体步骤
  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

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

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
事发上海街头!女刑警下班途中瞥了一眼,截获罕见67万元奢侈品包

事发上海街头!女刑警下班途中瞥了一眼,截获罕见67万元奢侈品包

环球网资讯
2026-09-10 21:22:19
摩根-罗杰斯被评为队内全场最佳,帕尔默评论区发问号

摩根-罗杰斯被评为队内全场最佳,帕尔默评论区发问号

懂球帝
2026-09-10 22:57:08
不查不知道,一查吓一跳,身价上亿的郭德纲,私下的生活壕到离谱

不查不知道,一查吓一跳,身价上亿的郭德纲,私下的生活壕到离谱

一些小事
2026-09-09 08:59:44
草台班子!美网兴奋剂检测人员找不到血管,致球员手臂淤伤退赛

草台班子!美网兴奋剂检测人员找不到血管,致球员手臂淤伤退赛

全景体育V
2026-09-11 08:08:49
联合国降半旗,53国跟着降,那天地球都停了!伟人千古!

联合国降半旗,53国跟着降,那天地球都停了!伟人千古!

戎评
2026-09-09 15:48:58
炸裂!日本妻子拍AV挽救婚姻,瞒夫出道老公崩溃,如今丈夫成粉丝

炸裂!日本妻子拍AV挽救婚姻,瞒夫出道老公崩溃,如今丈夫成粉丝

悠悠说世界
2026-08-17 13:48:27
风波再起,打假人举报付曾学术造假,付磊女儿再发声,这次是爷爷

风波再起,打假人举报付曾学术造假,付磊女儿再发声,这次是爷爷

寻墨阁
2026-09-11 11:00:31
15.6万!日产新车官宣:9月23日,正式发布

15.6万!日产新车官宣:9月23日,正式发布

科技堡垒
2026-09-11 11:09:59
5张高清照片,定格了一名落单志愿军战士被俘全过程

5张高清照片,定格了一名落单志愿军战士被俘全过程

小莜读史
2026-08-24 08:23:18
50元的流水线工人,60元的安保:奴工生产出来的东西,你躲得开吗?

50元的流水线工人,60元的安保:奴工生产出来的东西,你躲得开吗?

人间运行手册
2026-09-11 08:01:50
杜兰特首秀27分8助攻零失误 火箭127比119赢下内部对抗

杜兰特首秀27分8助攻零失误 火箭127比119赢下内部对抗

刘哥谈体育
2026-09-11 09:23:51
小孩梦游从7楼坠下砸烂宝马 车主大度反遭翻脸 家长为省5万要用拆车件修车

小孩梦游从7楼坠下砸烂宝马 车主大度反遭翻脸 家长为省5万要用拆车件修车

中国能源网
2026-09-11 15:55:23
必须还上海体育局一个清白

必须还上海体育局一个清白

大嘴説
2026-09-10 15:20:06
刘翔的200万美元耐克终身合同或许只是传言丨小贺说

刘翔的200万美元耐克终身合同或许只是传言丨小贺说

21世纪经济报道
2026-09-11 09:25:55
黄晓明感慨帮过太多白眼狼  网友猜测Angelababy

黄晓明感慨帮过太多白眼狼  网友猜测Angelababy

陈意小可爱
2026-09-11 16:50:09
听劝买LG电视却永不联网,两年后他发文感谢

听劝买LG电视却永不联网,两年后他发文感谢

碳基打工人
2026-09-10 16:08:17
不靠EUV也能造HBM!前英特尔大牛结束7年隐身:宣称破解HBM供应瓶颈

不靠EUV也能造HBM!前英特尔大牛结束7年隐身:宣称破解HBM供应瓶颈

快科技
2026-09-10 18:54:26
大众新车官宣:9月12日,正式上市

大众新车官宣:9月12日,正式上市

科技堡垒
2026-09-11 11:07:36
男篮争小组第一不稳?巴林4大归化攻防兼备 北京大外24+13+8超全能

男篮争小组第一不稳?巴林4大归化攻防兼备 北京大外24+13+8超全能

颜小白的篮球梦
2026-09-11 16:39:09
一辆不值钱的“奔驰E300L”,让学生家长被嘲笑:现实点吧,别心比天高

一辆不值钱的“奔驰E300L”,让学生家长被嘲笑:现实点吧,别心比天高

熙熙说教
2026-08-31 14:59:44
2026-09-11 17:44:50
EEWorld电子工程世界 incentive-icons
EEWorld电子工程世界
即时参与讨论电子工程世界最火话题,抢先知晓电子工程业界资讯。
339文章数 27关注度
往期回顾 全部

科技要闻

苹果折叠屏比小米华为贵5000元,该怎么选

头条要闻

3名俄男子被乌女特工"招募" 女方发送自己的火辣照片

头条要闻

3名俄男子被乌女特工"招募" 女方发送自己的火辣照片

体育要闻

37岁还能场场进球,还能翻跟头!

娱乐要闻

黄晓明直言帮太多白眼狼,杨颖遭殃

财经要闻

千叶珠宝创始人夫妇失联 股价应声"腰斩"

汽车要闻

买菜车也有小乐趣 风云T7不止是台合格家用SUV

态度原创

艺术
教育
房产
亲子
公开课

艺术要闻

梅尔尼科夫:全山石、苏高礼、林岗等的老师

教育要闻

《优妈育儿堂》预告:趣味游戏、奇妙科学、创意手工,陪伴孩子快乐成长

房产要闻

时隔7年,绿地海南再拿地!

亲子要闻

经济拮据,全职宝妈鼓起勇气出来找工作!找到满意岗位却陷入两难:伸手找老公拿家用,还是出门挣工资?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版