本篇旨在记录我大一时参加2023全国大学生电子设计竞赛的经历以及获得省级二等奖的过程和心得体会。希望能为后来的大一同学提供一些经验,鼓励更多的同学在大一时就积极参与大学生电子设计竞赛!!!
备赛时间为7月1日-8月1日,比赛时间为8月2日8:00-8月5日20:00。
1 备赛(7月3日)
这一天,指导老师安排全体参加电赛的同学到理工实验楼集合。集合完毕后,我见到了团队中的另外两名队友,大家互相进行了自我介绍,增进了彼此的了解。根据指导老师的建议,每个团队需要两名同学负责软件,一名同学负责硬件。我们团队比较幸运,因为我是大一的学生,尚未学习数字电路和模拟电路的相关知识,因此无法承担硬件的任务。正巧一位学长表示他只擅长硬件,于是最后一位学长负责软件。值得一提的是,这位学长在软件和硬件方面都有一定的基础,正好可以兼顾两者,而设计报告的撰写也暂时交给了他。
2 备赛(7月7日)
老师单独为所指导的两支队伍召开会议。当时,每支队伍各有一名队员在场,我便向老师询问信号题中软件的具体工作是什么,以及软件最终需要用单片机实现哪些功能。尽管老师之前给我们提供了需要掌握的软件技能,但我仍感到有些迷茫,目标不够明确。
老师认真解答了我的疑问,并讨论了往年学长学姐在处理类似题目时遇到的困难。通过这次讨论和我表达的想法,我的备赛目标渐渐变得明确和清晰。抽象来说,我需要用单片机实现类似示波器的功能,这让我在学习上有了明确的方向。同时,老师与另一个队伍讨论的硬件内容也让我对硬件电路的工作有了更深入的了解。
3 电赛软件STM32学习过程(7月8日-7月30日)
GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏
GPIO_Mode_AF_PP = 0x18 //复用推挽
GPIO_SetBits //设置成高电平
GPIO_ResetBits //设置成低电平
ATK-4.3寸 TFTLCD模块:
STM32能使用PA0口输出72M赫兹的频率
测频率方式:(想法)
硬件需要将失真信号(三角波、正弦波等奇怪的波使用电路转化为0~3.3v的方波)软件用定时器PA0端口的输入捕获 计数时间从小(72us)到大 读CCR的值直至能够读到1 可获得到方波的最长高电平(低电平)的时间(即正弦波的最高点或最低点) 然后以该时间间隔计次 CCR读值到2 为半个周期 读值到4 为全周期时间(有误差)(开启其他计时器进行计时)
闸门时间T一般是1s
频率的定义是:1s内出现了多少个频率的周期,那么频率就是多少HZ。(即计次N为频率)
测频法和测周法都会有误差。
测频法:适合用于高频信号 测量结果更新慢 数值相对稳定 测量的是在闸门时间内的多个周期 所以自带一个均值滤波 数据比较稳定
测周法:适合用于低频信号 测量结果更新快 数值跳变也快 测量一个周期就能出一次结果
出结果的速度取决于待测信号的频率 但结果值会受到噪声的影响 波动比较大
一般采用右对齐 读出来的数据就是采样ADC的值
滤波的方法:
- 设置上下阈值避免抖动
- 均值滤波
- 裁剪分辨率 把数据的位数去掉
ADC1->DR ADC1是ADC1外设寄存器的基础地址 DR是结构体成员 这条语句让DR在ADC1的基础上偏移 指到了DR数据寄存器的地址
Alt+鼠标左键框选可以快速修改值
采样频率,也称为采样速度或者采样率,定义了单位时间内从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔。通俗的讲采样频率是指计算机单位时间内能够采集多少个信号样本。
FFT学习:
谐波定义:供电系统谐波的定义是对周期性非正弦电量进行傅立叶级数分解,除了得到与电网基波频率相同的分量,还得到一系列大于电网基波频率的分量,这部分电量称为谐波。
谐波产生的原因:由于正弦电压加压于非线性负载,基波电流发生畸变产生谐波。主要非线性负载有UPS、开关电源、整流器、变频器、逆变器等。
在振动学里认为一个振动产生的波是一个具有一定频率的振幅最大的正弦波叫基波。这些高于基波频率的小波就叫作谐波。
采样频率(fs)= 定时器2溢出频率=SYSCLK/预分频值/溢出值。
FFT后的输出不是实际的信号频率,需要经过转换。f(k)=k*(fs/N),其中
f(k)是实际频率,k是实际信号的最大幅度频率所对应的数。
如果还要求信号相位,则FFT运算后最大幅度对应的数组OutBufArray[]要转化成实部加虚部的形式:假设OutBufArray[m]=Num=a+b*i (i是虚部单位,a=Num/65536,b=Num%65536)。相位Pha=atan2(a, b),注意结果是弧度制。
fft采样频率 为信号的3到6倍 幅值最准确
根据采样定理,采样频率必须是被采样信号最高频率的2倍。这里,我要采集的是音频信号,音频信号的频率范围是20Hz到20KHz,所以我使用的采用频率是44800Hz。那么在进行256点FFT时,将得到44800Hz / 256 = 175Hz的频率分辨率。
并将该采样数据存放到了long类型的lBufInArray数组中,且该数组中每个元素的高16位存储采样数据的实部,低16位存储采样数据的虚部(总是为0)。
cr4_fft_256_stm32(lBufOutArray, lBufInArray, NPT);
其中,参数lBufOutArray同样是一个long int类型的数组,参数lBufInArray就是存放模拟采样数据的采样数组,NPT为采样点数256。
调用该函数之后,在lBufOutArray数组中就存放了进行FFT运算之后的结果数据。该数组中每个元素的数据格式为;高16位存储虚部,低16位存储实部。
各次谐波的幅值(即各个频率分量的幅值)
由奈奎斯特采样定理可以知道,fs必须≥信号最高频率的2倍才不会发生信号混叠,因此fs能采样到的信号最高频率为fs/2。
如果做了16个点的FFT分析,你原来的模拟信号的最高频率f=32kHz,采样频率是64kHz,n的范围是0,1,2...15。这时,64kHz的模拟频率被分成了16分,每一份是4kHz,这个叫频率分辨率。那么在横坐标中,n=1时对应的f是4kHz, n=2对应的是8kHz, n=15时对应的是60kHz,你的频谱是关于n=8对称的。你只需要关心n=0到7以内的频谱就足够了,因为,原来信号的最高模拟频率是32kHz。
第一,必须知道原来信号的采样频率fs是多少,才可以知道每个n对应的实际频率是多少,第k个点的实际频率的计算为f(k)=k*(fs/n)
第二,你64kHz做了16个点FFT之后,因为频率分辨率是4kHz,如果原来的信号在5kHz或者63kHz有分量,你在频谱上是看不见的,这就表示你越想频谱画得逼真,就必须取越多的点数来做FFT,n就越大,你在时域上就必须取更长的信号样本来做分析。但是无论如何,由于离散采样的原理,你不可能完全准确地画出原来连续时间信号的真实频谱,只能无限接近(就是n无限大的时候),这个就叫做频率泄露。在采样频率fs不变得情况下,频率泄漏可以通过取更多的点来改善,也可以通过做FFT前加窗来改善,这就是另外一个话题了。
3 备赛(7月31日-8月1日)
临近比赛,我在学习了STM32的基础底层知识后,开始在网上寻找示波器的示例程序。在CSDN上搜索后,我终于找到了一款符合电赛要求的示波器程序。这个程序不仅能够显示Vpp、Vmax、Vmin、频率等参数,而且代码旁边都有详细注释,正好是我所学习的所有底层代码的组合。
我认真阅读了这套代码,并完全理解了其中的内容。同时,我学习了如何用软件实现FFT变换,掌握了频率计算的基本方法。对于这套代码,我还进行了完善和优化,解决了一些程序中的bug。在这个过程中,我对定时器的使用和中断有了更深入的理解,尤其是对定时器的PWM输出,即通过输出比较产生上升沿以触发ADC中断的机制有了更清晰的认识。此外,我还使用了DMA中断,进一步提升了程序的性能。
4 比赛(8月2日)
电赛的第一天早上7点30分,我们拿到了题目,并在团队内部进行了分析。今年我们有准备的仪器仪表题要求必须使用TI公司的开发板,但由于我们没有学习过TI的开发板,最终决定暂时放弃这一题,初步选择了H信号题。
大约在8点30分,我们前往一间大教室,聆听老师对本届大赛每道试题的讲解和分析。还没到中午,我们团队就下定决心选择H题,计划利用所学知识制作一套信号分离装置。经过方案分析,我们发现有很多可行的选择,大家都充满信心和决心,想要做出一套完整的信号分离装置。我至今铭记一位指导老师的话:电赛四天三夜,只要你们做出一套完整的装置,这次电赛就算成功了!
随后,我投入了软件方面的工作,发现采样率分成了1024点,这可能导致我们跳过所需测量的频率(我们需要尽量减少离散采样)。此外,Mag值中有两个较大的值,这也引起了我的注意。
5 比赛(8月3日)
电赛第二天,我意识到其实我并不需要测量幅值,主要目的是准确显示频率。我初步完成了软件部分的基本要求:分离信号A和信号B。信号A和信号B均为正弦波,频率分别为50kHz和100kHz。要求装置能够正确分离出信号A'和B',且峰峰值均不小于1V。
接着,我解决了如何找到正弦波和三角波的准确频率的问题。发现当三角波的频率低于一定值时,它将缺失二次谐波。同时,我还解决了如何区分A波和B波的类型。需要注意的是当B波为A波频率的2倍或3倍的情况,正弦波与正弦波、正弦波与三角波的组合还是无法区分。
在思考后,我想到了一个比较可靠的思路,即测量没有二次谐波的三角波频率。我总结出一个结论:获取最大幅值处的频率为FFT_mag[i]。如果3*i<512,那么二次谐波在3*i处。如果3*i>512,那么谐波会在512-(3*i-512)处,即3*i关于512的对称位置。
6 比赛(8月4日)
电赛的第三天,我发现前一天通过测量没有二次谐波点的三角波频率的方式会导致许多误判,因此决定换个思路,寻找三角波和正弦波的区别。我发现可以通过幅值来判断波形是否为三角波,这样会更快更准确。
凌晨3点左右,我的下一个任务是使用STM32F103战舰控制DDS9959输出两路正弦波,但我遇到了几个问题:首先,可能在单片机工作过程中,无法切换DDS输出频率;其次,我发现电赛第一天时,有人提到的令人头疼的漂移问题。这时我已经困得不行,直接趴下睡着了。
早上7点起床后,我们讨论了如何解决漂移问题。我开始在网上寻找相关资料,发现如果使用同一时钟源,等频信号可以实现稳定触发;而不同时钟源的信号,无论是等频还是非等频,都无法稳定显示。通过总结,我认识到漂移问题只能减小而无法完全消除,但可以做到让人眼看起来波形不漂移,这有点类似于动态数码管的显示,利用了视觉暂留效应。
7 比赛(8月5日)
电赛的第四天,我尝试了减小漂移的第一种思路:寻找输入混合信号C的最高电压。这个过程正好利用FFT采样结合DMA中断实现。我计划采集1024个采样点,重复15次,并取最高电压数组中的前7个值作为标准。在后续采样时,若采到的值超过ADCMAX[7]或ADCMAX[8],就立即开启DDS信号发生器,以保证相位一致,从而减少漂移。然而,经过尝试后,发现效果并不理想。
接着,我换了一个思路,结合中断和相位变化,但尝试后效果仍然不佳。于是,我再次调整方案,考虑多次重置DDS,并计算响应时间来实现稳定。我认为这种方法可行性在80%左右,经过实验,确实能够减小漂移,但仍存在一些误差,未能做到让人眼看起来完全没有漂移。尽管如此,时间也不太够了,我已经尽力减小漂移。
下午和晚上,我还帮助解决了一些硬件上的问题。最终在封箱时检查,除了漂移问题尚未完全解决,其余要求均已全部完成。
8 比赛详细经历及感悟(比较长,个人感触很深,可略读)
通过这次电赛的经历,我学到了很多,个人的解决问题能力和团队合作能力都有了提升。在参加电赛之前,我感到有些迷茫,因为我一直认为电子设计大赛需要扎实的专业知识作为基础,才能完成电赛题目或项目。
由于我在蓝桥杯单片机设计与开发竞赛中获得了全国二等奖,陈老师找到了我,询问我是否想参加今年的全国大学生电子设计大赛。在我当时的认知中,电赛是涵盖单片机应用相关知识的。然而,那个暑假我还参加了机器人大赛和物理创新实验竞赛,我觉得这些比赛已经很多了。尽管我很想参加电赛,但又担心自己的知识储备不足,无法应对这样的大赛。在参加物理创新实验竞赛时,叶学长的一番话让我明白了一些道理。他说,电赛在我们学校一般是大二时参加,如果有机会的话,一定要参与。比赛不一定非要以获奖为最终目的,重要的是通过比赛促进学习。大一参加电赛是积累经验的好机会,就算没有获奖,到了大二时再参加电赛,之前积累的经验会非常有用,那时就不会再害怕比赛,也不会担心自己学得不够。
听了学长的话,我下定决心要参加今年的全国大学生电子设计竞赛。不论有多困难,我对使用STM32这一块有信心,能够做好!
大赛的备赛从7月1日开始,我制定了暑期计划,决定在7月15日至电赛结束期间全力以赴地备赛电赛。在7月1日至7月15日这段时间,机器人、物理创新竞赛和电赛三个比赛同时进行。
7月3日,电赛在理工实验楼召开了第一次集体会议。在会上,我了解到电赛的基本要求和团队能力。比赛通常会提供七道题供选手选择,而我发现每年都会有一道与小车相关的题目。这类题目所需的外设与我准备的机器人大赛相似。当时我心里想着,如果其他题目太难,小车题可以作为我的保障。但后来听陈老师说,每年做小车的队伍太多,获奖的难度也很大,因此我对小车题也有了一定的认识。
由于我没有学习数字电路和模拟电路,但对单片机的理解还不错,所以我在团队中担任主要的软件开发任务。我对自己有信心,因为我在蓝桥杯比赛中使用的是51单片机,而电赛使用的是STM32。此外,机器人大赛也使用STM32,所以学习电赛相关的STM32外设对我来说并不困难。陈学长虽然不擅长软件,但硬件方面表现不错,因此他主要负责我们团队的电路设计部分。赵学长在蓝桥杯中与我参加了同样的项目,并取得了省三的好成绩,已经学习了数字电路和模拟电路,对软件和硬件都有一定的了解,所以让他负责撰写最终报告,对软件和硬件进行全面总结。在软件或硬件的工作量较大时,赵学长也能帮助完成相应的任务。
我觉得这样的团队组合非常完美。在后续的电赛过程中,我逐渐体会到这样的搭配确实非常适合比赛。三天后,我们开始独立准备各自负责的部分。7号当天,陈老师为他所带领的两支队伍召开了单独会议,明确了我们两支队伍的备赛方向,主要是针对信号和仪器仪表题目。对硬件方面有不理解的地方,可以向周老师请教,软件方面则可以咨询陈老师。针对这类题目,我们可以将软件和硬件分开准备。通过与老师的讨论,我明白了软件方面需要准备的内容,并为自己设定了一个目标:在比赛前制作一个STM32示波器。
在7月30日那天,我找到了一套完整的示波器示例程序,文章详细介绍了F103系列如何实现软件FFT变换。我从中学到了FFT变换的原理,对信号的峰峰值、幅值、模值和周期等物理量有了更深刻的理解。同一天,另一个队伍的硬件高手也发现了一些宝贵的硬件资料,我们俩当晚都学习到很晚。
8月1日晚上,我们将准备好的物品搬到了苏州大学内部的实验室,为第二天的电赛做好准备。上午,指导老师带领我们分析电赛题目,最后一致决定选择H题。下午,我们向电赛官方提交了选题结果。
在这之后,我开始整理自己在软件方面需要完成的任务。在讨论任务分配时,赵学长原本想负责FFT变换以分离信号的部分。然而,到了8月30日,我对程序有了深入的理解,对使用FFT也有了一定的信心。不过,由于我没有学习DAC信号产生的相关知识,最后我们决定由我负责信号分离部分,而赵学长负责信号产生部分,陈学长则负责制作硬件电路所需的加法器、升压装置和增益电路等。
在8月2日凌晨3点左右,我们队的另一位软件负责人赵学长发现,使用DAC产生100kHz的正弦波非常困难。于是,他决定更换为DDS9959模块来生成正弦信号,并成功修改了代码,使DDS能够产生我们想要的正弦波。在进行了一系列减小漂移的操作后,我又接到了一个新任务:由于DDS模块只能产生正弦波,我们需要设计一个电路,将正弦波转换为三角波。同时,我们还需要软件控制输出,以切换正弦波和三角波的输出。因此,我想到了使用继电器来控制输出通道。题目中还要求输出的两路波形能够改变相位,这就需要使用按键来控制相位的变化。在8月4日晚上六点,我完成了继电器和按键控制相位的功能。
后来,我又想到了一种减小漂移的方法:多次重置DDS以计算响应时间,从而达到稳定。在测试过程中,我们发现了一些问题:首先,ADC采集的最大电压值存在误差,触发点不一定是最大值,这使得同步变得困难;其次,硬件的响应时间不理想,计算周期过短,且没有条件触发,最终导致漂移问题无法完全消除,但我们已尽量减小了漂移的速度。到8月4日晚上10点时,软件部分工作就此结束。
之后,我们将重点转向硬件电路,负责将待测的正弦波转换为三角波,并进行正弦波的放大。8月5日凌晨2点,我对自己的代码进行了注释,以便后续参考或更改。在当天晚上7点左右,我们完成了测试、封箱,提交了技术报告,电赛的实验部分也随之结束。
8月7日,我们学校的所有队伍前往南京邮电大学进行作品测评。在测试过程中,我们发现了一种在学校示波器上从未出现的高频杂波,这导致输出波形在示波器上失真。此外,由于读题时的误解,我们的相位设置相反。当时我们对获奖的希望感到渺茫,但并没有气馁,因为在比赛中,我们都学到了很多在书本上无法获得的知识,特别是如何将书本知识运用到实际项目中。
最终,在8月11日公布的比赛成绩中,我们感到非常高兴,因为我们获得了江苏赛区的二等奖!
9 软件比赛过程笔记
一、信号C进入ADC引脚 通过FFT分离出A B两个信号波
细节:1.FFT 采样率分成(1024点)可能跳过所需要测量的频率(尽量减少离散采样)
2.Mag值(有两个较大值)
二、A B两个信号波输出
方案一:dds模块输出正弦波 三角波
方案二:STM32直接DAC输出正弦波、三角波
笔记:
8月2日:
- 正弦波幅值变化:先上升一段 再下降一段(512组数里面只有一次基波 没有谐波)
- 三角波幅值变化:先上升一段 再下降一段(有多次:基波频率最高 谐波频率是基波频率的倍数)
已测:如果要判断分离出来的波是三角波还是正弦波 并 考虑幅值准确性(采样频率为信号的3到6倍幅值最准确) 所以采样频率需要是基础频率的4~6倍(大于4并小于等于6)
暂时:250kHz(可正好测出来50K和100K) 2 144
18:37明白:FFT不需要测幅值,只要把准确频率搞出来
20:31 初步完成基本要求(2)软件部分:分离信号A B
第一天结束
8月3日:
- 解决正弦波和三角波找准确频率
- 三角波低于一定频率会没有二次谐波
- 解决了A B波不成倍数的类型区分 目前:特殊情况(B波是A波频率的2倍或3倍)正弦波和正弦波 正弦波和三角波暂时无法区分问题(13:43)
低电平:0.8V 高电平: 2.8V
晚上18点左右发现一个比较可靠的思路
测量没有2次谐波点的三角波频率:
20KHz (46)二次谐波在136点 原频率三倍
25KHz 同上
30KHz 同上
35KHz 同上
40KHz 同上
45KHz(45KHz三角波的二次谐波正好是90KHz的基波) 50KHz 同上
55KHz 同上
60KHz 同上
65KHz 同上
70KHz 同上
75KHz(在450KHz的采样频率下正好被卡掉)
80KHz(182)在478点
85KHz(192)在444点
90KHz(205)(正好为2次采样点410点)
95KHz(216)二次谐波点在376点
100KHz(228)二次谐波点在341点
总结:
获取最大幅值处频率为FFT_mag[i];
如果3*i<512,那么三角形谐波在3*i处
如果3*i>512,那么谐波在512-(3*i-512)处,即3*i关于512的对称处
A B波成倍数:
(双正弦):
A:20(三角波) B:60(正弦波) 解决
46:400-425 137:410-440 138(正弦):>100 138(三角):125-145
方案一 227 228 229:<10(正弦) >10(三角)三次谐波点
方案二 46:>370(正弦) <370(三角)
25(一会儿三角波 一会儿正弦波) 70(正弦波)解决
57:600-635 159:545-560 171 170 172:<25(正弦) >25(三角)
方案一 171 170 172:<25(正弦) >25(三角)
方案二 57:>550(正弦) <550(三角)
25(三角波) 75(正弦波)解决
57:>550(正弦波) <550(三角波)
30(一会儿三角波 一会儿正弦波) 85(正弦波)解决
30(三角波) 90(正弦波)
68: 550-580 445-470
>510(正弦) <510(三角)
35(三角波) 100(正弦波)解决
80:495-520 400-425
>460(正弦) <460(三角)
(A三角 B正弦)
A:25(一会儿三角波 一会儿正弦波) B:30(正弦波) 解决
57:490-520(三角) 600-630(正弦)
<560(三角) >560(正弦)
25(一会儿三角波 一会儿正弦波) 35(正弦波)
(25点的问题)
30(三角波) 50(一会儿三角波 一会儿正弦波)
30(三角波) 100(一会儿三角波 一会儿正弦波)
第二天结束
最终决定换另一个思路 找三角波和正弦波区间分界线来判断更快更准
20KHz:
46:400-425(正弦) 320-340(三角)
>370(正弦) <370(三角)
25KHz:
57:600-630(正弦) 490-520(三角)
>560(正弦) <560(三角)
30KHz:
68: 550-580(正弦) 445-470(三角)
>510(正弦) <510(三角)
35KHz:
80:495-520(正弦) 400-425(三角)
>460(正弦) <460(三角)
40KHz:
91:625-650(正弦) 500-530(三角)
>580(正弦) <580(三角)
45KHz:
102:470-500(正弦) 380-410(三角)
>440(正弦) <440(三角)
50KHz:
114:575-595(正弦) 460-485(三角)
>530(正弦) <530(三角)
55KHz:
125:600-625(正弦) 485-505(三角)
>550(正弦) <550(三角)
60KHz:
137:420-440(正弦) 335-360(三角)
>390(正弦) <390(三角)
65KHz:
148:620-635(正弦) 500-520(三角)
>570(正弦) <570(三角)
70KHz:
159:545-565(正弦) 440-460(三角)
>500(正弦) <500(三角)
75KHz:
171:510-535(正弦) 395-470(三角)
>490(正弦) <490(三角)
80KHz:
182:630-640(正弦) 505-520(三角)
>570(正弦) <570(三角)
85KHz:
193:460-480(正弦) 370-390(三角)
>425(正弦) <425(三角)
90KHz:
205:585-605(正弦) 465-500(三角)
>540(正弦) <540(三角)
95KHz:
216:600-620(正弦) 485-500(三角)
>550(正弦) <550(三角)
100KHz:
228:435-450(正弦) 350-370(三角)
>400(正弦) <400(三角)
8月4日 1:27
FFT分离(频率 类型)结束
8月4日 3点左右 用STM32F103战舰控制DDS9959输出两路正弦波
发现问题:
1:可能在单片机工作过程中无法切换DDS输出频率
2.发现第一天网上就在说的头疼的漂移问题:
5点睡觉-7点醒然后工作
早上讨论怎么解决漂移 网上找资料:
由于信号发生器与DDS的晶振不同 很难保证波形稳定 其中一路会漂移
10:11 尝试第一种思路(50%可行):
找输入混合信号C的最高电压,正好FFT采样通过DMA中断产生,打算1024采样点采15次,取最高电压数组前7个数为标准 再采样取点 在采到大于ADCMAX[7]或[8]的时候 立即开启DDS信号发生 保证相位一致 减少漂移(最终效果不好)
14:25 进中断+相位改变 效果不大(放弃 换思路)
高电平触发继电器切换到另一端
16:36已经增加相位控制按键和继电器控制模块
18:30 建议多次重置dds 算响应时间来达到稳定(80%可行)
发现问题:
- adc采集最大电压值有误差 触发的点不一定是最大值点 难以保证同步
- 硬件响应时间不好计算 太短 没有条件触发
漂移问题无法完全消除 但已尽可能减小不稳定的情况(22:20分结束)
漂移问题结束 第三天结束
待测正弦波转三角波 正弦波放大
0:00-2:48 把我的代码加了注释 方便借鉴
之后帮忙解决硬件电路问题
6:48封箱完结 问题:漂移
第四天结束
后续解决:硬件加低通滤波器 软件用数字滤波器 准确测量出C值的频率给dds实时更新
该装置可参加的比赛:光电设计大赛 嵌入式芯片与系统设计竞赛FPGA赛道
10 信号分离装置(H题)设计报告
本设计以STM32F103单片机为核心,制作一个信号分离装置。该装置能够使用加法器电路将两个不同频率的正弦波或三角波信号相加输出信号C,通过分离电路从信号C中分离出与原信号频率、类型相同的信号。本设计采用单片机AD转换进行采样,并通过傅里叶变换来分离混合信号,利用DDS可提供较高频率、高精度、灵活性强、稳定的优势准确输出分离后的信号。设计中运用了电压抬升模块使信号电压值在单片机采样范围内,使用放大电路使输出信号幅值符合题目要求。通过比较器以及积分电路输出三角波。
关键词:STM32F103单片机,加法器,AD转换,DDS,FFT变换
1 设计方案工作原理
1.2 技术方案分析比较
(1)加法器模块
对于加法器模块有以下一种方案
该方案利用NE5532芯片制作一个双电源供电且增益为1的同相加法电路,可以把输入信号A和输入信号B进行相加得到一个输出信号C,实现C=A+B。采用同相加法电路可已得到一个相位相同的输出信号,不必在增加反相电路,从而减小实验误差。
(2)分离电路模块
对于分离电路模块有以下两种方案
方案一:该方案为纯单片机方案,使用单片机模数转换功能采集信号C的电压值,对采样结果进行傅里叶变换。通过傅里叶变换结果得出信号A与信号B的频率值,并区分输入波的类型。再通过单片机数模转换输出相应频率与类型的信号A’与 B’。该方案对电路要求低,但由于单片机时钟频率,能输出的数模转换信号频率有限,难以精确输出题中所需频率的正弦波与三角波,故不采用此方案。
方案二:该方案以单片机为主,电路为辅。提取信号频率值的部分与方案一相同。提取出频率后通过单片机控制AD9959使用DDS的方法输出相应频率的正弦信号经过放大后接入三角波转换电路并由单片机控制是否转换。最后输出信号A’与 B’。该方案使用DDS可以较好输出所需频率的信号,故采用此方案。
1.2 系统总体方案
2 硬件电路设计
2.1 加法器电路
图2 加法器仿真电路
2.2 电压抬升电路
图3 电压抬升电路图
电压抬升电路使用NE5532,考虑到相加后的波形需经微控制系统采集后计算输出分离波形,并且STM32微控制系统的I/O口可接收信号范围为0~3.3V,所以需将相加后的波形的电平抬升后才可无失真采集。故设计此电平抬升电路,通过给正向输入端1.3V左右的分压偏置,实现电平抬升,电平抬升后仍满足Vomax<3.3V,所以电压放大倍数设置为1。抬升后的电压输入,接入STM32的PC4。
2.3 DDS电路
本电路使用SPI接口的AD9959,通过STM32单片机控制,使用DDS产生正弦波。AD9959与单片机的接口信号如表1所示。
2.4 信号转换电路
信号转换电路讲DDS输出的正弦信号先转换成方波,再转换成三角波,经过AGC输出峰峰值大于1V的三角波信号,比较器和积分电路如图5所示。
图5 信号转换电路
2.5 继电器电路
STM32单片机控制继电器达到控制输出信号类型,若输出端连同放大电路则输出正弦波,若输出端连接信号转换电路则输出三角波。两个继电器的控制端口连接到单片机的PC1和PC3引脚。
3 软件设计
图6为系统软件流程图,开始程序初始化后,进行ADC采样。STM32采样完成后使用FFT函数进行傅里叶变换,变换后进行数据处理,根据结果求得输入信号的频率与类型。得到频率与类型后使用DDS输出波形并控制继电器的连接。
4 测试过程与结果
4.1 测试过程
使用以下仪器SDG1050 信号发生器、SDS1102X 双踪示波器、SPD3303D 直流电源,完成了对输入信号、加法器输出信号、DDS产生的波形等进行了测试。
4.2 测试结果
图7 加法器输出波形图
图8 输入波形与输出波形图(三角波)
图9 作品实物图
5 总结
本系统使用STM32F103为主控,进行信号采样,通过傅里叶变换,得到频谱,通过对频谱数据分析处理,判断出输入的两个信号频率,控制DDS的输出。若判定输入信号为三角波,在DDS9959的输出端加上信号转换电路与AGC模块;若判断输入信号是正弦波,在DDS9959的输出端加上放大电路,以此保证两种波形的幅值超过1V。实验结果表明,本系统实现了信号分离装置的设计与制作任务,性能可靠稳定,完成基本要求和发挥部分的全部要求。
参考文献
[1] 俞一彪 孙兵. 数字信号处理 (第4版) [M].东南大学出版社,2021.
[2] 康华光 张林 主编. 电子技术基础(模拟部分)(第7版)[M]. 高等教育出版社,2021.
[3] 亚德诺(ADI)半导体. 直接数字频率合成器(DDS)AD9959数据手册. https:// www.analog.com/cn/products/ad9959.html.
11 总结
在暑假期间,我参加了全国大学生电子设计竞赛。赛前,我主要负责团队的软件部分,学习了STM32定时器、LCD显示屏等相关知识,并掌握了信号发生器和示波器等设备的使用方法。
在比赛中,我们首先对所有题目进行筛选,确定了选题。接着,我们研究思路并设计方案。完成软件和硬件的设计后,我们进行了装置的测试、组装和封箱。最终,我们成功实现了混合信号的分离,制作了一套信号分离装置。
我们前往南京邮电大学进行了作品测试,最终获得了江苏赛区的二等奖。在这次比赛中,我学习了FFT变换在STM32中的应用、模拟电路、数字电路、电路设计以及外设模块等多方面的知识,丰富了我的知识面。同时,我也深刻认识到团队分工和合作的重要性。在备赛、比赛以及总结阶段,我们都能学到很多新知识,使我的暑期生活更加有意义。