eclipse 网站开发学习,wordpress rewrite nginx,wordpress 默认头像,网站代备案本次实现的功能为单片机DAC输出一个正弦波#xff0c;然后ADC定时采样用DMA输出#xff0c;最后对DAC输出的波形进行FFT。单片机STM32F103ZET6内部时钟一、配置ADCADC端口为PA1#xff0c;采用DMA输出#xff0c;定时器3触发定时器时钟64M#xff0c;分频后为102.4KHzADC采…本次实现的功能为单片机DAC输出一个正弦波然后ADC定时采样用DMA输出最后对DAC输出的波形进行FFT。单片机STM32F103ZET6内部时钟一、配置ADCADC端口为PA1采用DMA输出定时器3触发定时器时钟64M分频后为102.4KHzADC采样时间为102.4KHz/1001.024KHz二、配置DACDAC端口PA4DMA传输定时器6定时器时钟64M分频后为1MHz三、配置DSP四、配置时钟四、代码注意生成的代码里初始化中DMA要在ADC之前FFT需要#include arm_math.h头文件需添加include在define后面补全USE_HAL_DRIVER,STM32F103xE,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,__FPU_PRESENT1main中加入ADC、DAC与FFT代码uint16_t ad_value;
uint16_t adc_buffer[1] {0};HAL_TIM_Base_Start(htim3);
HAL_ADC_Start_DMA(hadc1,(uint32_t *)adc_buffer,1);HAL_TIM_Base_Start(htim6);
SineWave_Data(n,DualSine12bit,1.6);
HAL_DAC_Start_DMA(hdac,DAC_CHANNEL_1,(uint32_t *)DualSine12bit,n,DAC_ALIGN_12B_R);arm_cfft_radix4_instance_f32 scfft; //FFT对应结构体变量
arm_cfft_radix4_init_f32(scfft,fft_adc_n,0,1); //初始化scfft结构体设置FFT相关参数SineWave_Data是产生正弦波的点子函数#include math.h
#define n 100
uint16_t DualSine12bit[n];
//num:要在一个正弦波中采集多少点
//*D:创建的一个数组用来存放正弦波各个点的数值的
//U:输出电压的峰值(0~1.5V)
//Pi:3.1415926 自己定义
void SineWave_Data( uint16_t num,uint16_t *D,float U)
{uint16_t i;for( i0;inum;i){D[i](uint16_t)((U*sin(( 1.0*i/(num-1))*2*3.14159265358979)U)*4095/3.3);}
}FFT定义#define fft_adc_n 1024 // 采1024个点
uint16_t i;
float adc_data[fft_adc_n*2]{0}; // 存ADC值
float fft_in_adc_data[fft_adc_n*2]{0}; // FFT输入实部是ADC值虚部补0
float fft_out_adc_data[fft_adc_n]{0}; // FFT输出/*********************************************************************Name : FFT_deal0(short int *data, float *fft_in,int data_length)Funcation 对波形数据进行补零操作Parameter : short int *data 波形信号float *fft_in 输入信号信号长度应是输出信号的2倍int data_length 输出信号长度与波形信号长度保持一致Return 无
********************************************************************/
void FFT_deal0(float *data, float *fft_in,int data_length)
{for(int i 0;i data_length;i){fft_in[2*i] data[i];fft_in[2*i1]0;}
}在ADC回调函数中加入标志位void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{ad_flag1;
}主函数 while(ifft_adc_n) //等待1024个点{if(ad_flag1){i;ad_flag0;ad_valueHAL_ADC_GetValue(hadc1);adc_data[i]ad_value;}}for(i0;ifft_adc_n;i) //打印采集到得ADC值{printf(%.2f\r\n,adc_data[i]);}//FFTFFT_deal0(adc_data,fft_in_adc_data,fft_adc_n); //对采集后的数据进行补0补足虚部arm_cfft_radix4_f32(scfft,fft_in_adc_data); //FFT计算基4arm_cmplx_mag_f32(fft_in_adc_data,fft_out_adc_data,fft_adc_n); //把计算结果复数求模得幅值 printf(ffffffffffffffffffff\r\n);//打印FFT输出for(i0;ifft_adc_n;i){fft_out_adc_data[i]fft_out_adc_data[i]*0.0008056640625;printf(%.2f\r\n,fft_out_adc_data[i]);}while(1);将采集到得ADC放入Excel打印出来波形频率50Hz1.024KHz采样频率采集1024个点刚好50个波形FFT分析后得波形可以看到频率为50左右还是比较精准的