|

楼主 |
发表于 2024-3-29 11:38:10
|
显示全部楼层
本帖最后由 飞向狙沙 于 2024-3-29 12:18 编辑
通过ADC+DMA 160KHz频率采样1280个点,然后5个点一组滤波,去掉最大值去掉最小值剩下3个值求平均得到256个点,然后使用stm32的fft库进行傅里叶变换
滤波算法,实际上这里设想的是通过判断最大值来区分使用一级放大还是二级放大,但是进行ADC+DMA顺序采样时发现有问题,按照通道1-通道2的顺序配置,但是实际采样结果有时候1在前,有时候2在前,感觉自己的ADC配置有问题,临时只处理2级采样
- void rawDataProcessing(){
-
- uint16_t max,min;
- uint32_t sum;
- //¼ì²éÊý¾Ý,È·¶¨·Å´ó¼¶±ð
- ZOOM_LEVEL=2;
- for(uint8_t i=0;i<160;i++){
- if(ADC_Value[i]>ADC_OVERFLOW_MAX){
- ZOOM_LEVEL=1;
- break;
- }
- }
- //printf("level:%d",ZOOM_LEVEL);
- //Â˲¨ È¥³ý×î´óÖµ ×îСֵ Ç󯽾ù
- for(uint16_t i = 0; i < ADC_POINTS; i+=5)
- {
- uint16_t pos = i;
-
- sum=ADC_Value[pos];
- max=sum;
- min=sum;
- for(uint16_t j=1;j<5;j++){
- uint16_t temp=ADC_Value[pos+j];
- sum+=temp;
- if(max<temp){
- max=temp;
- }
- else if(min>temp){
- min=temp;
- }
- }
- FFT_DataIn[i/5]=(sum-max-min)/3;
- //printf("ADCF:%u\r\n",FFT_DataIn[i/5]);
- }
- }
复制代码 256点的fft,函数没啥好说的,官方提供的库,汇编写的
- cr4_fft_256_stm32(FFT_DataOut,FFT_DataIn,FFT_POINTS);
复制代码 160kHz频率采样滤波,1kHz分量正好落在第8个点上,然后按照理想值硬算
- int16_t X,Y;
- X=FFT_DataOut[8]&0xffff;
- Y=FFT_DataOut[8]>>16;
- float val=sqrt((float)(X*X+Y*Y))*2;
- sumVal+=val;
- sumCount++;
- if(sumCount==10){
-
- sumCount=0;
- sumVal/=10;
- LCD_ShowFloatNum1(0,0,sumVal,8,RED,WHITE,16);
- printf("val:%f",sumVal);
- sumVal=sumVal*3.3/4096/18/18/0.02/2;
- LCD_ShowFloatNum1(16 ,30,sumVal*1000,5,RED,WHITE,16);
- printf(",R:%.3f\r\n",sumVal);
- sumVal=0;
- }
-
- HAL_ADC_Stop_DMA(&hadc1);
- HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,ADC_POINTS);
复制代码
整体硬件和软件工程太烂,调试的还不咋地,先不开源了,如果有大佬过来技术扶贫或者调试的差不多了再开源 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|