STM32 ADC转换速度与精度
文章目录
- 系统时间查看
- 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转换速度与精度相关推荐
- STM32 ADC转换实验
摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...
- ADC转换汇总(STM32、取平均、精度等)
目录 一.电流检测ADC采样值处理的高效方法 二.ADC转换N次采样去最大最小求平均算法 三.STM32关于使用定时器触发ADC转换 四.ADC过采样提高采样精度 五.高精度ADC转换设计注意 附录1 ...
- 使用轮询方式进行ADC转换(野火STM32 MINI开发板)
实验器材:野火STM32 MINI开发板 任务目标:利用ADC采集电位器的电压,并通过串口调试助手输出变化的电压值 任务内容:调整开发板上的滑动变阻器,将电压值通过开发板到PC进行显示 开发板原理图: ...
- stm32 adc 连续和扫描_技术分享 | STM32多个ADC模块同时采样转换的应用示例
在STM32家族里,多数系列芯片内含2到3个ADC模块,有的甚至更多,比方G4系列可以有5个ADC模块.其中,通道数因不同的系列或型号多少不等,几个到几十个的都有.有时,我们可能需要多个ADC模块同时 ...
- STM32 ADC采样
目录 1.基础概念 2.原理:ADC采样过程分为四步:采样.保持.量化.编码. 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Ana ...
- STM32——ADC模数转换器
文章目录 一.ADC模数转化器 ADC简介 逐次逼近型ADC ADC框图 二.ADC基本结构 三.触发转换控制 四.输入通道 五.规则组的四种转换模式 单次转换,非扫描模式 连续转换,非扫描模式 单次 ...
- STM32 ADC—模数转换器
目录 一.ADC功能框图 1.电压输入范围 2.输入通道 3.转换顺序 4.触发源 5.转换时间 6.数据寄存器 二.ADC初始化结构体介绍 三.ADC常用固件库函数 四.实验设计 1.独立模式-单通 ...
- STM32 ADC采样使用内部参考电压
整理也能进步!写得清楚才能理解更深. [问题背景] 在使用ADC时,通常的用法是Vref+接电源VDD3.3V,然后计算时直接用3.3V做参考电压,但是这种方法忽略了一些情况如供电电压有可能随外部一些 ...
- STM32——ADC
STM32--ADC 宗旨:技术的学习是有限的,分享的精神是无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执 ...
最新文章
- 什么是java一句话一个例子_一句话讲清楚什么是JavaEE
- 栈----生产者消费者实例
- springBoot+maven的打包和部署在Tomcat
- ROS2学习(七).ROS概念 - ROS客户端库(Ros Client Library)
- 安装perl5.10.0
- svg与png/jpg快速转换
- [ES6] 细化ES6之 -- 字符串的扩展
- python搭建网页_使用python快速搭建本地网站
- iOS UIView视图的图层控制
- linux下svn图形客户端,CentOS6.3下svn图形客户端SmartSVN安装
- ncie全国计算机等级考试,国家信息化工程师认证考试(NCIE)
- 45个实用的前端开发工具汇总
- 网络分析仪自动化测试软件,高效矢量网络分析仪自动测试方法
- ajax 获取数据太慢,想写个加载中
- 服务器 t610硬盘开关,戴尔服务器T610
- 在html中不是链接目标属性,在HTML中,()不是链接的目标属性。A、selfB、newC、blankD、Top - 扁豆云问答...
- 电视节目推广方案,综艺节目推广方案怎么写
- 魔方自动还原程序3D版本和2D 修正版
- 认知服务调用如何使用图片的DataURL
- 定义bool型变量出现 ”identifier “bool” is undefined”错误
热门文章
- Linux汇编语言编译
- php返回302,php使用curl请求返回302(30x)
- Astra Pro - Astra主题高级插件 v3.9.0
- 计算机组成原理中指令的四个工作周期
- 自定义组件-onFinishInflateonSizeChanged
- 软考-算法设计概述及常见的几种算法形式
- pid控制算法程序c语言,PID控制算法C源码(示例代码)
- tableView搜索功能
- 模型压缩:如何在压缩后保持模型的精度和速度
- MFC EnableWindow() 启用和禁用控件(设置个控件或窗口可用/不可用),ShowWindow()使某个控件或窗口(显示/不显示)可见/不可见