宝安网站建设多少钱中山网站外包
一、ADC简介
1、概念
ADC(Analog-to-Digital Converter,模数转换器)是一种将模拟信号转换为数字信号的电子设备或电路。模拟信号是连续变化的信号,而数字信号是离散的、由一系列二进制数表示的信号。ADC在电子系统中起着至关重要的作用,因为它允许模拟信号(如声音、温度、压力等)被数字系统(如计算机、微控制器等)处理和分析。
2、ADC分类
并联比较型,逐次逼近型
3、ADC的主要参数
- 分辨率:表示ADC能够分辨的最小模拟信号变化,通常以位数表示(如8位、10位、12位等)。分辨率越高,转换精度越高。
 - 采样率:表示ADC每秒钟能够进行多少次采样,单位为Hz。采样率越高,能够处理的信号频率越高。
 - 转换时间:表示ADC完成一次转换所需的时间。
 - 信噪比(SNR):表示ADC输出信号的质量,信噪比越高,信号质量越好。
 - 输入范围:表示ADC能够处理的模拟信号的最大和最小值。
 
二、stm32中的ADC
1、简介
         12 位  ADC  是逐次趋近型模数转换器。它具有多达  19  个复用通道,可测量来自  16  个外部源、两个内部源和 V BAT  通道的信号。这些通道的  A/D  转换可在单次、连续、扫描或不连续采样模式下进行。ADC  的结果存储在一个左对齐或右对齐的  16  位数据寄存器中。ADC 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。 
 
2、ADC 主要特性
 ● 可配置 12  位、 10  位、 8  位或  6  位分辨率  
 
 ● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断  
 
 ● 单次和连续转换模式  
 
 ● 用于自动将通道 0  转换为通道“ n ”的扫描模式  
 
 ● 数据对齐以保持内置数据一致性  
 
 ● 可独立设置各通道采样时间  
 
 ● 外部触发器选项,可为规则转换和注入转换配置极性  
 
 ● 不连续采样模式  
 
 ● 双重/ 三重模式(具有  2  个或更多  ADC  的器件提供)  
 
 ● 双重/ 三重  ADC  模式下可配置的  DMA  数据存储  
 
 ● 双重/ 三重交替模式下可配置的转换间延迟  
 
 ● ADC 转换类型 
 
 ● ADC 电源要求:全速运行时为  2.4 V  到  3.6 V ,慢速运行时为  1.8 V  
 
 ● 规则通道转换期间可产生 DMA  请求 
 
3、结构图

4、转换序列
stm32中ADC分为 规则组(16) 和 注入组(4)。
5、触发源
外部事件触发
6、转换时间
ADC最大时钟频率为36MHz
ADC转换时间:T = 采样时间+n个周期
n与分辨率有关,可取6,8,10,12
三、寄存器
1、状态寄存器 (ADC_SR)
 偏移地址: 0x00  
 
 复位值: 0x0000 0000 
 

2、控制寄存器 1 (ADC_CR1)
 偏移地址: 0x04  
 
 复位值: 0x0000 0000 
 

3、控制寄存器 2 (ADC_CR2)
 偏移地址: 0x08  
 
 复位值: 0x0000 0000 
 

4、ADC 采样时间寄存器 1 (ADC_SMPR1)
 偏移地址: 0x0C  
 
 复位值: 0x0000 0000 
 

5、采样时间寄存器 2 (ADC_SMPR2)
 偏移地址: 0x10  
 
 复位值: 0x0000 0000 
 

6、注入通道数据偏移寄存器 X (ADC_JOFRx)(x=1..4)
 偏移地址: 0x14-0x20  
 
 复位值: 0x0000 0000 
 

7、看门狗高阈值寄存器 (ADC_HTR)
 偏移地址: 0x24  
 
 复位值: 0x0000 0FFF 
 

8、看门狗低阈值寄存器 (ADC_LTR)
 偏移地址: 0x28  
 
 复位值: 0x0000 0000 
 

9、规则序列寄存器 1 (ADC_SQR1)
 偏移地址: 0x2C  
 
 复位值: 0x0000 0000 
 

