2023年电赛国赛H题,虽然说是大失败,但是想法和一些东西都是有的,分享给下一届备赛的同学了。
首先是C信号采集1024个数据,丢给fft,用的是stm32官方库函数,然后得到频谱图,就是幅频特性图,然后因为20kHz到100kHz,分辨率为5kHz,因此可以用遍历的方法,把5和其倍数频率附近3个点的幅值相加,大于某个阈值判定为主峰,两个主峰比较好找。正弦波就一个主峰,三角波基频、三倍频、五倍频都有,但是可能出现30k三角,90k正弦的情况,因此判断三角波可以直接找五倍频,但是这个阈值要合理设置,炼丹一下就找出来了,具体逻辑看fft函数
接着用dds合成波形就可以输出,但是这个题最大的难点在于A和A’同频稳定显示,因为生成波形A’用的是单片机的晶振,A是信号发生器的晶振,因此必定出现“同频率不同源”,本质还是频率微小差异,可能就是小数点后几位的频率差异,在示波器上都可以看出来。
解决办法就是就是控制dds的时钟,dds时钟是由单片机TIM给的,这个pwm波精确给定我们没有做出来,但是看到有的组做出来的,想法就是用主从时钟、定时器级联等方法,精确控制pwm波的数量,想法有了但是主从时钟没有搞明白(裂开),最后没有做出来
那怎么自动调?得知道输出的时钟和C信号快了还是慢了,想法是对C进行施密特触发器整型成矩形波,对于整型得到的信号管脚上升沿外部中断,对C周期,C反正最低5kHz,进行测量,但也没有做出来。
用5kHz周期的时间内测量有C的几个脉冲,比如4个,因为我知道5khz的一个周期就是200us内,单片机定时器可以从0计数到n,比如定时器时钟2M,200us就是0-400,接着用一个可变周期定时器(用输出比较中断,到某个数就讲TIM -> CNT = 0),C输入的管脚上升沿触发一个外部中断,这个外部中断打开那个可变定时器,可变周期定时器到400的时候输出比较中断,看如果只计数到3个说明可变周期要长一点,设置成401继续开始上述过程。显然,400这个数越大越精确,因为stm32 pclk2时钟用的是72M,400*36=14400。
1、如果说得到14399,C信号的时钟14400个周期=单片机时钟14399个周期,单片机快,假设单片机TIM时钟72M,给dds的时钟是2MHz的,就是说定时器A36分频,计36输出一次,那么需要另一个定时器B给这个定时器开关,定时器B计数到14399就把A关50周期再打开,应该可以用滴答定时器(delay里面用的那种)。
2、假如最后得到到14450,那么说明C信号的时钟14400个周期=单片机时钟14450个周期,就是单片机的频率低了,慢了,定时器A35分频,会比2M的dds所需时钟快,2.0571MHz,2.0571M*(14400/14450)=2.0500MHz,就是说相对于C信号的时钟来说单片机35分频就是2.05MHz,那么就是说定时器B计数到2M的时候,关停定时器A0.05M个周期的时间
可以看出,单片机快了明显好调整,那么就可以用dds输出的时候,频率控制器写大一点,有一种单片机快的错觉,去降低单片机输出的时钟频率
就是说思路是有了,技术力不够,实现不出来(叹气ε=(´ο`*)))唉)
代码:
https://github.com/superleo111/electron_design/tree/main