
#训练营#基于GD32的简易数字示波器7305166A
简介
2024立创训练营【新手区】:基于GD32E230C8T6跟随立创官方复刻简易数字示波器。功能简单,仅作小白入门学习使用,可为进阶作铺垫。附件提供我添丰富注释版代码
简介:2024立创训练营【新手区】:基于GD32E230C8T6跟随立创官方复刻简易数字示波器。功能简单,仅作小白入门学习使用,可为进阶作铺垫。附件提供我添丰富注释版代码开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
写在最前面:
2024.4.25 新的3D外壳文件已于附件更新
一、前言:
感谢嘉立创给小白提供本次机会实现电子入门!
感谢嘉立创的详尽教程和文档!
感谢嘉立创的20元3D券,50元耗材券,30元3D券!
本开源工程描述含有:
【一、前言】
【二、工程描述(器件,功能,参考资料)】
【三、我的理解与注意事项】
【四、复刻建议和问题解决】
【五、代码简析】
【六、改进方向(小白整理,大佬勿喷)】
【七、附件目录】
【设计图(原理图总图和PCB总图)】
【附件】(附件有原版源码工程,我添丰富注释版代码,代码学习笔记,3D文件,示意图片,演示视频(带外壳和不带外壳)……)
二、工程描述:
【注释:作为小白,本项目硬件软件部分几乎完全复刻立创官方】
1、主要器件:
GD32E230C8T6最小系统板、底板和1.8寸 TFT彩屏三部分。其余元件参见后文BOM
2、最终功能:
可用来测量简单信号的波形、电压和频率。
2-1、屏幕波形和参数显示功能
(1)屏幕显示波形【注意波形为倒相显示】
(2)输出信号参数显示(特指PWM方波)
输出状态【关闭/打开】
输出频率【1kHz,2kHz,4kHz】
占空比
(3)输入信号参数显示
输入幅值【范围:-1.6V~5V】(因为实际上1/50衰减最好别用)
输入频率【理论可测范围:1kHz~10kHz】
2-2、人机交互:调整波形显示和参数功能
(1)【按键KEY1】(左侧按键)
每按一次以5%的步进增加方波占空比,至100%则又变回0%
(2)【按键KEY2】(中间按键)
控制PWM方波的输出与停止,按一次开启,再按一次关闭
(3)【按键KEY3】(右侧按键)
切换PWM方波的输出频率,按动则依次在1Hz,2Hz,4Hz循环切换
(4)【编码器】(右下角)
按压则波形固定;
顺(正)转编码器,波形变宽;
逆(反)转编码器,波形变窄;
3、其他
电源:5V 直流电源
电源接口:type-c
探头类型:BNC转鳄鱼夹
4.参考资料(嘉立创官方)(很重要):
(1)详细开源文档:(后文说“开源文档”都指的这个)
https://www.yuque.com/wldz/jlceda/dso
(2)B站免费录播课:
搜索UP主:立创EDA,查看24年初一系列视频即得,与开源文档教程相辅相成
(3)官方参考代码(各部分代码,以及最终代码)
https://gitee.com/chen11232/GD32E230-Oscilloscope
【附件处有原版官方最终代码工程,以及一个我加了很多注释的版本的代码工程可以直接下载取用】
建议像我一样的小白将开源文档和B站录播课一起看,因为官方开源文档包括【硬件设计】和【软件开发】,涵盖了电路原理分析,原理图与PCB设计,焊接教程以及代码的一步步构建(顺便学习了GD32)十分详细。
因此关于本项目的详细情况请大家参考官方资料,以下不照搬官方的解释(我解释的再好也没官方解释的好),而是给出我自己的理解作为补充。复刻过程中一些重点和遇到的细节问题和一些小心得参见下文“我的理解与注意事项”。
三、我的理解与注意事项
【第1部分】电路理解与原理图绘制
(1)我几乎完全对照官方原理图绘制。所有原件位号和引脚选择以及电路连接方式都和官方一样。但当时我还不知道立创EDA可以自己调整原理图中显示屏、测试点等原件的原理图库的形状(修改方式:原理图—>右键点击元件—>编辑器件—>修改库文件),所以仅仅是原理图布局与官方原理图不同。
(2)修改时如含有两个运放的芯片的库想要从一个表示芯片的矩形改为两个表示运放的三角形,方法参见官方B站视频(BV号:BV1jy421i7Ji)(16分27秒左右)
(3)改库后新库保存在“工程库”而不是“系统库”
(4)想要查找元器件说明可以在嘉立创专业版点击放置—>器件—>输入编号—>查看PDF说明
(5)自动标号的步骤可查看(BV号:BV1jy421i7Ji)(1时15分31秒左右)
1、模拟前端处理电路
官方在讲解该电路前提出了三个问题,以下是复刻过程中相应思考:
![]() |
![]() |
注意!
“比较器测频电路”运放输出端最好带上1k欧上拉电阻,因为其为开漏输出
2、电源控制电路
以下是我的理解:
注意!!
“负压产生电路”-5V与AGND处的电解电容,正极应该在AGND处,负极应该在-5V处。注意电解电容接反容易炸板!
3、单片机电路
4、人机交互电路
|
![]() |
![]() |
![]() |
![]() |
原理图绘制时注意,B站录播课在原理图部分有一些小错误,详见B站相应评论区。
【第2部分】PCB绘制
(1)与原理图一样,我几乎完全对照官方原理图绘制。所有布局和走线几乎都和官方一样。除了因为当时画PCB时训练营还没开始所以我没自己调某电容丝印大小和测试点焊盘大小导致的布局略有不同外,与官方PCB图没有大的区别。
(2)在进行走线的时候,给芯片供电时电源时走线要先经过电源的滤波电容才能进入芯片内,而不是只要把所有+5或者所有+3电源的线连在一起就行
(3)立创EDA并没有自带1.8寸TFT彩屏的3D模型,而是需要手动绑定,绑定方法参照(BV号:BV1pF4m1V7bG)(11分左右)
以下分别是PCB正反面的连线图和正反面的铺铜情况。
![]() |
![]() |
![]() |
![]() |
【第3部分】3D外壳
(1)3D外壳不是本项目必做步骤,本步骤为选做。直接使用立创EDA专业版来制作,可参考B站视频(BV1d8411S7kF)有详细介绍。这里我使用了嘉立创的30元3D券,所以只付了运费,为嘉立创打call
(2)3D外壳制作时一定要考虑到收到外壳后,现实中上下盖能否盖到一起。比如BNC那里需要探出外壳,此时侧边的圆槽需要保持一半在上半壳,一半在下半壳
(3)下面三个图分别是3D外壳的【边框层】【顶层】【预览】
(4)我在这里有一个问题没考虑周全,即我的3D模型没有考虑到按键的高度不够,所以之后还会更改。
![]() |
![]() |
![]() |
【第4部分】元件购买
注意事项:
我买元件时直接根据官方在立创开源硬件平台上的开源工程中的BOM表格点击“在立创商城下单”后系统直接自动导入了,没有单独选型,但目前官方的开源工程下线了,可能需要自己在立创商城搜索供应商编号。这里主要留心以下三物
(1)1.8寸TFT显示屏。
这个在立创商城应该是没有的,画原理图时搜的供应商编号C9900080251并不能直接在立创商城下单,我当时自动对应的相似产品买回来是显示屏对应的八脚排母……
直接在某宝搜索关键字“TFT 1.8 128*160”即得。
(2)M3,M2六角柱。
它们不影响功能实现,M2六角柱是为了固定显示屏的,M2六角柱可以用于在四角固定3D外壳。我M2用的铜柱,M3用的尼龙柱。
(3)BNC转鳄鱼夹探头。
其不在BOM单里,要提前买。虽然其不影响画原理图和PCB,但是需要用它来验证示波器的PWM输出和显示等。
下图为PCB板子打制好后的正反面实物图以及没有加3D外壳时的情况:
![]() |
![]() |
【第5部分】焊接
- 电阻莫拿错
- 电解电容注意正负极
- 芯片要焊芯片座
- 建议使用刀口的电烙铁
- 详见下文“复刻建议与问题解决”
- 如何测试板子?参照(BV号:BV1sJ4m1Y7Zp(45分08秒左右)
【第6部分】烧录代码
(1)用GD32 All in One Programmer下载程序时,如果是直接使用立创的Demo代码,则要先编译一下再下载hex文件,否则GD32 All in One Programmer会闪退
(2)因为Gitee里的代码Demo一直在更新,所以B站录播课上的代码显示跟Gitee里的Demo代码有不同是因为后者版本更新了。
四、复刻建议和问题解决:
鉴于官方文档和视频中已经很详细,此处写一写我对跟我一样的小白的复刻建议,以及遇到的问题的解决方法:
1、复刻建议(对官方资料的使用)
若只是想复刻实物,理论上不需要理解电路原理也行,但这算是本项目精华之一,最好要有了解。除了前文所述开源文档和B站录播课外,这部分个人推荐再结合“立创EDA”账号下直播回放视频“手把手教你做数字示波器:硬件串讲&答疑解惑”【BV号:BV1uy421B7Ew】
焊接这部分推荐先看立创EDA在B站的焊接视频,因为视频展现焊接技巧是最直接的。看完视频牢记要点后建议再查看开源文档的“1.4焊接练习”,这里的重点是找到一个html后缀的“PCB焊接辅助工具”,以来尽量避免我们小白焊接出错。
若只是想复刻实物,则只需要烧录附录的最终代码即可。烧录方式参考立创EDA的B站官方课“工程模板创建”(BV1kw4m1o73g)和官方开源文档“2.1 开发环境搭建”。
若是想要对代码有更深入的了解,除了可以跟着文档和录播课一起从点亮一个led开始学习外,可以下载每一个部分的demo代码。其在Gitee,链接见本文开头处
2、问题解决
以下说一下我当时遇到的问题和解决方法:
(1)焊接问题
*电阻焊错
从立创商城直接一键下单后获得的每种元器件专门的小袋子上都有C开头的供应商编号。在焊接极易弄混的电阻时一定要看清小袋子上的编号,若不放心,可用万用表测阻值。本小白就是因为这个而犯了低级错误
*芯片忘记焊芯片座
此次示波器用到3个8脚的芯片,它们在焊接时要用到DIP8脚芯片座。我是焊上其中一个后才知道芯片直接焊接的话可能焊接过程中高温已经把芯片内部电路烧坏了。
【焊接错误的解决方法】
嘉立创每月免费打板两次,一次5片,故若不心疼板子可换板重焊,否则可以用吸锡器。我用的普通手动的吸锡器,若操作得当也不麻烦。我当时采取两种解决解决方法:
- 电烙铁斜贴焊错处快速滑动,吸锡器抵住电烙铁吸锡
- 固定住底板,电烙铁从一侧融锡,另一侧吸锡器对准吸锡
(2)代码烧录问题
*问题1:跟随立创EDA示波器训练营视频【软件1】时,在视频11分14s开始Software Component是一片空白
解决方法:经过查询发现是Keil的版本过低。这里我选择跟随立创的开源文档的“2.1 开发环境搭建”中的教程下载Keil社区版。
*问题2:出现如下现象:
烧录Demo9-屏幕显示实验代码后,屏幕底边和右边一两行像素是几行彩色混乱的点,不过不影响功能实现
解决方法:在Demo9的代码基础上反复验证,最后发现是我的屏幕安装出现了偏移,想要实现预定效果需要将x坐标值加1,y坐标值+2,即全屏覆盖并非从(0,0)到(160,128),而是从(1,2)到(161,130)】
*问题3:出现如下现象:
烧录Demo8-输入捕获实验代码后,同样测PWM的1×2P排针,却显示电压几乎只有0V此外,烧录最终案例的代码后,经万用表测量,PWM的1×2P排针输出,但屏幕只显示界面不显示波形。
解决方法:本来做好了重新焊板子的心理预期,但是最后解决方法异常简单:用万用表测量发现电压在SW3处断掉了,然后多拨动几次就好了。(即新的开关可能需要多拨动几次才能接通)
(3)开源工程显示问题
*问题1:
如图,即将发布的开源工程那里,【设计图】那部分只有PCB部分加载出来了,但是原理图部分没有加载出来
解决方法:很简单,重新编辑文本描述,重新保存为草稿就刷新出来了
*问题2:
发布的工程在【设计图】那里的PCB部分显示的不是顶层,而是3D层,我打开工程重新调整到顶层后退出,还是显示3D层
解决方法:很简单,我发现工程在【设计图】的显示层数取决于对PCB的最后一次编辑所在的层数,因此我在顶层挪动一个焊盘再挪回来,即可解决。
五、代码简析:
(1)对于仅仅复刻项目来说,代码能够正常运行即可,但我想要更进一步,了解代码。
(2)虽然我现在没有能力去改代码,但是我可以逐渐理解它。
以下是部分分析:
可参见工程附件中“我添丰富注释版-官方最终代码工程”里面有更详细注释
main.c文件和main.h文件
led.c文件和led.h文件
官方的最终案例代码对两个绿色的LED做了初始化和开关函数的定义,但是没有使用,而是有待我们来添加功能。
usart.c文件和usart.h文件
官方的最终案例代码中应该没有直接用到串口,这里串口应该是中间过程中用来调试使用。
tft_init.c文件和tft_init.h文件
配图来自B站立创EDA录播课视频PPT截屏加我的批注
- 为方便理解,该图标注了tft_init.c文件中的各个函数与TFT需要编程的6个引脚的大致关系
- 相比录播课“屏幕显示实验”的Demo9代码相比,最终代码的tft_init.c多了很多函数名后面带16的函数,对应的是SPI0的数据位宽为16,比如Init_SPI0_GPIO16相比Init_SPI0_GPIO,只由8位数据位宽变为16位数据位宽
key.c文件和key.h文件
这两个文件主要处理三个轻触按键和一个旋转编码器。
- key.c文件中的keyValue变量和main.h的结构体Oscilloscope中的keyValue变量不是同一个变量
- 三个轻触按键和一个旋转编码器四者的EXTI都是上升沿触发,而平常默认高电平,说明是按下之后松手的瞬间进行触发。
- Init_Key_GPIO和Init_EC11_GPIO的nvic配置的中断源都为EXTI4_15_IRQn,因为正好是PB4,PB9,PB13,PB14,PB15。PB4触发中断来自旋转编码器的旋转,后面四个则来自按压接地
- Key_Handle函数每次在main.c的while(1)中先调用,然后才是后面的电压获取与显示的步骤:
freq.c文件和freq.h文件
freq文件通过通用定时器timer2,对即将进入被adc采集的已经被前端电路预处理的信号进行输入捕获,然后测量频率
分频系数设置很重要。由官方B站录播课PPT知道,用于输入捕获的定时器的时钟频率应该在被测信号频率的10~100倍。这里输入的PWM波频率为1kHz~4kHz,按照不超过1kHz的100倍且不低于4kHz的10倍来算。timer2的时钟频率应该介于4kHz~100kHz。而官方的最终代码里,timer2的分频系数为719,即计数频率(72M/720)=100_000Hz=100kHz,正好为最高值
adc.c文件和adc.h文件
- 对于adc.c文件,需要关注的是Get_ADC_Value函数,它负责将adc与dma配合获得的数据从指定存储区拿出
- 需要注意的是中断服务函数DMA_Channel0_IRQHandler:
DMA每次获取完毕300个数进入中断后都会暂时关闭通道,等到adc值都被读取了之后才会再次打开。
timer.c文件和timer.h文件
timer文件通过通用定时器timer14进行输出比较输出PWM波,这里最重要的是以下公式:
tft.c文件和tft.h文件
tft文件里有3个重要函数,drawCurve,TFT_StaticUI,TFT_ShowUI
对于TFT_StaticUI,有以下注意点
一组对比:屏幕右上角显示“PWM”的“黄底黑字”和屏幕右下角显示“占空比”的“紫底白字”都属于底部条带比字符宽且都属于静态UI,但是二者处理不一样:
对于前者是:
sprintf(showData," PWM "); //即PWM前后提前预留空格
TFT_ShowString(110,0,(uint8_t*)showData,BLACK,YELLOW,16,0);
memset(showData,0,32);
对于后者是:
sprintf(showData," ");//即先空格,后在ShowChinese显示占空比
TFT_ShowString(110,92,(uint8_t *)showData,WHITE,PURPLE,12,0);
memset(showData,0,32);
TFT_ShowChinese(118,92,(uint8_t *)"占空比",WHITE,PURPLE,12,0);
两者不同,根本原因在于前者是英文字母,后者是中文汉字,所以前者可以直接用sprintf,后者不能
因为我的屏幕有偏移需要将x坐标值加1,y坐标值+2,所以“简易示波器”的显示和屏幕最左侧竖坐标轴线的相关代码在坐标上做了微调
对于TFT_ShowUI,有以下注意点:
- 对于数字显示基本都是连用以下三个函数:sprintf(showData,"%3.0fHz ",(*value).gatherFreq),TFT_ShowString,memset2
- 对于汉字的显示直接用TFT_ShowChinese
官方的最终案例代码(截止至3月20日)中的小错误:
- main.c的初始化的注释部分,填充黑色写成了填充白色
- adc.h中最后两个函数声明了但没有用,应该是代码合并修改的时候忘记删除了
- tft.init.c函数Init_SPI0_GPIO16中:
- SPI_TRANSMODE_BDTRANSMIT应该对应的是双向的模式,后面注释却是“双线单向全双工模式”有误,因为上文函数Init_SPI0_GPIO中的:
SPI_TRANSMODE_BDTRANSMIT是单线双向半双工发送模式;
且Init_SPI0_GPIO16相比Init_SPI0_GPIO只是把8位数据位宽改为16位数据位宽,但是相应的结构体变量赋值的时候注释上依然显示是8位
六、改进方向(小白汇总大佬勿喷)
- 虽然我是一个小白,但是我有一颗进阶的心(bushi
- 虽然我现在没有能力进行改进,但是可以提前准备
- 以下的改进点基本来收录自官方B站录播课和我所见的群里的讨论
【功能改进】
(1)示波器由原来的单通道变为双通道乃至多通道
(2)添加信号发生器功能,此时除了最小系统板外还需要外接的DAC模块
【电路改进】
(1)输入信号衰减电路改进:
×1/50的衰减对本项目不实用,因为对于5V~25V的电压,如果使用×1档则会超出限额,使用×1/50档则衰减到0.1~0.5V从而易受干扰从而不精确。可以调整诸如1/3,即对应电路(模拟前端处理电路->电压衰减电路)的三个分压电阻阻值可以自己调。(但是三个电阻的阻值加起来需要超过1MΩ)
(2)信号调理->比例放大电路的改进:
可以通过调整电阻阻值来让Vout与Vin的关系式有所改变(但电阻阻值调整后依然要满足一定的约束关系)
(3)比较器测频电路的改进:
可以通过调整电阻阻值来让滞回比较器的阈值电压U+更高,U-更低,从而让测频效果更好(但电阻阻值调整后依然要满足一定的约束关系)
【原理图改进】
*元件的原理图封装图案如果不满意可以自己在库所在的地方进行修改,比如LED的图案可以填充为红色或者绿色来强调LED颜色;比如测试点的图案符号可以改小一点让原理图更美观
【PCB改进】
(1)元件的PCB封装图案如果不满意可以自己在库所在的地方进行修改,比如测试点焊盘大小可以改小一点(万用表的针头能够探进即可);电容丝印边框比实际元件大小大也可以改小
(2)导线需要通过过孔在正反面切换时,可以有两个过孔,过电流能力增强,但是要关闭布线->移除回路
【器件选择改进】
直插原件变贴片元件。(各有优劣)
*直插元件便于新手焊接,占地空间大;
*贴片元件占地空间小,焊接需要用到的不只是电烙铁
核心板和屏幕不用排母。(各有优劣)
*用排母的好处是屏幕和GD32都可以即插即用,但不够定制化
*不用排母直接集成足够定制化,但是容错较低
改变探头:
原来是BNC转鳄鱼夹探头,可以换成专业示波器的无源探头,这样可以利用探头自带的×10档对信号有一个初步的衰减,而不是仅靠衰减电路来衰减了。
【代码改进】
*波形固定时程序直接进入死循环,没法进行其他操作,比如波形固定的时候按动按键是无效操作。不过这不算太大影响,不添加功能的话应该还好
七、附件目录:
【原版-官方最终代码工程】3月20日从Gitee下载的官方最终工程,我没有做任何改动
【我添丰富注释版-官方最终代码工程】
【代码学习笔记】有不够完整的记录,具体参见里面自带的readme
【3D外壳包】提供了3D外壳文件,给出了STL,STEP,OBJ三种后缀的文件供随时取用
【示意图包】包含了本描述中的所有图片
【演示视频】因为附件要求每份大小不超过50M,所以只有20s,且视频略糊,请谅解
【带3D外壳的示意视频】本视频仅4s,仅作为有外壳的证明,具体功能演示见“演示视频”
设计图

BOM


评论