10、规则序列寄存器 2 (ADC_SQR2)
 偏移地址: 0x30  
 
 复位值: 0x0000 0000 
 

11、规则序列寄存器 3 (ADC_SQR3)
 偏移地址: 0x34  
 
 复位值: 0x0000 0000 
 

12、注入序列寄存器 (ADC_JSQR)
 偏移地址: 0x38  
 
 复位值: 0x0000 0000 
 

13、注入数据寄存器 x (ADC_JDRx) (x= 1..4)
 偏移地址: 0x3C - 0x48  
 
 复位值: 0x0000 0000 
 

14、规则数据寄存器 (ADC_DR)
 偏移地址: 0x4C  
 
 复位值: 0x0000 0000 
 

15、通用状态寄存器 (ADC_CSR)
 偏移地址: 0x00 (该偏移地址与  ADC1  基地址  + 0x300  相关)  
 
 复位值: 0x0000 0000 
 

16、通用控制寄存器 (ADC_CCR)
 偏移地址: 0x04 (该偏移地址与  ADC1  基地址  + 0x300  相关)  
 
 复位值: 0x0000 0000 
 
 
17、适用于双重和三重模式的 ADC 通用规则数据寄存器(ADC_CDR)
 偏移地址: 0x08 (该偏移地址与  ADC1  基地址  + 0x300  相关)  
 
 复位值: 0x0000 0000 
 

四、stm32中ADC配置流程
1、配置ADC的工作参数
2、MSP初始化
3、配置ADC相应通道相关参数
4、启动A/D转换
5、等待规则通道转换完成
6、获取规则通道转换结果
五、实验代码
ADC_HandleTypeDef ADC_InitStructure;
ADC_ChannelConfTypeDef ADC_CHANNEL_CONFIG;void ADC_Init()
{ADC_InitStructure.Instance = ADC1;// 选择 ADC 实例为 ADC1ADC_InitStructure.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;//时钟分频因子 设置 ADC 时钟分频因子为 PCLK 的 4 分频ADC_InitStructure.Init.DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐->右对齐ADC_InitStructure.Init.ContinuousConvMode = DISABLE;//连续转换 禁用连续转换模式(单次转换模式)ADC_InitStructure.Init.DiscontinuousConvMode = DISABLE;// 禁用间断转换模式ADC_InitStructure.Init.DMAContinuousRequests = DISABLE;// 禁用 DMA 连续请求模式ADC_InitStructure.Init.EOCSelection = DISABLE;// 禁用 EOC(转换结束)选择模式ADC_InitStructure.Init.ExternalTrigConv = ADC_SOFTWARE_START;//触发源 设置外部触发源为软件触发ADC_InitStructure.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;// 设置外部触发边沿为无触发边沿ADC_InitStructure.Init.NbrOfConversion = 1;//规则组个数ADC_InitStructure.Init.NbrOfDiscConversion=0;// 设置间断模式下的转换通道数量为 0ADC_InitStructure.Init.Resolution = ADC_RESOLUTION_12B;//分辨率 12位ADC_InitStructure.Init.ScanConvMode = DISABLE;// 禁用扫描模式(单通道模式)HAL_ADC_Init(&ADC_InitStructure);HAL_ADC_Start(&ADC_InitStructure);
}void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;GPIO_InitStructure.Pin = GPIO_PIN_5;GPIO_InitStructure.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}uint16_t GET_ADCx(uint32_t channel)
{uint16_t Val;ADC_CHANNEL_CONFIG.Channel = channel;ADC_CHANNEL_CONFIG.Offset = 0;ADC_CHANNEL_CONFIG.Rank = 1;ADC_CHANNEL_CONFIG.SamplingTime = ADC_SAMPLETIME_480CYCLES;HAL_ADC_ConfigChannel(&ADC_InitStructure,&ADC_CHANNEL_CONFIG);HAL_ADC_Start(&ADC_InitStructure);Val = HAL_ADC_GetValue(&ADC_InitStructure);return Val;
} 
 
 
 
 
 
 
 
 
 
 
