DIY万用表——基于STM32G031最小系统模块
本次寒假在家一起练项目,我和我的队友选择了由硬禾学堂提供的STM32G031板卡,选择这一板卡的初衷主要在于其开发万用表感觉离我们较为贴近,毕竟我们在上学期的电焊课程中也有过电焊万用表的经验,算是在硬件上有过一定的了解。借助本次机会,我们又从芯片开发的软件角度对万用表的工作原理有了更深刻的理解。
由于我和我的队友在本次项目之前都还尚未接触过单片机,没有学习过微机原理相关的知识,所以在本次板卡的开发过程中也算是比较磕磕绊绊,下面由我来简单分享一些我们本次学习历程中遇到的一些问题与收获。
首先,在第一次由洪学长分享的视频教学里,我们通过事先安装好的STM32IDE和STM32Programmer两个软件(当然,其实也安装了STM32CubeMX软件,后续也尝试用了一下,但是遇到了一点小意外,后面再说),先在IDE里设置好了引脚,然后保存生成了代码,由于没什么经验,当时把视频放到0.7倍速看了好几遍,确保设置基本上都调成一样的。在这之后,我们了解到了从Driver里面的函数库去寻找需要的功能函数,例如GPIO_READ_PIN,GPIO_WRITE_PIN之类的。在翻转函数和延迟函数的作用下,我们按照着视频在主函数中添加了两行代码,点了debug按钮,结果当时就是这两行代码,还报了好几个错,后来在查看了引用函数的定义之后,发现是敲代码之前未定义里面涉及的变量,也忘了在头函数里面声明调用。改过之后,代码总算是跑过了,虽然RAM和FLASH的使用率和视频里的还是有些出入,但是工程构建成功了,终于可以烧录了。之后到了把elf文件拷贝进programmer的步骤,一开始,我和我的队友们因为觉得充电线不具有传输功能,卡了一会儿,直到我们从任务管理器里找到了外接接口COM(这个名字可能有出入,反正把线一拔,没了的那个就是传输线准没错)。接下来就是调整板卡到读入模式了,不得不说,这个按住boot和reset一开始着实有些令人困扰,好在经过多次尝试,总归是连上了,在把文件烧录进板卡之后,我们先是实现了点灯功能,接着又弄成了串口输出测试,当时弄的是点灯同发送字符串同步,灯每闪一下输出一行“Hello world!”,附图如下:
之后,在第二次分享的视频里,我们先是了解了i2c的相关知识,从引脚设置界面Connectivity里的硬件i2c到视频分享里提到的软件i2c,都给我们带来了不小的启发。根据视频里的引导,我们选择了soft_i2c,并没有勾选i2c1或者i2c2,在此过程中,我为了尽可能地保持和视频同步,也从网上查找了一些delay延时函数以及其它需要用到的函数的知识。除此以外,oled屏的相关函数一开始我都对着视频里去一行行地敲进去(当时可以说是敲的浑浑噩噩,几天一直对着IDE软件不断地输入,比对)。在我将代码和引脚配置都尽可能地还原之后,我又开始不断地跑debug,一遍遍地改错,这个过程就跟打地鼠一样,但好在也都挺了过去,在工程构建成功之后,我将文件烧录进板卡,非常不幸的是,在我按下了reset之后,板卡没有任何反应,当时真的有些崩溃,后来经过我们的不断试错,最终将问题锁定在了OLED_INT()初始化函数上(我们将将主函数里的代码大部分都注释起来,尝试看一下最开始的clear函数和int初始化函数,是否正常运作,并在其后添加了一行sprintf函数),在将初始化函数修改之后,我们终于让OLED屏幕上有了显示,附图如下:
在OLED屏有了输出之后,我们将后续注释掉的代码重新加入进去,这次总算是实现了ADC的测试功能,屏幕上三个ADC口不断地跳变着电压值,我们将三根杜邦线接在ADC口上,然后找来了一节干电池,进行了电压测量的实验,结果较为贴近,约在1.3V到1.6V之间,与万用表实际测量结果较为吻合(实际用到的仅adc1与adc2,adc3未用到),附图如下:
最后,基于第二次视频里提到的借助芯片板本身存在的内阻进行分压,比较待测电阻与内阻所占电压的比值,从而得出待测电阻的阻值,具体实现过程因为我们是临时找的收音机上的电阻进行测量,这里就不附图了,在视频链接里呈现。
以上就是我们小队本次项目的学习历程,下面谈一谈我们未达成的功能:
1.测量电容、电感等元器件;
2.测量二极管、三极管等元器件;
再讲一点个人对尚未实现功能的理解,以及后续打算继续尝试的方向:
根据我从视频里以及网上获取到的资源,对于测电容(电感类同)应该是基于Ic=CdUc/dt这个公式,先对电容元器件充电,再根据其放电的时间,以及充放电过程中电压降的变化来算出电容容值;而对于二极管、三极管的测量,二极管应该是先通过导通方向判断PN结类型,接下来其实和测电阻差不多,三极管则也是需先判断出三个引脚的具体对应,就了解到的情况大致是要变换接线,连续测六次得出。
这些是我们后续打算再尝试的目标。