基于GD32E230C8T6的数字示波器
文章目录
- 基于GD32E230C8T6的数字示波器
- 基于GD32E230C8T6的数字示波器
- 实物演示
- 电路原理
- PCB设计
- 软件
-
- LED
- 按键
- 串口
- 中断
- ADC采集信号
- 定时器
- PWM输出
- 输入捕获测频率
- 屏幕
-
- tft_init.c
- tft.c
- main函数
基于GD32E230C8T6的数字示波器
实物演示
https://www.bilibili.com/video/BV1qJ4m177jP
基于GD32E230C8T6的数字示波器
代码:https://download.csdn.net/download/weixin_52849254/88951435
电路原理
模拟前端处理电路
在整个示波器电路设计过程中,模拟前端处理电路是最为重要的,其中大量应用了模拟电路的知识,其中包括输入交直流耦合切换电路、输入信号衰减电路、以及信号调理电路所组成。
交直流耦合电路
信号类型可以分为直流信号和交流信号,现实中的信号往往都是都不是理想波形。比如直流电源信号应该是一条水平的直流信号,但都会存在电源纹波(交流信号);在采集交流信号时也可能混入直流信号对波形的峰峰值造成影响。
为了保障对输入交流信号的准确测量,利用电容通交隔直的特性,将电容串联到电路中就可以过滤到信号中的直流分量,这就是交流AC耦合的概念。而直流DC耦合就是不对输入信号做任何处理
电路中通过一个拨动开关SW2对输入交直流耦合信号进行切换,当开关2与1接到一起时为直流耦合,当开关2接到3时为交流耦合。
这里的电容如何选择大小呢?
要解决这个问题,那就需要了解电容的频率特性,理想状态下隔直电容的选择应该越大越好,但是由于不同容值的自谐振频率不同,低于自谐振频率时电容呈现容性状态,高于该频率时存在感性状态。电容越大,其自谐振频率越低,简单来说就是大电容通低频,小电容通高频。
如下图可知当瓷片电容为0,1uF(100nF)时,其自谐振频率为4Mhz,一般要求电容的截止频率fc=1/5*fo,其中fo为电路中工作频率。由此可知在该项目中100nF是足够应用的,但如果输入信号频率更高,就应该选择更小的电容。
信号经过交直流耦合选择电路后由开关SW3选择两个通道,开关2和3接到一起时,输入信号直接流入后级的电压跟随器电路;当开关2和1接到一起时,输入信号经过R7、R11、R14三个电阻构成的电阻分压网络后将信号衰减到了1/50倍,即
由此可知,当输入信号幅值较小时,可优先选择低压档位,如果测量时不确定输入信号幅值可先用高压档位测量后如满足低压范围内,可用低压档位测量以得到更为精准的测量结果,同时保护电路。
输入信号衰减电路
该项目中使用的探头为BNc转鳄鱼夹探头,非专业示波器探头,仅对电路进行简单分析,此处不进行展开说明更多关于探头选择与阻抗说明。如使用专业示波器的无源探头进行测量,由于探头上有一个×1和×10的档亻立选择,当档位为×10时可以通过调整探头上的衤卜偿电容或者是电路中的c10进行匹配已得到准确的测量效果,其中C10一般为可调电容,实际大小与各板间电容特性有关。
信号调理电路
在信号调理电路中包含了一个电压跟随器以及由运放构成的信号放大电路,在分析该这部分电路时需要掌握运放的虚断与虚短原理。
虚断:
理想运放的输入阻抗是无穷大,然而真实的运放输入阻抗却是有限的。如果给运放的输入端加一个电压,然后测量该输入端的电流会发现电流读数接近为0,感觉运放内部断开,没有电流流入一样,但实际又是连接的,这种现象称为虚断。
也可以用欧姆定律U=I*R来理解,当电压一定时,电流与电阻成反比,电阻无限大那电流也就无限小接近为0。
虚短:
在运放处于深度负反馈时会出现虚短现象,使两个输入端的电位相等,就象两个输入端短接到了一起,可以近似为v+=v-。
在负反馈中,运放的输出信号的一部分被取出并反馈到输入端。这种反馈作用使得运放的两个输入端(正输入和负输入)的电压差趋近于零,、两个输入端的电压几乎相等。因为尽管运放的两个输入端在电气上并没有被直接短路、,但由于负反馈的作用,两个输入端的电压却几乎相等,就象它们被短路了一样,故称为虚短。
电压跟随器
电压跟随器的特点是输出的电压幅度和极性都与输入电压相同,且具有输入阻抗高,输出阻抗低的特点,常用于做缓冲级和隔离级。
由于运算放大器的虚短特性,V+=v-,由于Vin=V+,Vout=V-,所以Vin=Vout,即TP6测试点电压与TP7电压一致。
反相比例放大器
输入信号从运算放大器的反相输入端输入,具有输出极性相反且放大输入信号的功能。
当运放正向输入端接地,IJ+=OO此时构成反相比例放大电路,由运放的虚断特性可知反向输入引脚流入运放的电流为0,可以R13和R15可以看做串联,所以流经电流相同。由虚短特性可知v+=v-=0,i+=i-=0,由此可得.
推出反相比例放大器计算公式为
将Vi=1V,R13=20K,R15=10K带入得Vo=-0.5V
串联电路中电流相等,输出电压为-0.5伏。
同相比例放大器
输入信号从运算放大器的同相输入端输入,具有输出极性相同且放大输入信号的功能。
当运放反向输入端接地,U-=0。此时构成正相比例放大电路。由运放的虚断特性可知运算放大器两个输入引脚流过的电流为0,即流过R4的电流为0,Vin=V+。可以看做R13和R15串联,所以流过的电流也相同。由虚短特性可知两个输入引脚的电压相同,即V+=v-,所以有Vin=V+=V-。Vo与R13和R15构成回路,则流过的电流为·
单独对R13来看,流过的电流也等于它两端的电压除以它的电阻值,代入Vin=V+=V一得到以下公式:
由此可以推导出
将Vin=5/3V,人3=20K,RI5=10K带入得Vo=2.5V。
同向比例放大电路验证正确,输出电压为2.5伏。
综合电路:
将正相比例放大电路与反相比例放大电路结合起来共同分析:
当运放正相入端接地,U+=0时,
代入R15=10K,R13=20K,V1=-0.5Vi。
当运放反相输入端接地,U-=0时,
代入R15=10K,R13=20K,Vin=5/3V,V2=2.5V。
当两电路共同作用时vout=V2+V1=2.5+0.5Vin,整理可得·
Vo信号将直接接到单片机的ADC引脚,由于单片机采集到ADC的电压范围值为0、3,3V,由此可以计算出该示波器输入电压范围。
当输入信号Vin不衰减时,将Vo=0、vo=3.3V分别代入公式得,
当输入信号Vin衰减1/50时,将Vo=0、Vo=3。3V分别代入公式得.
得到以下结论·
.当开关5和3接到一起时,可以测量的输入信号幅值为-1.6-5v
.当SW5开关2和1接到一起时,可以测量的输入信号幅值为·80V一250V
比较器测频电路
为了实现频率检测的功能,将ADc输入信号通过一个滞回比较器对输入信号进行比较,实现频率的测量功能。滞回比较器是属于电压比较器中的一种,常规的电压比较器是一个单限比较器,电路中只有一个阈值电压,但在输入电压在阈值附近有微小变化时都会引起输出电压的越变。
为了增强电路的抗干扰能力,在单限比较器的基础上引入了正反馈,保障了在一定范围内信号的稳定性。通过滞回比较器电路后输出一个方波信号,使用单片机的定时器捕获功能计算出输入波形的周期大小。
滞回比较器电路的阈值电压需单独对运放输出结果进行分析,原始电路如下图所示:
当输出为高电平时,输出端上拉到高电平,这时等效电路如下中图,算得Uth=U+=2.214V。
当运放输出为低电平时,输出端接地,等效电路如下右图,算得Utl=U-=2.172V。
下图绿色线代表信号输入电压变化肩况,从0电位上升,初始输出状态为高电平,输入电压达到2,214V时,
输出信号变成低电平,直到输入信号低于下限阈值2,172V时输出变为高电平。可以根据比较器当前的输出状
态来确定下一个变化电平的阈值,当输出为高电平时使用的是高阈值Uth,输出为低电平时使用低阈值Tt|。
之所以将阈值设置接近是为了避免信号干扰造成的误识另刂。
下图绿色线代表信号输入电压变化肩况,从0电位上升,初始输出状态为高电平,输入电压达到2,214V时,AAAAAAAAAAAA输出信号变成低电平,直到输入信号低于下限阈值2.172V时输出变为高电平。可以根据比较器当前的输出状态来确定下一个变化电平的阈值,当输出为高电平时使用的是高阈值Uth,输出为低电平时使用低阈值Ttl。之所以将阈值设置接近是为了避免信号干扰造成的误识别。
注意事顶:
此处阈值比较器运放正向输入信号为固定电平,若使用带有DAC输出的单片机,可自由配置该点电位大小,从而改变直电压,实现对触发模式的设置。
电源电路
USB电源输入
该项目使用GD32最小系统板为核心,板载亍5V转33V降压电路,所以在设计扩展板时只需要设计一个5V电源输入电路即可,这里选用了主流的type-c为输入接口,且该接口只有两根线,插件封装,方便新手焊接学习,但需要注意的是这个pe·c接口仅用于供电,不能传输数据,如果需要使用传输数据,可以使用核心板上的Type–接口。sw1为电源总开关、C1为输入滤波电容,RI是LED1的限流电阻。
负电压产生电路
除了电源输入电路为,为保障运算放大器对于负电压的测量性能,使用了XD7660负压产生电路得到一个负电压,该芯片夕卜围电路简单,只需要两个电容和一个二极管即可工作,理论上输入电压为+5V,也可以输出一个5V的电压,由于芯片内部存在一定压降及转换效率,实际测量负电压为还3V左右,也能满足运算放大器的要求。
单片机电路
该项目使用了由立创开发板团队推出的GD32最小系统板为主控,这款开发板是由立创开发板团队联合兆易创新推出的一款全国产的开发板,板载CH340下载芯片,只需要一根数据线就可以对板子进行烧录与串口调试,同时兼容STM32最小系统板的尺寸与引脚配置,可以直接进行替换。
人机交互电路
液晶屏显示电路
1.8TFT是一款彩色显示屏,具有128×160个彩色像素,使用四线spI通信方式与单片机进行连接,一共有八根引脚,模块引脚说明及与单片机连接情况如下所示:
屏幕购买链接:
https://item.taobao.com/item.htm?_u=n34jmok8fa2c&id=709270273013&spm=a1z09.2.0.0.67002e8dxYMtHQ
高清SPI TFT显示彩屏0.96寸1.3寸1.44寸1.8寸 OLED液晶屏 st7735-淘宝网 (taobao.com)
旋转编码器电路
旋转编码器属于一种特殊的按键,该项目使用的ECII旋转编码器有五个引脚,其中DE两个引脚类似于普通按键引脚,按下导通,松手断开,其余ABC三个引脚用于检测旋钮的转动方向,c脚为公共端,直接接地就行。
在旋转编码器时,A和B两个信号引脚存在相位差,也就是有一个引脚信号变化后另一个引脚信号再跟着变化,即两个引脚不同时变化,通过检测哪个引脚先变就能判断是正转还是反转功能。
LED灯指示电路
LED指示电路设计比较简答,采用低电平驱动的方式,当单片机引脚输出为低电平时,LED两端存在电势x差,LED点亮;当单片机引脚输出为高电平时,LED灯熄灭。
按键控制电路
除了旋转编码器外,该项目还使用了三个独立按键对系统进行控制,三个按键一侧直接接地,另一侧连接到单片机引脚,当单片机引脚检测到按键按下时,单片机引脚直接接到GND接地,单片机收到该引脚接地信号的反馈后再去实现对应的功能,为节约硬件成本,可以在软件设计时引入消抖功能,避免机械按键抖动时的误触发。
波形输出接口
除了示波器检测功能夕卜,单独引出了一个pwM信号用于模拟一个简易的函数发生器功能,可以通过改变输出PWM的频率和占空比输出一个简易方波信号输出。
PCB设计
走线长度尽量短,走线沿焊盘方向引出
PCB设计尽量避免产生锐角和直角,产生不必要的辐射干扰
走线过程中不允许出现一端浮空走线,避免天线效应
电源滤波去耦电容走线时保证电流先流过电容滤波再给器件供电
在设计走线时,保证信号其回路面积尽可能小,即最小回路原则PCB走线时尽量加宽电源与地线宽度,地线>电源线>信号线宽度
走线以直线为主,如需拐弯时拐角以135。钝角或圆角优先,减少直角的使用,
走线线宽电源线宽大于信号线,该项目中信号线走线宽度为15mil,电源走线为20mil,GND和AGND网络使用铺铜的方式连接;
建议优先使用顶层走线,走不通的地方使用过孔建立顶层和底层的连接后转到底层继续走,底层走不通同样可以放置过孔换到顶层连线,
对AGND和GND需要以0欧姆电阻处为分界单独覆铜铜,这里需结合PCB布局情况来调整覆铜范围,
覆铜完成后如果还存在飞线,可通过在存在飞线的位置放置对应网络的过孔或者是调整走线位置网络能够连接,也可以采用手动接线的方式消除飞线。
走线完成后可在"工具"菜单栏选择泪滴添加,加强焊盘与走线的连接,最后再进行覆铜操作,如果对走线有移动调整也应使用快捷键shift+B进行重建覆铜。
软件
LED
LED灯发光原理
LED灯内部是一个半导体晶片,一半是P
型半导体,另一半是N型半导体。这两种半导体连接起来时,就形成了P一N结,当电流通过导线作用于这个晶片时,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光的形式发出能量,这就是LED灯发光的原理。
LED灯驱动原理
驱动LED灯,也就是使LED灯点亮,首先查看原理图,查看LED灯引脚的连接关系,可通过对应单片机引脚输出高低电平,从而改变LED灯两侧电势差形成电流回路,点亮LED
示波器板led原理图
/*
* 函数内容:初始化LED引脚
* 函数参数:无
* 返回值: 无
*/
void Init_LED_GPIO(void)
{
//使能时钟
rcu_periph_clock_enable(RCU_GPIOC);
//设置输出模式,不上下拉
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14);
//设置输出模式,不上下拉
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
//设置输出类型,推挽输出,50Mhz
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
//设置输出类型,推挽输出,50Mhz
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
//默认不开灯
CLose_LED(led2);
CLose_LED(led3);
}
/*
* 函数内容:打开对应LED灯
* 函数参数:无
* 返回值: 无
*/
void Open_LED(uint8_t value)
{
switch(value)
{
case 1:
gpio_bit_reset(GPIOC,GPIO_PIN_14);
break;
case 2:
gpio_bit_reset(GPIOC,GPIO_PIN_15);
break;
default:
break;
}
}
/*
* 函数内容:关闭对应LED灯
* 函数参数:无
* 返回值: 无
*/
void CLose_LED(uint8_t value)
{
switch(value)
{
case 1:
gpio_bit_set(GPIOC,GPIO_PIN_14);
break;
case 2:
gpio_bit_set(GPIOC,GPIO_PIN_15);
break;
default:
break;
}
}
- Init_LED_GPIO 函数:
-
- 这个函数用于初始化LED灯所连接的GPIO引脚。
- 首先,它使能了GPIOC的时钟。
- 然后,它设置了GPIOC的两个引脚(PIN_14和PIN_15)为输出模式,并且没有启用上拉或下拉电阻。
- 接着,它设置了这两个引脚的输出类型为推挽输出,并且输出速度为50MHz。
- 最后,它调用CLose_LED函数来关闭LED灯(即初始化时LED灯是关闭的)。
- Open_LED 函数:
-
- 这个函数用于打开LED灯。
- 它接收一个参数value,这个参数的值决定了哪个LED灯被打开。
- 如果