赞
踩
for (i = 0; i < FFT_LENGTH; i++) /* 生成信号序列 */ { dac_value = dac_vol * 4095 / 3.3; HAL_ADC_Start(&hadc2); while (HAL_ADC_PollForConversion(&hadc2, 200) != HAL_OK) { } uint32_t adc_value = HAL_ADC_GetValue(&hadc2); uint32_t Volt = 3300 * adc_value >> 12; printf("%d\r\n",Volt); fft_inputbuf[2 * i] =Volt; /* 生成输入信号实部 */ fft_inputbuf[2 * i + 1] = 0; /* 虚部全部0 */ } arm_cfft_radix4_f32(&scfft, fft_inputbuf); /* FFT计算(基4) */ arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH); /* 把运算结果复数求模得幅 */ for (i = 0; i < FFT_LENGTH; i++) { printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf[i]); }
while (HAL_ADC_PollForConversion(&hadc2, 200) != HAL_OK)
{
}
软件触发的问题
似乎用软件触发会使得采样率提不上来
如果想要较高采样率,可以用 TIM 触发,如果想要极限采样率,则用 DMA 搬运数据
HAL_ADC_GetValue(&hadc 2)
这个函数是在 adc 转换完成之后,将 adc 的值读出来
HAL_ADC_Start_IT(&hadc2)
将 ADC 以中断方式启动,即 ADC 开始测量
HAL_TIM_Base_Start(&htim3)
开启定时器的函数,执行后定时器就开始计时了
HAL_ADC_IRQHandler
ADC 的中断函数,即 ADC 采集转换完成后,执行这个中断函数
__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef * hadc)
这个函数在HAL_ADC_IRQHandler里,是 ADC 转换完成的回调函数,用户在需要编写在 ADC 转换完成后需要执行什么操作
由于多个 ADC 共用一个中断号,所以他们的中断回调函数也是相同的,我们在编写这个函数的时候需要首先判断传入的 hadc 是哪个,再在 if 里执行对应的操作
这个函数有时候编写的时候在 main 函数里会识别不出来,然后编译就报错,点击报错会跳转到一个 error handler 的函数,这个时候没有别的办法,只能把整个工程删除重开,就会好了(这个 bug浪费了我一整天事件,不过似乎也有可能是因为我确实漏看了某个括号)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。