STM32之ADC模数转换器单通道。
ADC模数转换器
ADC(Analog-Digital Converter)模拟-数字转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。
12位逐次逼近型ADC,1us转换时间。
分辨率含义:0 ~ 2^12,即0 ~ 4095 ,位数越高量化结果越精细,分辨率越高
STM32的ADC输入是0~3.3V,所以ADC是将0~3.3V线性映射成0~4095。
逐次逼近型ADC图
VREF与VCC相连,输入电压模拟量范围由VREF决定。
可以单通道输入,也可以多通道接不通传感器输入。
输出是八位二进制数,因此是8位ADC。
STM32的ADC完整框图
VREF与VDDA内部电源连接。
三、 规则组转换模式
1、单次转换,非扫描模式
2、连续转换,非扫描模式
3、单次转换,扫描模式
4、连续转换,扫描模式
单次转换:每次从开始触发(软件触发或者硬件触发)到数据写入规则组数据寄存器后置EOC标志位,转换结束。后面要再采集数据需要重新上述过程。
连续转换:每次从开始触发(软件触发或者硬件触发)到数据写入规则组数据寄存器后置EOC标志位,转换不结束,不需要再次触发,继续采集数据写入数据寄存器。
扫描模式:多通道采集数据,并在序列中指定好通道顺序,开始触发后,数据寄存器逐个写入指定序列中数据(会覆盖,因此采用这个模式需要配合DMA使用)序列中数据读完后置EOC标志位。
非扫描模式:单通道单序列就是非扫描模式,默认。
如图:
触发控制有硬件和软件两种触发:如图
数据对齐方式:
因为STM32中ADC是12位的,而ADC的数据寄存器是16位的,因此有两种对齐方式。其中左对齐会损失精度,右对齐不会。左对齐降低精度,只读高八位,舍去后四位。
六、转换时间
AD转换的步骤:采样,保持,量化,编码
其中采样、保持放一起,量化、编码放一起。
七、校准
代码部分
AD单通道
功能实现:用电位计产生0~3.3V的连续变化的模拟电压,在LCD显示转换后的数据和处理后得到的电压值
流程:
参考上面的框图,具体步骤如下:
第一步开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK的分频器也要配置(给ADC配置时钟信号的用来计算采样的时间。72MHZ/ADCCLK);
第二步配置GPIO,把需要用的GPIO配置成模拟输入的模式;
第三步配置多路开关(黄颜色部分),把左边的通道接入到右边的规则组列表里;
第四步配置ADC转换器,库函数中用结构体来配置,包括单次转换还是连续转换、扫描还是非扫描、通道数量、触发源、数据对齐方式(左对齐or右对齐)。若需要模拟看门狗,会有几个函数配置阈值和检测通道。若想开启中断,就在中断输出控制里用ITConfig函数开启对应的中断输出,然后再在NVIC里,配置一下优先级,就可以触发中断了;
第五步调用ADC_Cmd函数,开启ADC。
注:开启ADC后,根据手册建议,可以对ADC进行校准,减小误差。在ADC工作时,如果想要软件触发转换,那会有函数可以触发;如果想读取转换结果,那也会有函数可以读取结果。
#include "stm32f10x.h" // Device headervoid AD_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); //提供时钟,72/6=12MHZ//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_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);///选择规则组的输入通道.第三个参数为//要配置的ADC通道在转换序列中的排位。取值为1~16,表示该通道在转换序列中的第几个进行转换。//例如,若取值为2,则表示该通道在转换序列中排在第2位。//ADC模块配置ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作在单ADC模式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_Cmd(ADC1, ENABLE);//校准模块ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发,开始工作while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //获取转换结束EOC标志位return ADC_GetConversionValue(ADC1);//转换完成会自动清除标志位
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t ADValue;
float Voltage;int main(void)
{OLED_Init();AD_Init();OLED_ShowString(1, 1, "ADValue:");OLED_ShowString(2, 1, "Volatge:0.00V");while (1){ADValue = AD_GetValue();Voltage = (float)ADValue / 4095 * 3.3; //12位ADCOLED_ShowNum(1, 9, ADValue, 4);OLED_ShowNum(2, 9, Voltage, 1);OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2);Delay_ms(100);}
}
STM32之ADC模数转换器单通道。相关推荐
- STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换
目录 一.ADC 模数转换器 1.1ADC简介 1.2 逐次逼近型ADC工作原理 1.3STM32中的ADC基本结构 1.4STM32中ADC的输入通道 1.5STM32中的ADC的四种转换模式 1. ...
- stm32 多通道AD和单通道AD的差别
今天萧条了一下 stm32的AD 感觉用起来还是比较顺手的~下面我就总结一下 多通道AD和单通道的一些差别 (1)首先 我们要改的就是vu16 ADC1ConvertedValue[2]: 这个vol ...
- axi dma 寄存器配置_「STM32」DMA采集单通道,简单数据分析
什么是DMA DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式.在DMA模式下,CPU只需要向DMA控制器下达指令,传输数据由DMA ...
- STM32F4 ADC+DMA单通道采集
背景:对锂电池电压进行采集,由于电池电压为12V,已经提前对12V进行分压,保证ADC采集电压的范围为0~3.3V.对电池电压的采集不用太过频繁,循环模式下的ADC+DMA对一直采集电压浪费资源.于是 ...
- 【stm32】ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的:可能有时候会需要立刻采样,那样我们就需要利用到注入通道 ...
- STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)
本篇文章包含的内容 一.ADC 模数转换器 1.1 ADC简介 1.2 逐次逼近型ADC工作原理 1.3 STM32中的ADC基本结构 1.4 STM32中ADC的输入通道 1.5 STM32中的AD ...
- STM32实现ADC采集(待优化)
1.ADC简介 STM32F103 系列最少都拥有 2 个 ADC ,我们选择的 STM32F103RCT 包含有 3 个 ADC,STM32的最大转换速率为1Mhz,也就是转换时间为1us,除此之外 ...
- stm32之ADC应用实例(单通道、多通道、基于DMA)
硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗). 所用的芯片内嵌3个12位的模拟/数 ...
- STM32 ADC单通道与多通道_DMA学习笔记
转自:https://blog.csdn.net/dmfylb/article/details/72802690 第一部分 ADC单路采集 下面我们将 PC0引脚配置成 AD1的通道10为例进行讲解 ...
最新文章
- lucene源码分析(4)Similarity相似度算法
- 超越GPT-3!NormFormer:归一化提高预训练、缓解梯度不匹配
- CF98E Help Shrek and Donkey(纳什博弈 + 大讨论)
- C#.net实现密码加密算法的语句
- npm 私有库开源组件_苹果的ResearchKit,npm私有模块以及更多开源新闻
- Srping MVC中Controller的void方法声明误区
- php--学习封装类 (一)(操作mysql数据库的数据访问)
- Linux sort命令浅析
- sql server添加列
- TensorFlow实现对花朵数据集的图片分类(保证运行成功)
- github 迁移google code 项目
- 大白菜pe安装服务器系统安装教程视频教程,大白菜u盘启动盘制作工具安装系统的详细方法...
- 用python批量导入阿里云安全组规则
- 详解 JVM Garbage First(G1) 垃圾收集器
- QT4.6.3在TQ2440上的移植
- hd集成显卡 linux驱动,ati 集成显卡HD3200 驱动安装
- Unexpected token u in JSON at position 0报错如何解决?
- terminate called after throwing an instance of 'std::cad_alloc' what():std::bad_alloc
- layui动态表格下拉菜单
- 人工智能之状态空间表示法的简单应用之翻转三枚钱币
热门文章
- 如何提升敏捷团队的效能?
- Unity3D--Unity篇(一)
- It is impossible to add a non-nullable field ‘university‘ to userinfo without specifying a default.
- 苹果cms提示没有权限解决方法
- ENISA云认证计划:在欧洲建立可信的云服务
- 正定矩阵及其系列性质
- 六个案例,带你感受新零售服务市场的潜力
- 爱奇艺2020校招Java方向笔试题(第一场)
- python7c 高等数学 之 BL模型,barra收益回归模型
- 简单破解win2k8密码