12下一页
返回列表 发新帖我要提问本帖赏金: 130.00元(功能说明)

[STM32F1] ADC基本原理

[复制链接]
30329|27
 楼主| 神圣雅诗人 发表于 2021-2-22 21:19 | 显示全部楼层 |阅读模式
本帖最后由 神圣雅诗人 于 2021-2-22 21:41 编辑

ADCAnalog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

STM32F10x  ADC特点
  • 12位逐次逼近型的模拟数字转换器
  • 最多带3ADC控制器
  • 最多支持18个通道,可最多测量16个外部和2个内部信号源。
  • 支持单次和连续转换模式
  • 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
  • 通道0到通道n的自动扫描模式
  • 自动校准
  • 采样间隔可以按通道编程
  • 规则通道和注入通道均有外部触发选项
  • 转换结果支持左对齐或右对齐方式存储在16位数据寄存器
  • ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5ADC时钟下得到。)
  • ADC供电要求:2.4V-3.6V
  • ADC输入范围:VREF- ≤  VIN  ≤  VREF+

STM32F10x大容量芯片带3ADC控制器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。
小于144脚芯片只有16个外部通道。

STM32F10x系列芯片ADC通道和引脚对应关系 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg


ADC引脚 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
ADC框图
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

STM32通道组
规则通道组:相当正常运行的程序。最多16个通道。
     规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]
注入通道组相当于中断。最多4个通道。
     注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
STM32F1ADC的各通道可以单次,连续,扫描或者间断模式执行。


单次转化 VS 连续转换 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

扫描模式 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
20200304152002874.png

ADC中断 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC时钟配置 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
不要让ADC时钟超过14MHz,否则可能不准。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC_CR1寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC_CR2寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

数据对齐方式 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC_SMPR1寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC_SMPR2寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC的采样时间 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
最小转换时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到)

ADC_SQR1/SQR2/SQR3规则序列寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg
ADC_JSQR注入系列寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC_DR规则通道数据寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg


ADC_JDR注入通道数据寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

ADC_SR状态寄存器 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h3bDMxOTAyMTcxNzE=,size_16,color_FFFFFF,t_70.jpg

常用库函数

  1. void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
  2. void ADC_DeInit(ADC_TypeDef* ADCx)
  3. void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  4. void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
  5. void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  6. void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
  7. uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

  8. void ADC_ResetCalibration(ADC_TypeDef* ADCx);
  9. FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
  10. void ADC_StartCalibration(ADC_TypeDef* ADCx);
  11. FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
ADC初始化函数ADC_Init
  1. void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
  2. typedef struct
  3. {
  4.   uint32_t ADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]  :DUALMODE[3:0]位
  5.   FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位
  6.   FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
  7.   uint32_t ADC_ExternalTrigConv;  //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]               
  8.   uint32_t ADC_DataAlign;   //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN         
  9.   uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]      
  10. }ADC_InitTypeDef;


  11. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //不开启扫描
  12. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换模式
  13. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发软件
  14. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
  15. ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目
  16. ADC_Init(ADC1, &ADC_InitStructure);        
ADC使能函数 ADC_Cmd();
  1. void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

  2. ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
ADC使能软件转换函数 ADC_SoftwareStartConvCmd
  1. void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
  2. ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动
ADC 规则通道配置函数ADC_RegularChannelConfig
  1. void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, int8_t ADC_SampleTime);
  2. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );

ADC 获取转换结果函数ADC_GetConversionValue
  1. uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
  2. ADC_GetConversionValue(ADC1);//获取ADC1转换结果



实验目的:ADC1的通道1PA1)进行单次转化

开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
      GPIO_Init();      
     APB2PeriphClockCmd();
复位ADC1,同时设置ADC1分频因子。
      RCC_ADCCLKConfig(RCC_PCLK2_Div6);
      ADC_DeInit(ADC1);
初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
     void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
使能ADC并校准。
       ADC_Cmd(ADC1, ENABLE);
⑤ 配置规则通道参数:
     ADC_RegularChannelConfig();
⑥开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
⑦等待转换完成,读取ADC值。
   ADC_GetConversionValue(ADC1);











打赏榜单

神奇雅诗人 打赏了 10.00 元 2024-12-16

ssysr 打赏了 10.00 元 2024-12-16

ssysr 打赏了 10.00 元 2021-07-31

xbh13956139471 打赏了 10.00 元 2021-07-31

xbh13956139471 打赏了 20.00 元 2021-07-20

ssysr 打赏了 20.00 元 2021-07-20

神奇雅诗人 打赏了 10.00 元 2021-07-10

psm15055975904 打赏了 20.00 元 2021-07-10

ssysr 打赏了 20.00 元 2021-07-10

bsz84 发表于 2021-2-23 17:49 | 显示全部楼层
drer 发表于 2021-3-4 07:30 | 显示全部楼层
AD采集就是一个永恒的话题
gwsan 发表于 2021-3-4 07:30 | 显示全部楼层
基本上大部分都是12位的吧
kxsi 发表于 2021-3-4 07:34 | 显示全部楼层
ad对硬件的功底要求也很高
nawu 发表于 2021-3-4 07:35 | 显示全部楼层
有几个内部基准可以选择啊
qcliu 发表于 2021-3-4 07:37 | 显示全部楼层
主要注意的地方都提到了 真不错
gygp 发表于 2021-3-4 12:23 | 显示全部楼层
积分型AD工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。
chenci2013 发表于 2021-3-4 12:24 | 显示全部楼层
ADC即为典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
biechedan 发表于 2021-3-4 12:24 | 显示全部楼层
A/D转换器一般速度很快,但精度一般不高。
wangdezhi 发表于 2021-3-4 12:25 | 显示全部楼层
一个很重要的参数就是转换时间。
isseed 发表于 2021-3-4 12:25 | 显示全部楼层
Σ-Δ型ADC是当今信号采集和处理系统设计人员的工具箱中必不可少的基本器件。
xietingfeng 发表于 2021-3-4 12:25 | 显示全部楼层
深入讲解所涉及的理论和设计原理
suzhanhua 发表于 2021-3-4 12:26 | 显示全部楼层
∑-△转换器?   
mituzu 发表于 2021-3-4 12:27 | 显示全部楼层
对Σ-Δ型号ADC拓扑结构背后的根本原理有一个基本了解
hellosdc 发表于 2021-3-4 12:27 | 显示全部楼层
ADC的内部原理和如何获得最佳精度
uiint 发表于 2021-3-4 12:29 | 显示全部楼层
            
wangdezhi 发表于 2021-3-4 12:29 | 显示全部楼层
STM32f103RBT6有2个ADC控制器。
biechedan 发表于 2021-3-4 12:29 | 显示全部楼层
用的有ADC0801、ADC0802、AD570等。
isseed 发表于 2021-3-4 12:29 | 显示全部楼层
很多讲∑-Δ ADC或DAC架构和原理的资料
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

406

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部