STM32之ADC模数转换
对于STM32的GPIO来说,只能读取引脚的高低电平,要么低电平,要么高电平,只有两个值,而使用了ADC之后,我们就可以对这个高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量,所以ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里。
12位逐次逼近型ADC,ADC 的转换时间跟 ADC 的输入时钟和采样时间有关,公式为:Tconv = 采样时间 + 12.5 个周期。当 ADCLK = 14MHZ (最高),采样时间设置为 1.5 周期(最快),那么总的转换时间(最短)Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。(1us转换时间)
输入电压范围:0~3.3V,转换结果范围∶0~4095 18个输入通道,可测量16个外部和2个内部信号源(内部温度传感器和内部参考电压1.2V) 规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围,如当AD值高于它设定的上阈值或者低于下阈值时
它就会申请中断,你就可以在中断函数里执行相应的操作。如下图:
下面,我们来配置一下单通道的ADC
第一步,RCC开启时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
STM32 的 ADC 多达 18 个通道,其中外部的 16 个通道是 ADCx_IN0 、ADCx_IN1...ADCx_IN5。这 16 个通道对应着不同的GPIO 口,具体是哪一个 GPIO 口可以从手册查询到。所以这里要打开GPIO外设时钟,而且还要打开ADC时钟,ADC 输入时钟 ADC_CLK 由 PCLK2(一般设置 PCLK2=HCLK=72M) 经过分频产生,最大是 14M,分频因子由 RCC 时钟配置寄存器 RCC_CFGR 的位 15:14 的ADCPRE[1:0]设置,可以是 2/4/6/8 分频,所以一般我们选择RCC_PCLK2_Div6(6分频)。ADC逐次比较的过程就是由这个时钟推动的。
第二步,初始化GPIO。
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
第三步,初始化ADC。
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
这里对ADC初始化涉及到的参数做一个分析:
单次转换还是连续转换,选择扫描模式还是非扫描模式,通道数目,数据对齐
这个表就是规则组里的菜单,有16个空位,分别是序列1到序列16,你可以在这里点菜,就是写入你要转换的通道。在非扫描的模武下,这个菜单就只有第一个序列1的位置有效,这时,菜单同时选中一组的方式就退化为简单地选中一个的方式了,比如,我在序列1的位置写入通道2,然后,我们就可以触发转换,ADC就会对这个通道2进行模数转换。过一小段时间,转换完成,转换结果放在数据寄存器里,同时给EOC标志位置1。我们判断这个EOC标志位,如果转换完了,我们就可以在数据寄存器里读取结果了。单次转换,非扫描模式下,如果我们想再启动一次转换,那就需要再触发一次。如果想换一个通道就要在转换之前,把第一个位置的通道2换成其他通道。
连续转换,非扫描模式,它与上一种单次转换不同的是,它在一次转换结束后不会停止,只需要最开始给触发一次,之后就可以一直转换了。
扫描模式,这就会用到这个菜单列表了,你可以在这个菜单里面点菜,比如,第一个菜是通道2,第二个菜是通道5.....,这里的菜单位置是通道几可以任意指定,并且也是可以重复的。
这里通道数目有7个,转换结果都放在数据寄存器里面,为了防止数据被覆盖,就需要DMA及时将数据移走,那7个通道转换完成之后,产生EOC信号,转换结束。
连续转换,扫描模式,同理。
我们的ADC是12位的,所以转换结果就是12位的数据,但是这个寄存器是16位的,所以就存在数据对齐的问题。
右对齐,就是12位数据向右靠,高位多出来的补0,左对齐,就是12位数据向左靠,低位多出来的补0,一般使用右对齐,这样读取这个16位寄存器,直接就是转换结果。如果选择左对齐,直接读的话,得到的数据会比实际的大(因为数据左对齐把数据左移了4次相当于把结果乘16了)。如果0-4095范围太大,只是做一个简单的判断,不需要高分辨率,可以选择左对齐,然后把高8位数据读取出来,舍弃后4位的精度,即8位ADC。
第四步,选择规则组还是注入组
这里选用规则组
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
规则组最多可以选中16个通道,注入组最多可以选择4个通道,然后转换的结果可以存放在AD数据寄存器里,然后下面这里有触发控制,提供了开始转换这个START信号,触发控制可以选择软件触发和硬件触发。硬件触发主要是来自于定时器,当然也可以选择外部中断的引脚。
这个表就是规则组的触发源,硬件触发来自于定时器还是外部中断的引脚,需要AFIO重映射来决定。最后一个是软件触发控制位,即软件触发。
第五步,开关控制
ADC_Cmd(ADC1, ENABLE); //用于给ADC上电
第六步,校准
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
至此,ADC初始化完成,开始获取ADC转换结果:
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
最后,将ADC的转换结果赋给一个变量。
ADValue = AD_GetValue();
至此,ADC模数转换完成。
完结!
STM32之ADC模数转换相关推荐
- STM32笔记——ADC模数转换
一.概述 二.ADC模数转换器 2.1 ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟 ...
- STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)
嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节 ...
- STM32 ADC模数转换
STM32 ADC模数转换 独立模式/双重DMA/三重DMA //使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //APB2 ...
- STM32之ADC实例(基于DMA方式)
出处:https://blog.csdn.net/zouleideboke/article/details/75112224?locationNum=9&fps=1 ADC简介: ADC(An ...
- 双极型adc与stm32_关于STM32 双ADC同步规则转换两路数据的问题?
因系统要求需升级ADC的采样方式(以前方式:扫描方式,TIMER2触发ADC软启动,2通道规则序列,DMA传完中断),为了进一步实现两路信号的同步性能,采样STM32 双ADC同步规则转换.(time ...
- STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及傻瓜式解析)
STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及通俗解析) 利用STM32的片上外设可采集多个模拟量(如传感器数值),并在嵌入式程序中使用.如果只使用了一个通道,用时令ADC转换而后读取 ...
- STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换
目录 一.ADC 模数转换器 1.1ADC简介 1.2 逐次逼近型ADC工作原理 1.3STM32中的ADC基本结构 1.4STM32中ADC的输入通道 1.5STM32中的ADC的四种转换模式 1. ...
- STM32模数转换器(ADC)
1.ADC的简要 我们首先说一下ADC的转换过程,然后说一下原理,当然如果嫌啰嗦可以直接跳过. ADC是英文Analog-to-Digital Converter缩写,翻译过来就是模数转换器,是指将连 ...
- 对于STM32的ADC芯片的思考
一,一般在STM32中的IIC.SPI.UART.外部中断都有对应的中断去处理 UART有接收中断,和发送完成中断 二,但是ADC这部分没弄清楚是通过什么方式去采样的,如果是中断的话,那么时间是固定的 ...
最新文章
- OSI参考模型和网络编程
- 服务器可视化_疫情来袭,30分钟学会用python开发部署疫情可视化网站
- SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
- Linux 中的零拷贝技术
- Linux下安装MyEclipse和Tomcat服务器详解,以及我安装过程中所出现的问题以及解决办法,并实现一个web小程序
- C语言 输入是一整行的字符串
- plt的纵坐标的百分号显示
- bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)
- linux 内核块设备驱动,linux之块设备驱动
- oracle 数据库官网下载流程
- 深圳必去的50个免费景点 景色绝美
- 【Unity】卡牌游戏教程汇总
- Docker 安装MySql后创库、创表
- bzoj2818Gcd
- AR涂涂乐⭐一、unity高版本ImageTarget识别图开始是空白的解决办法、UI自适度
- 数据分析中的漏斗模型
- 移动电影院开启5G全新征程
- IIR数字低通滤波器
- MySQL inet aton函数,MySQL IP转数字函数 INET_ATON() INET_NTOA()
- 【五六七人口普查】我国省市两级各行业门类人口及三次产业人口比重