文章目录

  • 系统时间查看
  • ADC转换时间
  • 采集精度
  • 提高稳定性
  • 示例代码

系统时间查看


ADC挂在APB2上,对应的时钟为PCLK2,由系统时钟SYSCLK 分频得到,一般不做分频,也就是说ADC模块的时钟等于系统时钟,F103也就是72MHz,如下代码也可获取并查看:

RCC_ClocksTypeDef get_rcc_clock;
RCC_GetClocksFreq(&get_rcc_clock);

ADC转换时间


手册中也有提到ADC的频率不能超过14MHz,也就是说F103需要至少6分频(最低只有这个分频系数合适,再有就是4分频已经超过14MHz)。
转化时间计算公式为:
Tconv = Sampling time + 12.5 cycles
如果ADC配置如下:

 RCC_ADCCLKConfig(RCC_PCLK2_Div6);ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);

ADC的工作频率为:72MHz/6 = 12MHz
采样周期数为:239.5+12.5=252
总时间为:1000000us/12000000Hz*252=21us
也就是ADC得到一次转换结果需要耗时21us。

采集精度

VREF参考电压值3.3V情况下,12位采集精度如果用于采集3.3V电压,那么3300mV/4095≈0.8mV,也就是说理想情况下最多达到0.8mV的识别精度。STM32单片机有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到ADC1的通道17:

也就是说可以通过这个通道对其余ADC通道采集的值进行偏移校准,通过内部参考电压校准的话需要多开一路内ADC1_IN17采样通道.(以12位采样精度为例):
scale=ADref/ADstscale =ADref/ADstscale=ADref/ADst
Vchx=ADchx∗scale∗3.3/4096Vchx = ADchx *scale*3.3/4096Vchx=ADchx∗scale∗3.3/4096
VchxVchxVchx:通过计算得出的实际电压值
ADrefADrefADref:ADC1_IN17通道采集的ADC值,参考通道实时采集
ADstADstADst:参考电压的典型AD值,如果是12位采样精度:ADst=4095*(1.2/3.3)≈1489,其中1.2是内部参考电压,这个电压基本不会随着外部供电电压的变化而变化
ADchxADchxADchx:需要测量的ADC通道采样值


公式中的3.3是单片机的Vref引脚接的电压,这个引脚接的电压也决定ADC的测量范围,如果接的是3.3V,12位采样精度:采样值为2048就表示1.65V,如果接的是2V,采样值为2048就表示1V:

提高稳定性

一般也就是硬件和软件两个方面,硬件上可在ADC引脚与GND之间跨接一个1uF的电容,或者选择适合自己采集信号的滤波器。软件方面也是只能选择自己合适的软件滤波器。

示例代码

如下是F103的ADC1通道1的DMA使用(PA1引脚),连续自动转换(校准通道不需要初始化引脚,其余和普通ADC通道初始化一样)。

