(开源)基于STM32F103RCT6的多功能仪器(示波器+信号发生+万用表+7.4V锂电池平衡充+可调电压输出)
基于STM32F103RCT6的多功能仪器(示波器+信号发生+万用表+7.4V锂电池平衡充+可调电压输出)(开源)示波器:衰减、增益、触发沿、触发方式、峰值、峰峰值、周期、占空比、采样频率,栅格电压、栅格时间、参考/触发线、波形移动缩放DAC:频率、波形种类万用表:多档位电压、电流、电阻、电容/电感测量可调电压输出3.1-13.2V,最大1A7.4V锂电池平衡充,1A以内
·
视频链接:https://www.bilibili.com/video/BV1oPn2zZExh
所有文件链接:https://gitee.com/ret2nuh/Oscilloscope_Multimeter_7.4V-Battery-Charge_Based_on_STM32F103RCT6

功能概述:
- 示波器:衰减、增益、触发沿、触发方式、峰值、峰峰值、周期、占空比、采样频率,栅格电压、栅格时间、参考/触发线、波形移动缩放
- DAC:频率、波形种类
- 万用表:多档位电压、电流、电阻、电容/电感测量
- 可调电压输出3.1-13.2V,最大1A
- 7.4V锂电池平衡充,1A以内


参数:
- PCB板尺寸:99x58
示波器:
- 采样频率:
档位1:(484Hz-58.8kHz)电位器设置64档(最小分辨率911Hz)
档位2:(88.9kHz-800kHz)电位器设置64档(最小分辨率11.1kHz) - 带宽:未测(无信号发生器)(前级运放增益后带宽为300kHz)
- 测量范围:±25V 最小分辨率:16mV (原设计参考电压2.5V,后使用3.3V)
- 波形实时显示(自动适应屏幕(Y=0轴位置不固定)),触发或暂停后,可X、Y轴移动(128档),Y轴缩放(0.2-1,1-5各16档),无X轴缩放(X轴缩放通过改变采样频率实现)
信号发生器:
- DAC波形输出(正弦波、方波、三角波、锯齿波),频率设置在77Hz-4.44kHz,电位器设置64档(最小分辨率68Hz)
万用表:
- 万用表误差来源(1%电阻误差+ADC基准电压误差+温漂…)
- 电压测量:2档(0-3Vref)(0-21.5Vref)
- 电流测量:2档(0-0.4A)(0-3.5A)(误差来源:+运放误差)
- 电阻测量:4档(基准电阻0.1k、1k、10k、100k)
- 电容测量:最终只设了一档,测量范围22nF-2.2uF,22nF-220nF误差在10%以内,220nF-2.2uF随容值增大误差增大至50%以内
- 电感测量:(1mH-68mH)(代码未写)
可调电压输出:
- SX1308 DC-DC可调电压输出3.3-12V(理论值),3.1-13.2(实际值),最大1A,功率5W以内
- SX1308 输出电流测量范围0-0.94A
7.4V锂电池平衡充:
- 充电电流在1A以内
经测量基准电压3.3V波动基本在0.5%以内,示波器增益(模拟开关+运放)、衰减(电阻分压)测量后整体输入输出误差在5%以内

接口/开关:
- 跳线帽(交直流耦合、衰减倍数、电容电感测量开启、电感3档位)
- 拨码开关(电容3档位、(电压2、电流2、电阻4)档位)
- 测试点(用于测试)
- DC口((电压、电流、电阻、电容)测量、可调电压输出、锂电池充电、锂电池直接输出)
- 排针(串口、SW口、屏幕)
- Type-C(5V供电)
- 拨动开关(锂电池供电、供电切换)
- 香蕉头(信号输入)
程序框图:

