stm32中如何通过定时器来设置ADC的采样率????

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32中如何通过定时器来设置ADC的采样率????相关的知识,希望对你有一定的参考价值。

请问定时器的设置(period 和分频系数)对ADC采样速率 Fs 是怎样影响的? 具体公式,最好举例,一段时间ADC采样N个点,这一段时间应该就是定时器触发的?? 采N点后进行FFT分析,分辨率Fs/N。假设信号频率f, 则Fs>2f。

把ADC设置成定时器事件触发就可以了啊!然后把相应的定时器配置成PWM方式,这时PWM的频率就是ADC的采样率了。追问

我还想问一下 ADC采样后数据经FFT分析后 怎样算它的频率 幅值 相位.幅值我是通过查找ADC采样后的数据数组里最大值来得到信号的幅值。但这应该有误差把 ,还有我设置定时器定时1s,不是PWM模式.Period=999; 定时时间(999+1)*(1/1K)=1 SPrescaler=42000; 42M/42000=1KHz我这里ADC的采样率是1000Hz吗?

追答

如果信号有干扰,那直接查找最大值是肯定不行的,还是用FFT,然后找直流成分和交流成分的模值最好。
你的设置有问题吧?应该是设置PWM模式的输出频率是1000Hz才行,就是说Prescaler=41,Period=999才行。

追问

嗯 我ADC采样后,将数据存放到一个复数数组让其是不为ADC采样的值,虚部为0.让后进行FFT分析。可以得到对应频率下的幅度是吧,找到其下标。其他点的幅度为0. 相位怎么算?还有信号的幅值是直流的幅值加该频率下的幅值??? 很感谢您的回答。

参考技术A 定时和采样可以分开看,在ad采样那边有配置是根据定时器启动采样还是连续采样。函数 数ADC_ITConfig可以选择中断源等你看看固件函数库吧。采样和fft是两码事,得到数据后你爱咋地咋地。追问

我还想问一下 ADC采样后数据经FFT分析后 怎样算它的频率 幅值 相位.幅值我是通过查找ADC采样后的数据数组里最大值来得到信号的幅值。但这应该有误差把 ,还有我设置定时器定时1s,不是PWM模式.Period=999; 定时时间(999+1)*(1/1K)=1 SPrescaler=42000; 42M/42000=1KHz我这里ADC的采样率是1000Hz吗?

追答

adc采样的误差包括线性误差和精度误差等,这个应该是你容许的,如果精度不够你要换更高位数的adc了。
是1000hz

STM32F407怎么对ADC采集的12位数据进行FFT?

我看到DSP库里有CFFT,RFFT,要用哪个?怎么用呢?12位的AD数据就是0:4095的二进制实数,需要调整成Q15格式么?我就是想对采到的信号进行FFT……求高手指教

FFT算法,需要你自己做了,网上有现成的例子。
你要做的是:配置好ADC采用通道;
再根据需要配置一个定时器触发ADC采样通道,读取数据存到缓存中;
根据缓存中的数据做FFT算法;
主要问题是:这个定时器设置的周期需要你自己决定,因为多久做一次FFT,需要多少采样数据都是你来决定的
参考技术A 1.ADC对应管脚介绍
|---管脚------对应ADC----||---管脚------对应ADC----|
|PA0 <---> ADC123_IN0 || PA1 <---> ADC123_IN1 |
|PA2 <---> ADC123_IN2 || PA3 <---> ADC123_IN3 |
|PA4 <---> ADC12_IN4 || PA5 <---> ADC12_IN5 |
|PA6 <---> ADC12_IN6 || PA7 <---> ADC12_IN7 |
|PB0 <---> ADC12_IN8 || PB1 <---> ADC12_IN9 |
|PC4 <---> ADC12_IN14 || PC5 <---> ADC12_IN15 |
|PC0 <---> ADC123_IN10|| PC1 <---> ADC123_IN11|
|PC2 <---> ADC123_IN12|| PC3 <---> ADC123_IN13|
|PF3 <---> ADC3_IN9 || PF4 <---> ADC3_IN14 |
|PF5 <---> ADC3_IN15 || PF6 <---> ADC3_IN4 |
|PF7 <---> ADC3_IN5 || PF8 <---> ADC3_IN6 |
|PF9 <---> ADC3_IN7 || PF10<---> ADC3_IN8 |
2.配置查询模式如下
void ADC_Configuration(void)

GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//初始化GPIOA的Pin_0为模拟量输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit();
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精度为12位
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描转换模式失能,单通道不用
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换使能
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //不用外部触发,软件触发转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐,低字节对齐
ADC_InitStructure.ADC_NbrOfConversion = 1; //规定了顺序进行规则转换的ADC
ADC_InitStructure.ADC_NbrOfConversion = 1; //规定了顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);//ADC,通道,1转换,所选通道的采样周期
ADC_Cmd(ADC1, ENABLE); //使能
ADC_SoftwareStartConv(ADC1); //软件启动转换

unsigned short GetADCValue(void)

return ADC_GetConversionValue(ADC1);

以上是关于stm32中如何通过定时器来设置ADC的采样率????的主要内容,如果未能解决你的问题,请参考以下文章

关于Stm32定时器+ADC+DMA进行AD采样的实现

理论上如何在STM32F3中实现最大采样率?

STM32 AD 采样时间如何确定? 采样率指啥? Datasheet 中采样率fs 的0.5 和1MHz是怎么算出来的?

stm32f767的adc采样率是多少

stm32_ADC定时器采样(DMA均值处理数据)

STM32用定时器控制ADC采集做FFT请教