#define ADC_BUF_SIZE 2
uint16_t ADC_Buf[ADC_BUF_SIZE];     // ADC原始值
uint16_t ADC_Data[ADC_BUF_SIZE];    // 通过校准后的ADC值
float voltage[ADC_BUF_SIZE];        // 转换后的实际电压void ADC1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1 , ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// ADC引脚初始化GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      GPIO_Init(GPIOA, &GPIO_InitStructure);// ADC1配置 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                 // 工作模式:独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;                       // 浏览模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                 // ADC工作在单次转化模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;             // ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = ADC_BUF_SIZE;                 // 通道数量ADC_Init(ADC1, &ADC_InitStructure);//设置指定ADC的规则组通道,设置通道对应的转化顺序和采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_71Cycles5);ADC_TempSensorVrefintCmd(ENABLE);ADC_Cmd(ADC1, ENABLE);                              // 使能ADC           ADC_ResetCalibration(ADC1);                      // 校验复位while(ADC_GetResetCalibrationStatus(ADC1));      // 等待复位完成ADC_StartCalibration(ADC1);                      // 开始ADC1校准while(ADC_GetCalibrationStatus(ADC1));           // 等待校验完成ADC_DMACmd(ADC1, ENABLE);                        // 使能ADC的DMA功能DMA_DeInit(DMA1_Channel1);                                         // 外设地址DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buf;          // 内存地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 // 传输方向:外设 -> 内存DMA_InitStructure.DMA_BufferSize = ADC_BUF_SIZE;                   // 传输长度DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   // 外设递增:关闭DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            // 内存递增:打开DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;// 数据宽度:16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                    // 循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;            // 优先级:高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                       // 内存-内存:否DMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1, ENABLE);                                    // 使能通道ADC_SoftwareStartConvCmd(ADC1, ENABLE);      // 启动转换
}// 将ADC转换成0~3.3V实际电压
void voltage_converter(void)
{for(uint8_t i=0;i<ADC_BUF_SIZE-1;i++){ADC_Data[i] = ADC_Buf[i]*1489/ADC_Buf[ADC_BUF_SIZE-1];  // 使用校准通道校准voltage[i] = ADC_Data[i]*3.3f/4095.0f;                    // 转换成实际电压}
}

STM32 ADC转换速度与精度相关推荐

  1. STM32 ADC转换实验

    摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...

  2. ADC转换汇总(STM32、取平均、精度等)

    目录 一.电流检测ADC采样值处理的高效方法 二.ADC转换N次采样去最大最小求平均算法 三.STM32关于使用定时器触发ADC转换 四.ADC过采样提高采样精度 五.高精度ADC转换设计注意 附录1 ...

  3. 使用轮询方式进行ADC转换(野火STM32 MINI开发板)

    实验器材:野火STM32 MINI开发板 任务目标:利用ADC采集电位器的电压,并通过串口调试助手输出变化的电压值 任务内容:调整开发板上的滑动变阻器,将电压值通过开发板到PC进行显示 开发板原理图: ...

  4. stm32 adc 连续和扫描_技术分享 | STM32多个ADC模块同时采样转换的应用示例

    在STM32家族里,多数系列芯片内含2到3个ADC模块,有的甚至更多,比方G4系列可以有5个ADC模块.其中,通道数因不同的系列或型号多少不等,几个到几十个的都有.有时,我们可能需要多个ADC模块同时 ...

  5. STM32 ADC采样

    目录 1.基础概念 2.原理:ADC采样过程分为四步:采样.保持.量化.编码. 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Ana ...

  6. STM32——ADC模数转换器

    文章目录 一.ADC模数转化器 ADC简介 逐次逼近型ADC ADC框图 二.ADC基本结构 三.触发转换控制 四.输入通道 五.规则组的四种转换模式 单次转换,非扫描模式 连续转换,非扫描模式 单次 ...

  7. STM32 ADC—模数转换器

    目录 一.ADC功能框图 1.电压输入范围 2.输入通道 3.转换顺序 4.触发源 5.转换时间 6.数据寄存器 二.ADC初始化结构体介绍 三.ADC常用固件库函数 四.实验设计 1.独立模式-单通 ...

  8. STM32 ADC采样使用内部参考电压

    整理也能进步!写得清楚才能理解更深. [问题背景] 在使用ADC时,通常的用法是Vref+接电源VDD3.3V,然后计算时直接用3.3V做参考电压,但是这种方法忽略了一些情况如供电电压有可能随外部一些 ...

  9. STM32——ADC

    STM32--ADC 宗旨:技术的学习是有限的,分享的精神是无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执 ...

最新文章

  1. 什么是java一句话一个例子_一句话讲清楚什么是JavaEE
  2. 栈----生产者消费者实例
  3. springBoot+maven的打包和部署在Tomcat
  4. ROS2学习(七).ROS概念 - ROS客户端库(Ros Client Library)
  5. 安装perl5.10.0
  6. svg与png/jpg快速转换
  7. [ES6] 细化ES6之 -- 字符串的扩展
  8. python搭建网页_使用python快速搭建本地网站
  9. iOS UIView视图的图层控制
  10. linux下svn图形客户端,CentOS6.3下svn图形客户端SmartSVN安装
  11. ncie全国计算机等级考试,国家信息化工程师认证考试(NCIE)
  12. 45个实用的前端开发工具汇总
  13. 网络分析仪自动化测试软件,高效矢量网络分析仪自动测试方法
  14. ajax 获取数据太慢,想写个加载中
  15. 服务器 t610硬盘开关,戴尔服务器T610
  16. 在html中不是链接目标属性,在HTML中,()不是链接的目标属性。A、selfB、newC、blankD、Top - 扁豆云问答...
  17. 电视节目推广方案,综艺节目推广方案怎么写
  18. 魔方自动还原程序3D版本和2D 修正版
  19. 认知服务调用如何使用图片的DataURL
  20. 定义bool型变量出现 ”identifier “bool” is undefined”错误

热门文章

  1. Linux汇编语言编译
  2. php返回302,php使用curl请求返回302(30x)
  3. Astra Pro - Astra主题高级插件 v3.9.0
  4. 计算机组成原理中指令的四个工作周期
  5. 自定义组件-onFinishInflateonSizeChanged
  6. 软考-算法设计概述及常见的几种算法形式
  7. pid控制算法程序c语言,PID控制算法C源码(示例代码)
  8. tableView搜索功能
  9. 模型压缩:如何在压缩后保持模型的精度和速度
  10. MFC EnableWindow() 启用和禁用控件(设置个控件或窗口可用/不可用),ShowWindow()使某个控件或窗口(显示/不显示)可见/不可见