本次电赛做的是A题-THD值检测装置。
电赛方案:
单片机:MSP432E401Y
ADC支持高频率2MHZ
外围硬件方案:前端放大器采用增益可调的放大器,通过调节放大器增益使输入信号控制在1-2v之间。
底层外设配置方案:使用PWM+TIM作为adc触发源,使用dma进行数据传输。使采集数据可以达到2MHZ。在 使用定时器作为触发源的时候,因为该单片机的最高定时器触发时间支持到1.25MHZ,所以在1.25mhz采样率一下的使用使用定时器触发。在1.25mhz--2mhz的时候使用pwm触发。(在这里做区分的原因是,tim定时器作为触发源,进行触发adc的时候,出发周期比较稳定。而使用pwm作为触发源的话,出发周期,并不能严格控制在2mhz,设置完周期之后,会有一定的周期偏移。)(在增益控制上,直接检查采集到的信号值的最大值,使最大值控制在一定范围内)
关于信号采集速率的设计:根据奈奎斯特定理,采集100khz的5次谐波需要1mhz以上的采样率,但是实际测试过程中1mhz的采样率,在采集信号的时候,信号采集出来的数据会有偏移,信号能量较弱,所以最终使用的是2mhz的采样率的方案,即基频*20.
fft处理的方案:在一开始的时候想了2种方案,一种是直接fft之后进行计算,另一种是在fft之前进行一次加窗(即进行一次fir滤波)。经过matlab仿真之后,发现,对于采集到的数据,进行加窗之进行fft与未加窗进行fft结果没有区别,最后未使用加窗的方案。fft算法使用的是arm官方的arm_math.h数学库。
基频计算方案:本次测试信号范围在1khz-100khz,采用的方案是,将采集的信号仅从一次fft,之后进行范围的区分,计算出是基频频率。
关于thd值的计算:计算出基频之后,针对基频设置相应的采样率进行数据采集,之后将采集到的数据进行fft运算,然后在特定的数据段查找最大值,实现每个谐波的最大值查找。查找完成之后,调用相关的运算公式计算结果。
在显示方面:屏幕采用串口屏幕,单独编程,之后单片机通过串口与屏幕进行通信。波形显示方面,将每个周期采集的时候,通过使用前面特定的数据,进行显示,同时发送给屏幕的时候,也会发送给手机app端。
问题:1、单片机的adc采集速率在高于600ksps的时候,一次dma数据传输完成之后,会导致之后读取的数据不能正常读取,读取的值都是错误的。
解决方案:在超过600ksps的时候,每读取完成一次之后,会进行一次系统重启。
问题2:某些频段使用计算出来的基频进行,采集的数据进行fft之后,会产生较大的误差,但是自己设置频率,采集之后,有一部分变好了,还有一部分未变好。
解决方案:未解决。
原因分析:可能是硬件电路的问题,在单片机的输入引脚有电阻电容配置不对。同时基频计算算法存在问题。