杂谈:
-
项目目的:学习电路、Pcb、Stm32及相关软硬件,现学现卖;
-
主控为stm32f103rct6,基于hal库;
-
屏幕为2.8寸(320x240)旧屏幕(电阻触摸),40pin,实际使用的口差不多一半吧,8位数据口+锁存器,非spi;
-
电路主要就是一些芯片的典型应用,运放的放大、跟随、比较功能,电压电流电阻的计算,还有一个三点式振荡电路,通过测频来测电容、电感
-
代码相关:
- 没有使用图形库,所以如果想移植不同大小屏幕的话就比较繁琐了,界面参考了B站up主 AxinDIY 的示波器界面(他好像参考的正点的界面),所以代码写界面虽然枯燥但也没花太多时间(感谢AxinDIY的分享,参考了界面,成品外观,部分电路)(另外感谢 嘉立创 的免费打板(一个6层、一个4层)和示波器案例(提供了示波器的大致概念、框架、思路));
- . 因为功能比较多,所以要触控的话,位置判断比较多,比较繁琐,界面参数相关的绘制也比较多;然后由于只有一个拨盘电位器,需要切换很多功能,也是比较繁琐的,但总体难度是不大的;
- stm32主要使用功能:GPIO、Usart调试、TIM+ADC+DMA、TIM+DAC+DMA、TIM(输入捕获、定时)、按键外部中断、屏幕相关;
-
波形显示相关:
- 3个buf(只存储Y轴值),一个存储ADC输出值buf1,一个存储将ADC输出值转化为屏幕显示Y轴位置的值buf2,一个存储移动缩放后的值buf3;
- 默认使用buf2绘制波形,单次触发或屏幕暂停后使用buf3绘制波形;
- 流程为显示波形,显示参考线,仅清除有波形的位置,仅清除参考线,绘制格栅,新波形显示…(整屏刷新试过太慢了);
- 实际绘制波形区域大小为250x150;
- 波形连线因为是相邻点只需要画竖线就好了,不需要计算斜率;
- 单次/自动触发,这里自动触发未做触发处理,就是将采集到的信号进行显示
-
使用软件: AD24、立创EDA、LTspice、STM32CubeMX、VsCode+EIDE、Keil5
-
芯片使用情况:
RAM: 9.5% 4.5KB/48.0KB
ROM: 13.9% 35.5KB/256.0KB
IO口基本上算是用完了

原理图:



硬件问题及解决:
- 参考电压原设计是2.5V,但未连到stm32相应引脚,最后使用的3.3V(解决方案:代码解决)
- 电荷泵电路连线出错,有交叉(解决方案:物理切割加飞线解决)
- 屏幕(硬件未使用spi接口,8位数据口+锁存器输出)8个数据端口连接stm32的引脚未连续且在两个GPIO组(解决方案:驱动写数据写命令的时候8个IO口单独判断操作,但降低了速率(本来几个指令的事一下子翻了好几倍),对屏幕刷新率有一定影响)
- 屏幕40pin(20+20)布局左右反了(解决方案:有17+17个口左右只有一个口使用,直接飞线左右相连,剩下3+3个写代码的时候位置互换)
- 振荡电路存在问题(解决方案:修改电路加飞线解决)
- 拨盘电位器电压错误,连到了5V,应该为3.3V(解决方案:代码解决,同时物理标记3.3V的位置,拨动的时候不要拨过头)
- 拨盘电位器封装错误(解决方案:飞线解决)
- 连接上下两块板子的灰排线座放不下(解决方案:物理切割灰排线座)
- 蜂鸣器驱动电压不够(解决方案:蜂鸣器也不是一定要用)
- 锂电池平衡充位置设计有点问题,充电不太方便(解决方案:下次注意)
- 外观上还有改进空间,可以更紧凑(解决方案:下次一定)

存在问题:
- 屏幕刷新率不高,帧速率只有3~4
疑惑:
- 该振荡电路不太适合用来测量电容、电感,理论值和实际值偏差较大,代码上是用了一个系数才接近实际值(也有可能是使用的电感误差太大),疑惑的点是,在仿真里加大三极管偏置电压是会增大输出正弦波的幅值,而实际板子上是在正弦波的基础上叠加一个直流电压(波形整体向上移,峰峰值不变),不知道什么原因
如果有下一版:
- 可以考虑使用外部参考电压;
- 修正电荷泵电路;
- 屏幕换成常见的SPI接口(方便他人复刻),软排线(缩小体积),程序上使用DMA搬运数据;
- 测量电容、电感的电路替换成电桥测量电路;
- 拨盘电位器封装修正,电压连接参考电压;
- 2x5p封装直接使用灰排线座封装,留足空间;
- 蜂鸣器驱动电压改为5V;
- 改善布局,修改部分元器件封装;
- 提高屏幕刷新率;

更多推荐



所有评论(0)