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

「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.

相关推荐
热点推荐
没有退路!中国国防部已经向全世界亮明:解放军全员整装待发。

没有退路!中国国防部已经向全世界亮明:解放军全员整装待发。

小马姨
2026-09-25 20:41:19
那个坐拥890万粉丝、体重一度逼近500斤的内蒙古网红“羊亡爷”恩克,步履虚浮难进食,暴食流量终要拿健康买单

那个坐拥890万粉丝、体重一度逼近500斤的内蒙古网红“羊亡爷”恩克,步履虚浮难进食,暴食流量终要拿健康买单

LULU生活家
2026-09-25 15:16:25
空腹血糖6.5,算不算糖尿病?医生教你看懂这3个黄金临界值

空腹血糖6.5,算不算糖尿病?医生教你看懂这3个黄金临界值

今日养生之道
2026-09-29 00:37:41
拒绝硬碰硬!中国女足vs朝鲜女足,中国女足赢朝鲜就靠五招

拒绝硬碰硬!中国女足vs朝鲜女足,中国女足赢朝鲜就靠五招

体育吐槽
2026-09-29 10:56:47
亚运会男子4×400米接力:中国队3分02秒15完赛,小组第3晋级决赛

亚运会男子4×400米接力:中国队3分02秒15完赛,小组第3晋级决赛

全景体育V
2026-09-28 20:50:06
29岁前白宫新闻秘书倒戈曝猛料!特朗普铁杆主持震怒:你背叛国家

29岁前白宫新闻秘书倒戈曝猛料!特朗普铁杆主持震怒:你背叛国家

乐天闲聊
2026-09-29 11:18:59
王楚钦“三银”:今年可能是最后一届亚运会,林诗栋3金1银

王楚钦“三银”:今年可能是最后一届亚运会,林诗栋3金1银

九方鱼论
2026-09-29 13:49:56
方媛晒三女儿侧脸照!这大眼睛和白皮肤完全是迷你版方媛,好可爱

方媛晒三女儿侧脸照!这大眼睛和白皮肤完全是迷你版方媛,好可爱

吃青菜长高
2026-09-28 17:34:27
全程捏汗!手机掉入高层阳台缝隙 网友支招远程救援成功

全程捏汗!手机掉入高层阳台缝隙 网友支招远程救援成功

快科技
2026-09-28 09:00:06
首夺亚运会金牌!蒋振邦/魏雅欣2-0印尼黑马,国羽成就4连冠霸业

首夺亚运会金牌!蒋振邦/魏雅欣2-0印尼黑马,国羽成就4连冠霸业

钉钉陌上花开
2026-09-29 10:49:08
前国乒队员:舆论已让我们失去一位优秀的选手 别让王楚钦成下一个

前国乒队员:舆论已让我们失去一位优秀的选手 别让王楚钦成下一个

风过乡
2026-09-29 08:10:06
心梗去世的人飙升!医生含泪苦劝:无论多大年纪,天冷坚守5原则

心梗去世的人飙升!医生含泪苦劝:无论多大年纪,天冷坚守5原则

任医生聊健康
2026-09-29 14:15:15
上千辆导弹发射车频繁机动,数百个弹道导弹发射井全部启封,谁敢动?

上千辆导弹发射车频繁机动,数百个弹道导弹发射井全部启封,谁敢动?

聚峰军评
2026-09-29 11:40:09
1死2伤!网红杰克辣条家门口遇袭,嫌疑人坠亡,官方:细节正调查

1死2伤!网红杰克辣条家门口遇袭,嫌疑人坠亡,官方:细节正调查

社会日日鲜
2026-09-28 13:44:33
林莉已任苏州市委常委、统战部部长

林莉已任苏州市委常委、统战部部长

黄河新闻网吕梁
2026-09-29 08:51:02
风向变了?王曼玉夺冠后,很多人开始批评她,再次印证樊振东的话

风向变了?王曼玉夺冠后,很多人开始批评她,再次印证樊振东的话

社会日日鲜
2026-09-28 21:37:40
《复仇者联盟 5:毁灭之日》即将全国献映

《复仇者联盟 5:毁灭之日》即将全国献映

动物奇奇怪怪
2026-09-29 11:56:36
2年1565万美金!3年换4队!21岁8号秀正式被裁

2年1565万美金!3年换4队!21岁8号秀正式被裁

微评体育圈
2026-09-29 12:23:02
72岁台湾老兵回大陆探亲,酒醉后失言令女儿大惊:您是共产党员?

72岁台湾老兵回大陆探亲,酒醉后失言令女儿大惊:您是共产党员?

大运河时空
2026-04-12 10:50:03
吴艳妮晒亚运会铜牌,自称“一身傲骨,易碎但难杀”:你以为那么多的挫折,足够磨平她的骄傲与志气,但她依旧意气风发

吴艳妮晒亚运会铜牌,自称“一身傲骨,易碎但难杀”:你以为那么多的挫折,足够磨平她的骄傲与志气,但她依旧意气风发

极目新闻
2026-09-29 13:37:17
2026-09-29 14:47:00
EEWorld电子工程世界 incentive-icons
EEWorld电子工程世界
即时参与讨论电子工程世界最火话题,抢先知晓电子工程业界资讯。
346文章数 27关注度
往期回顾 全部

科技要闻

82亿美元收购!李飞飞将与苏姿丰并肩做AI

头条要闻

女教师被拖行5.9公里致死 妹妹:姐姐离世时全身拖痕

头条要闻

女教师被拖行5.9公里致死 妹妹:姐姐离世时全身拖痕

体育要闻

王楚钦回应:找不回以前打球的感觉

娱乐要闻

刘欢离世48小时 李湘一个举动口碑暴涨

财经要闻

伊朗找到了美债的七寸

汽车要闻

5.1米大车跑云南盘山路,海狮08试驾体验超预期

态度原创

数码
游戏
手机
亲子
军事航空

数码要闻

荣耀平板可安装PC版微信!支持直接运行exe程序

《金刚狼》日本首发遇冷!实体销量仅占蜘蛛侠2三成

手机要闻

iOS27.0.1 紧急推送!修复 FaceID 致命 Bug,告诉你要不要升级?

亲子要闻

孩子挑疳积 流出透明液体,你小时候被扎过吗?

军事要闻

伊朗最高领袖最新发声:伊朗现已变得独立、强大

无障碍浏览 进入关怀版