电赛第一次积分赛遇到的问题以及备忘——基于STM32F401
在第一次积分赛过程中遇到了好些问题,其中有些不免难绷。
本次积分赛的大头实际是由模拟方式来实现的,我所负责的单片机部分只占据了很小的一块,然而仅仅是这么一点就已经足以令我烧脑了。
先来看一下赛题,对于我这种萨哈卜楞登小白来说,这题目看上去是相当复杂的,但是在后面的网上到处查找资料的过程中,发现以几百赫兹的信号来说,它还是过于简单了一点。实际还是太菜了
这道题目思路上其实是比较简单的,单片机实现一个分频滤波移相输出???炸裂,写下这篇md的时候,我还
是感觉它好复杂。
总而言之,这次项目我只负责了最后的幅值测量工作和数字显示工作。这一部分的内容实际上在互联网上是有很多资料的,理论上来说做出来应该是很轻松的。后来才发现,在互联网上尤其是csdn上的内容,绝大多数都是掐头去尾,要不就是很复杂的可以,恨不得从盘古开天辟地开始写起。这不就是我嘛
下面开始正题:1.对正弦波幅值测量
2.oled显示
正弦波幅度值测量
最开始我想到的便是ADC+TIM的工作原理正是一个周期内取很多点将它们存入DMA,那么我们只需要将这些点的幅值数据取出来,进行一个比较不就可以了嘛?
后来才发现了对于我这样的一周速成单片机学习者的弊端:那就是不会或者说很难自己去读懂一个函数,或者是cubemx里那些网上例程所没有用到的配置可以怎么进行使用,当然这也是如今的网络教学资源的一个问题,那就是很多边缘化的,或者说复杂的配置直接一笔带过。
当然了,这也是初学利用cube进行开发的一个通病,那就是很难去看懂或者使用库里的其他函数。
幅度值测量实现方法
利用fft将最后合成的近似方波信号转换成频域信号,将频域的幅值检测出来1、3、5次谐波就是要的峰值
这里我给出的实现方法在自我感觉上是绕了个弯子,毕竟我在fft之前,已经用了adc采集到数据了,为什么不能用adc直接去采集过程中生成的100、300、500HZ呢?科协学长的授课中似乎fft是实现测量的方法,所以我也计划在此后自行实验一下利用adc直接采样正弦波,经过我的幅值测量函数来实现测量幅度值。
oled显示方法
关于oled,这就不得不说到spi和i2c这两种通讯方式,本次也是通过i2c来实现的。
主要出现的问题在于spi通讯一是需要七个引脚,其中有三个是需要自己配置的gpio引脚,厂家给的资料并不全面,oled驱动代码可读性很低,再加上网上的资料大多是i2c的,这就大大提升了我的移植难度,总之,此次本来一开始是用的spi协议驱动,调试了一天半整的时间不出图形最后作罢重新买了一个i2c协议的屏幕,玩味的是7针spi与i2c共用的屏幕只有十块,而只支持i2c的4针脚屏幕价格却是前者的两倍,看来市场决定价格有点道理,消费者们可能选择i2c的还是多一点的。
接下来的计划
接下来会首先将上文提到的adc直接采样正弦波得幅值以及oled spi显示搞定,然后着手将本次赛题中出现的所有单片机可以实现的任务去一一利用单片机解决。
再之后,可能会投入到fpga的学习中,这才是以后乃至工作中会用的比较多的工具。
在这过程中,我需要将常用的一些滤波算法等等东西打包封装成自己的库,以备不时之需。