赞
踩
参加了今年的电赛,赛前也准备了许久,各种驱动、外设的使用、pid等等,等到时候正式参赛再学习具体需要哪方面的逻辑进行组合,可惜,最后还是有所欠缺,没能获奖,但是基本还是做了许多,不是很甘心最后的结果,最近也没有什么机会能重新继续进行下去,便于此先行小结。
大致流程描述如下:
加法器叠加->stm32的AD转换->fft->DA输出->AD与DA进行比较延时实现同频
原题位置:https://res.nuedc-training.com.cn/topic/2023/topic_102.html
简要概括就是将两个信号通过加法器进行相加,再通过分离电路分离出来两个信号,最后将输入与恢复的输出同频显示在示波器上。
输入信号为三角波和正弦波,频率10k~100kHz,步进为5kHz,峰峰值不小于1V。
*能控制A’和B’的初相位差(均为正弦波,且频率A是B的整数倍),分辨率5°,0~180可调。
这部分简单,网上随便就能找到,主要问题就是要选个合适的运放,因为100kHz也不低,需要带宽够避免失真,一般直插的TL082、5532就行。注意要双电源供电,一般这种运放只有双电源时才有最好的效果,单电源等效的双电源也不行(可能当时是我电路有问题,各位到时可以自己试试);而且输入信号是正弦波有负值的。双电源可以用芯片max7660或是max660产生,或是供电就是双的。
叠加后要送入单片机,一般都是0-3.3V或是0-5V的供电,所以要给输入一个直流偏置,运放实现。
通过单片机的AD、DA实现,由于当时只会stm32F1系列,故基于此进行之后流程,F4系列有更高级的DSP库可以更简单实现相应功能,同时也有全硬件、dds的处理方法。
首先是AD,默认的时钟是72M,而stm32F1的AD时钟频率要低于14M,所以分频后最快为12M,按照采样时间计算公式计算T=1.5+12.5个周期,最少14个周期,所以最后采样频率为$ \frac{12}{14} $kHz,不方便计算同时容易丢失精度,所以将默认72M改为56M,这样按照上述方法就可得到1M的采样率,这样即使是最高100K的输入每周期也能有10个采样点。
由于这个操作是不断进行的所以要使用DMA不断地读入才能保证1M的采样率还不影响主程序的进行。
对输入的叠加后的信号进行fft变换即可得到两个峰值,即对应的两个频率,可以用matlab先行仿真保证逻辑正确再写入单片机的程序内,避免将来产生问题时困惑。
其次stm官方也提供了fft的库,直接下载导入对应位置即可使用,这里直接采用256个点的fft。
得到频率后就可以进行输出了,同样设置输出的频率为1M,输出模拟量时有个技巧,不在输出的时候现算,提前设置静态数组,将对应频率的波形数据写入,用空间换时间(速度),输出时直接调用。
这样的输出还是有问题,由于信号发生器与单片机并不同源,所以不可能同频,会有几十Hz的差异从而产生飘移。
解决方法采用卷积。将输入信号的波形与标准波形进行卷积,即可知道差距是多少,因为只有两波形完全重合之时卷积结果才是最大的,找准这个点就可知道要如何调节,即延时(周期-最大值位置)后重新输出。不断进行此操作即可同频。但同时还要注意会有半个相位的问题。
这些处理过程切记要写在DMA之外,不然…呵呵
单片机程序:点击跳转◔.̮◔✧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。