中级会员
 
- 积分
- 236
- 金钱
- 236
- 注册时间
- 2021-6-19
- 在线时间
- 67 小时
|
15金钱
大家好!想请教一下大家。我在使用DSP库进行FFT处理风速传感器的波形信号。代码如下:
ADC+DMA:
- ADC_ChannelConfTypeDef hadc2_channel;
- void MY_ADC_Init(void)
- {
- __HAL_RCC_DMA2_CLK_ENABLE();
- hdma_adc2.Instance = DMA2_Stream2;
- hdma_adc2.Init.Channel = DMA_CHANNEL_1;
- hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
- hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE; //???????
- hdma_adc2.Init.MemInc = DMA_MINC_ENABLE; //???????
- hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //??????:16?
- hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; //???????:16?
- hdma_adc2.Init.Mode = DMA_CIRCULAR; //???????
- hdma_adc2.Init.Priority = DMA_PRIORITY_LOW; //?????
- hdma_adc2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* ??FIFO*/
- HAL_DMA_Init(&hdma_adc2);
- __HAL_LINKDMA(&hadc2, DMA_Handle, hdma_adc2); //?DMA?ADC????
- hadc2.Instance = ADC2;
- hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4??,ADCCLK=PCLK2/4=108/4=27MHZ
- hadc2.Init.Resolution = ADC_RESOLUTION_12B; //12???
- hadc2.Init.ScanConvMode = DISABLE; //?????
- hadc2.Init.ContinuousConvMode = DISABLE; //??????
- hadc2.Init.DiscontinuousConvMode = DISABLE; //?????????
- hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; //??????
- hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T2_CC2; //????
- hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; //???
- hadc2.Init.NbrOfConversion = 1; //1????????? ??????????1
- hadc2.Init.DMAContinuousRequests = ENABLE; //??DMA??
- hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
- HAL_ADC_Init(&hadc2);
- hadc2_channel.Channel = ADC_CHANNEL_3; //??
- hadc2_channel.Rank = 1; //??1
- hadc2_channel.SamplingTime = ADC_SAMPLETIME_3CYCLES; //????
- hadc2_channel.Offset = 0;
- HAL_ADC_ConfigChannel(&hadc2, &hadc2_channel); //????
-
- }
复制代码 TIM:
- TIM_HandleTypeDef htim2;
- TIM_OC_InitTypeDef TIM2_CH2Handler;
- void MY_TIM2_Init(void)
- {
- __HAL_RCC_TIM2_CLK_ENABLE();
-
- htim2.Instance = TIM2;
- htim2.Init.Prescaler = 108-1;
- htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim2.Init.Period = 100;
- htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- HAL_TIM_PWM_Init(&htim2);
- TIM2_CH2Handler.OCMode = TIM_OCMODE_PWM1;
- TIM2_CH2Handler.Pulse = 50;
- TIM2_CH2Handler.OCPolarity = TIM_OCPOLARITY_LOW;
- TIM2_CH2Handler.OCFastMode = TIM_OCFAST_DISABLE;
- HAL_TIM_PWM_ConfigChannel(&htim2, &TIM2_CH2Handler, TIM_CHANNEL_2) ;
- TIM_CCxChannelCmd(htim2.Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
- __HAL_TIM_ENABLE(&htim2);
- //__HAL_TIM_DISABLE(&htim2);
- }
复制代码 FFT:
- uint16_t FFT_ADC(uint16_t* buffer)
- {
- uint16_t index;
- for(int j=0;j<COUNT;j++)
- {
- FFT_IN_Buffer[2*j] = buffer[j]; //实部//
- FFT_IN_Buffer[2*j+1] = 0; //虚部为0//
- }
- arm_cfft_f32(&arm_cfft_sR_f32_len1024,FFT_IN_Buffer,0,1); //1024点FFT//
- arm_cmplx_mag_f32(FFT_IN_Buffer,FFT_OUT_Buffer,COUNT); //复数模平方,算幅值//
- // printf("FFT result is:\r\n");
- // for (int i = 0; i < COUNT; i++)
- // {
- // if (i % 8 == 0) printf("\r\n");
- // printf("%.1f ", FFT_OUT_Buffer[i]);
- // }
- index = Max_Index(FFT_OUT_Buffer,COUNT);
- // printf("\r\n****************************************************************\r\n");
- return index;
- }
- //找出频率最大值对应的下标//
- uint16_t Max_Index(float* buffer,int N)
- {
- float Max = buffer[1];
- uint16_t index = 1;
- for(int i=2;i<N;i++)
- {
- if(Max<buffer[i])
- {
- Max = buffer[i];
- index = i;
- }
- }
- return index;
- }
复制代码 主程序中
- int main()
- {
- MY_ADC_Init();
- MY_TIM2_Init();
- HAL_ADC_Start_DMA(&hadc2, (uint32_t *)ADC2_Buffer, sizeof(ADC2_Buffer));
- uint16_t index;
- int Frequency =0;
- while(1)
- {
- index = FFT_ADC(ADC2_Buffer);
- Frequency = (Fs/COUNT)*index;
- printf("%d\r\n", Frequency);
- }
- }
复制代码 我通过调试 观察发现FFT_IN的数组,奇数下标(对应虚部)并没有被赋值为0(如图1)
FFT计算出来的频率也有些不对劲(图2)。请问一下是哪个环节出现了纰漏。谢谢!
|
-
图1
-
|