STM32(好几丫的天学习记录|ADC采样频率的笔记)(转载)

全文转载自电子发烧友网站,仅作为学习用途,侵删

STM32的ADC采样频率及相应时间的确定

描述

  STM32 ADC 介绍

  STM32 ADC 是一个12 位精度、 一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

  ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。转换时最快为1us,当ADC的输入时钟超过14MHz 时其会损失一些精度。当然如果可以达到我们的精度,输入时钟高点也没事。

  在网上看到一回答ADC不超过14MHz 的答案:资料上的都是推荐,事实上很多芯片的设计都是有超额余量的,很多人都会超额的利用这些资源,并且很好的工作。

  若所看的程序频率是超过14M,也没有错,可能作者的目的在于快速而宁愿损失一些精度,ADC的分辨率是12位,若是超过这个频率也是工作的,只不过采样到的精度可能仅到10位,若这个已到 作者的要求,也无错误之说了。

  2、看参考手册,确定ADC 的时钟以及通道采样时间:

  1)ADC 时钟 ADC 接在APB2 上,APB2的时钟为72MHz,通过分频的方式给ADC 提供时钟,预分频主要有2、4、6、8 四种分频方式。

  2)通道采样时间 通道采样时间会影响采样的精度。

  3、转换时间

  公式:TCONV = 采样时间+ 12.5 个周期

  例如:当

  ADCCLK=14MHz和1.5周期的采样时间

  TCONV = 1.5 + 12.5 = 14

  周期=1μs

  例如:当ADCCLK=14MHz 和1.5 周期的采样时间 TCONV = 1.5 + 12.5 = 14 周期 = 1μs

  1)一般情况,如果是软件启动,那么转换时间即是采样周期。

  2)若通过定时器进行触发启动ADC,则还需要加上定时器的相关时间。

  4、确定采样率

  1)如果我们的输入信号是 20KHz (周期为 50us),若要将它恢复出来,一个周期最少采样20个点,此时采样率要达到400KHz,所以ADC的采样率必须在400KHz 以上。为

  了达到最好的精度,我们选取ADC时钟为12MHz,即6分频。在12MHz 以及保证采样率的情况下,采样时间越长其,准确性就越好。

  可以计算 2.5us = (12.5 + 采样时间)/ 12MHz ,可以求得采样时间为17.5;所以采样时间的选择必须小于等于17.5个周期,才能保证采样率在400KHz 以上。所以我们可以选

  择1.5、7.5、13.5,为获得更高的精准度,我们可以选择13.5个周期。

  切记采样点数必须达到要求。

  采样频率的确定

  1.首先确定ADC 的时钟,这里需要看你的RCC的设置。在采用固件库的基础上,设定ADC的采样频率相对来说是很容易的。

  (1)由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。CLK 控制器为ADC 时钟提供一个专用的可编程预分频器。

  (2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同

  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  RCC_PCLK2Config(RCC_HCLK_Div1);

  RCC_PCLK1Config(RCC_HCLK_Div2);

  (3)在时钟配置寄存器(RCC_CFGR) 中 有 为ADC 时钟提供一个专用的可编程预分器

  位15:14 ADCPRE:ADC预分频

  由软件设置来确定ADC时钟频率

  00:PCLK2 2分频后作为ADC时钟

  01:PCLK2 4分频后作为ADC时钟

  10:PCLK2 6分频后作为ADC时钟

  11:PCLK2 8分频后作为ADC时钟

  我们可对其进行设置 例如:

  RCC_ADCCLKConfig(RCC_PCLK2_Div4);

  另外 还有 ADC 时钟使能设置

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 |

  RCC_APB2Periph_GPIOC, ENABLE);

  (4)采样时间和转换时间

  ADC 使用若干个ADC_CLK 周期对输入电压采样,采样周期数目可以通过

  ADC_SMPR1 和ADC_SMPR2 寄存器中的SMP[2:0]位而更改。每个通道可以以

  不同的时间采样。

  总转换时间如下计算:

  TCONV = 采样时间+ 12.5 个周期

  例如:

  当ADCCLK=36MHz 和239.5 周期的采样时间

  TCONV = 239.5 + 12.5 = 252周期 = 7μs

  若你采样的是1KHz的正弦波信号,采样了10000个点,则其中就有70个周期。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F4上使用ADC采样测试纹波的过程可以分为以下几个步骤: 1. 配置ADC模块:使用STM32F4的CubeMX工具或手动编写代码配置ADC模块,设置采样分辨率、采样时间、转换模式等参数。 2. 连接信号源:将待测试的纹波信号连接到STM32F4的ADC输入引脚上。 3. 采样:启动ADC转换并等待采样完成。可以采用轮询方式或者中断方式进行采样。 4. 处理数据:将采样得到的原始数据进行处理,例如计算均值、标准差、最大值、最小值等统计量,或者进行频域分析和滤波处理。 下面是一个简单的示例代码,用于采样测试纹波: ```c #include "stm32f4xx.h" #define ADC_CHANNEL 0 // ADC采样通道 #define SAMPLE_SIZE 1000 // 采样点数 uint16_t adc_data[SAMPLE_SIZE]; // 采样数据缓存 void adc_init(void) { ADC_InitTypeDef adc_init; GPIO_InitTypeDef gpio_init; // 1. 配置GPIO引脚为模拟输入模式 gpio_init.Pin = GPIO_PIN_0; gpio_init.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &gpio_init); // 2. 配置ADC模块 __HAL_RCC_ADC1_CLK_ENABLE(); adc_init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; adc_init.Resolution = ADC_RESOLUTION_12B; adc_init.ScanConvMode = DISABLE; adc_init.ContinuousConvMode = ENABLE; adc_init.DiscontinuousConvMode = DISABLE; adc_init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; adc_init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; adc_init.DataAlign = ADC_DATAALIGN_RIGHT; adc_init.NbrOfConversion = 1; HAL_ADC_Init(&adc_init); // 3. 配置ADC采样通道 ADC_ChannelConfTypeDef adc_channel; adc_channel.Channel = ADC_CHANNEL_0; adc_channel.Rank = 1; adc_channel.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&adc_channel); } void adc_sample(void) { uint32_t i; // 1. 启动ADC采样 HAL_ADC_Start(&hadc1); // 2. 等待采样完成 for (i = 0; i < SAMPLE_SIZE; i++) { while (__HAL_ADC_GET_FLAG(&hadc1, ADC_FLAG_EOC) == RESET); adc_data[i] = HAL_ADC_GetValue(&hadc1); } // 3. 停止ADC采样 HAL_ADC_Stop(&hadc1); } int main(void) { // 初始化ADC模块 adc_init(); // 采样纹波信号 adc_sample(); // 处理采样数据,例如计算均值、标准差、最大值、最小值等统计量, // 或者进行频域分析和滤波处理。 while (1); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值