ADC

1.Introduction

12位ADC是逐次逼近型模数转换器(12位分辨率 采集电压=Vref*ADC_DR/4096),多达18个多路服用通道允许测量16个外部和2个内部信号。不同通道的AD转换可以用作单次,连续,扫描,不连续的模式。ADC转换的结果可以以左对齐或者右对齐的方式存放在16位的数据寄存器中。模拟看门狗可以检测输入电压是否在用户定义的最高和最低电压的阈值之内。ADC的时钟是由PCLK2经过分频产生的一个不超过14MHZ的时钟信号。

2.ADC main features

• 12-bit resolution
• Interrupt generation at End of Conversion, End of Injected conversion and Analog
watchdog event
• Single and continuous conversion modes
• Scan mode for automatic conversion of channel 0 to channel ‘n’
• Self-calibration
• Data alignment with in-built data coherency
• Channel by channel programmable sampling time
• External trigger option for both regular and injected conversion
• Discontinuous mode
• Dual mode (on devices with 2 ADCs or more)
• ADC conversion time:
– STM32F103xx performance line devices: 1 µs at 56 MHz (1.17 µs at 72 MHz)
– STM32F101xx access line devices: 1 µs at 28 MHz (1.55 µs at 36 MHz)
– STM32F102xx USB access line devices: 1.2 µs at 48 MHz
– STM32F105xx and STM32F107xx devices: 1 µs at 56 MHz (1.17 µs at 72 MHz)
• ADC supply requirement: 2.4 V to 3.6 V
• ADC input range: VREF- ≤ VIN ≤ VREF+
• DMA request generation during regular channel conversion
               

3.ADC functional description

1) ADC on-off control

通过设定ADC_CR2寄存器的ADON标志位来上电启动,ADC转换发生在ADON设定一秒后。你可以通过reset ADON位来中止转换并进入Power down模式,这个模式下ADC将几乎不损耗电源。

2)ADC clock

时钟控制器提供的时钟ADCCLK与PCLK2(APB2)同步。RCC控制器具有用于ADC时钟专用的可编程预分频器。

3)Channel selection

16个多路复用的通道。可以将他转化两个组:规则组和注入组。一组由一系列能在任何通道以任何顺序完成的转换组成。比如,他可以以下列序列进行转换:Ch3,Ch5,Ch5...

规则组:最多由16个转换组成。转换的通道和转换的个数由ADC_SQRx寄存器和ADC_SQR1的L[3:0]寄存器指定

注入组:最多由4个转换组成。转换的通道和转换的个数由ADC_JSQR寄存器和ADC_JSQR的L[1:0]寄存器指定

4)单次转换模式

在单次转换模式中ADC只做一次转换。这个模式可以由set ADC_CR2寄存器中ADON位或者外部触发,当CONT位位0时:

一旦一次转换完成

规则组:

转换的数据存储在16位的ADC_DR寄存器中

EOC(转换结束标志位)被置位

如果set EOCIE ,一个中断将会产生

5)连续转换模式

在连续转换模式中,ADC在一个转换结束后立即开始。set ADON 或者由外部触发

CONT位为1:

6)扫描模式:

这个模式用于扫描一个组的模拟通道

通过set ADC_CR1寄存器的SCAN位来选择扫描模式,一旦选择这个模式,通过ADC_SQRx寄存器选择的所有通道将会被转换。单次转换执行这个组的每一个 通道。在每一个转换结束,这个组的下个通道会自动转换。如果set CONT,转换不会在这个组的最后一个通道转换完成后结束,而是继续从这个组的第一个通道开始继续转换。

但使用扫描模式时,DMA位一定要置位,直接存储器访问控制器用于在每次更新ADC_DR regiseter把规则组转换后的数据传送到SRAM.注入组每次被转换的数据存储在ADC_JDRx寄存器中

7)非连续模式

规则组

使能这个模式通过设置ADC_CR1寄存器中的DISCEN。这个模式可以转换通过ADC_SQRx寄存器中选择的序列的不大于8的转换序列。通过向ADC_CR1寄存器中的DISCNUM[2:0]bits写入值来指定n。

当发生一个外部出触发的时候,开始转换下一个n个ADC_SQRx寄存器中选定的序列直到所有序列转换完成。序列的总长度由ADC_SQR1的L[3:0]指定。

Example:
n = 3, channels to be converted = 0, 1, 2, 3, 6, 7, 9, 10
1st trigger: sequence converted 0, 1, 2. An EOC event is generated at each conversion
2nd trigger: sequence converted 3, 6, 7. An EOC event is generated at each
conversion
3rd trigger: sequence converted 9, 10. An EOC event is generated at each conversion
4th trigger: sequence converted 0, 1, 2. An EOC event is generated at each conversion

8)校准

ADC有一个内建的校准模式。校准显著的减少了因为内部电容器组的变化。在校准期间,会为每一个

电容组 计算出一个纠错码,在所有随后的转换中,会使用此代码消除每一个电容组的误差贡献。

通过设置ADC_CR2的CAL开始启动校准。校准一旦结束,CAL位就会被硬件reset并且正常转换将会被执行。推荐在上电的时候开始一次校正。校正码将会被存储在ADC_DR中只要校正阶段结束。

9)数据对齐

ADC_CR2寄存器中的ALIGN bit 选择转换之后数据存储的对其模式,左对齐或者右对齐。

10)逐个通道可编程采样时间

ADC采集输入电压的时钟周期可以用ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]改变。每个通道可以以不同的时间采样。

总的采样时间可以用下面公式计算:

Tconv = Sampling time + 12.5 cycles

比如用ADCCLK=14MHZ,采样时间为1.5个周期

Tconv = 1.5 + 12.5 = 14 cycles = 1us
 

 

 

 

 

 

 

<think>我们正在讨论ADC检测的相关问题。用户提供了多个引用,这些引用涉及ADC的初始化、校准、硬件配置以及电路设计注意事项。用户的问题聚焦在“如何检测ADC”上,因此我们需要整合这些信息,提供一个关于ADC检测的全面指南。 ### 步骤1:理解ADC检测的关键步骤 根据引用内容,ADC检测通常包括以下步骤: 1. **初始化配置**:设置ADC的时钟、通道、引脚等(引用[2][3])。 2. **校准**:复位校准和启动校准,确保ADC精度(引用[1])。 3. **数值获取**:读取转换结果(引用[1][2])。 4. **硬件电路设计**:注意保护电路,防止过压损坏(引用[4])。 5. **多通道支持**:如何配置多个ADC通道(引用[5])。 ### 步骤2:详细解释每个步骤 #### 1. 初始化配置 - **使能时钟**:ADC和GPIO的时钟必须使能(引用[3])。 - 例如:`RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);` - **配置GPIO**:将引脚设置为模拟输入模式(无复用,引用[3])。 - **配置ADC参数**:包括采样时间、分辨率、扫描模式等(引用[3])。 - 示例代码片段(STM32标准库): ```c ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单通道 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ``` - **通道配置**:指定ADC通道对应的引脚(引用[3][5])。 - 例如:`ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);` #### 2. 校准 校准是提高ADC精度的关键步骤(引用[1]): ```c ADC_ResetCalibration(ADC1); // 复位校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); // 等待复位完成 ADC_StartCalibration(ADC1); // 启动校准 while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成 ``` > **注意**:校准只需在上电后执行一次。 #### 3. 数值获取 - **启动转换并读取**(引用[1][2]): ```c ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换结束 uint16_t value = ADC_GetConversionValue(ADC1); // 读取值 ``` - **多通道处理**:若使用扫描模式,需配置DMA或中断读取数据(引用[5]未直接说明,但常见实践)。 #### 4. 硬件电路设计注意事项 - **过压保护**:如引用[4]所述,外部电压可能超过ADC允许范围(如3.3V),需设计保护电路: - 使用分压电阻降低输入电压。 - 添加钳位二极管(如1N4148)限制电压,防止损坏ADC引脚。 - 示例:若输入最大10V,通过电阻分压(如10kΩ串联)降至3.3V以内,并加二极管接地(钳位至3.3V+0.7V≈4.0V)。 #### 5. 多通道配置 - 引用[5]展示了多通道的引脚定义(如`Board_ADC0~Board_ADC8`)。 - 配置方法: - 启用扫描模式:`ADC_InitStructure.ADC_ScanConvMode = ENABLE;` - 设置通道数量和顺序: ```c ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 通道0为第1个 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); // 通道1为第2个 ``` - 使用DMA传输转换结果数组。 ### 步骤3:完整代码框架(STM32示例) 结合引用[1][2][3],给出一个完整的单通道ADC检测代码: ```c // bsp_adc.h(参考引用[3]) #ifndef __ADC_H__ #define __ADC_H__ #include "stm32f10x.h" void ADCx_Init(void); uint16_t ADC_GetValue(void); #endif // bsp_adc.c #include "bsp_adc.h" void ADCx_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置PA0为模拟输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_Cmd(ADC1, ENABLE); // 校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } uint16_t ADC_GetValue(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } // main.c #include "bsp_adc.h" int main() { ADCx_Init(); while(1) { uint16_t adc_value = ADC_GetValue(); float voltage = (adc_value * 3.3) / 4095; // 12位ADC,参考电压3.3V // 使用voltage... } } ``` ### 关键问题与解决方案 1. **精度问题**: - 校准可减少误差(引用[1])。 - 硬件上,确保模拟电源稳定,添加滤波电容。 2. **过压保护**: - 如引用[4]案例,设计分压电路和钳位二极管。 3. **多通道扩展**: - 参考引用[5]的引脚定义,配置扫描模式和DMA。 ### 相关问题 基于上述内容,生成以下相关问题供深入探讨: 1. ADC校准为什么能提高精度?校准的具体原理是什么? 2. 如何设计ADC输入端的过压保护电路? 3. 多通道ADC扫描模式下,如何避免通道间串扰? 4. ADC采样时间如何影响转换精度?如何优化?</think>### ADC检测详解 ADC(模数转换器)是将模拟信号(如电压、电流)转换为数字值的核心硬件模块。以下是基于引用内容的完整检测流程和关键注意事项: --- #### 1. **ADC初始化配置** **硬件配置**(引用[3][5]): - 使能ADC时钟和GPIO时钟(如APB2总线)。 - 配置ADC引脚为模拟输入模式(无复用功能): ```c // 示例:STM32F10x配置(引用[3]) #define ADC_PORT GPIOC #define ADC_PIN GPIO_Pin_0 // 连接可调电阻 #define ADC_CHANNEL ADC_Channel_10 ``` - 多通道支持需定义多个引脚(引用[5]): ```c #define Board_DIO23_ANALOG CC2640R2_LAUNCHXL_DIO23_ANALOG // 通道0 #define Board_DIO24_ANALOG CC2640R2_LAUNCHXL_DIO24_ANALOG // 通道1 ``` **软件初始化**(引用[2][3]): ```c // ADC头文件定义(引用[2]) #ifndef __AD_H #define __AD_H void AD_Init(void); uint16_t AD_GetValue(uint8_t ADC_Channel); #endif // 初始化函数核心步骤(引用[1][3]) void ADCx_Init(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单通道扫描 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); // 使能ADC } ``` --- #### 2. **校准与复位**(关键步骤!引用[1][4]) 校准消除ADC内部误差,必须在初始化后执行: ```c ADC_ResetCalibration(ADC1); // 复位校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); // 等待复位完成 ADC_StartCalibration(ADC1); // 启动校准 while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成 ``` > **为何校准?** > ADC内部电容存在偏差,校准通过测量内部参考电压修正误差,精度可提升至±1 LSB(引用[4])。 --- #### 3. **数值获取与转换** - **启动转换并读取**(引用[1][2]): ```c uint16_t AD_GetValue(uint8_t ADC_Channel) { ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换结束 return ADC_GetConversionValue(ADC1); // 返回12位数字值 } ``` - **电压计算**: 若参考电压 $V_{ref} = 3.3V$,ADC分辨率12位($2^{12}=4096$): $$ V_{in} = \frac{\text{ADC\_Value} \times 3.3}{4095} $$ --- #### 4. **硬件电路设计注意事项**(引用[4]) - **过压保护**: - 输入电压超过 $V_{ref}$ 可能烧毁ADC!需添加钳位二极管和分压电阻: ```plaintext 例如:10Vmax输入 → 串联10kΩ电阻 → 二极管D4接地(钳位至3.3V+0.7V=4.0V) ``` > 若不设计保护,10V输入经10kΩ电阻会导致ADC引脚电压升至4.02V,超出3.3V极限(引用[4])。 - **抗干扰设计**: - 模拟输入引脚并联0.1μF电容滤波。 - 独立模拟/数字电源,避免数字噪声耦合。 --- #### 5. **调试与故障排查** - **常见问题**: 1. **读数跳动**: - 检查电源稳定性(纹波需<10mV)。 - 增加采样时间(如 `ADC_SampleTime_239Cycles5`)。 2. **校准失败**: - 确保时钟使能(`RCC_APB2Periph_ADCx`)。 - 检查复位状态函数返回值(引用[1])。 3. **通道干扰**: - 未使用的通道接地,避免悬空引入噪声。 --- ### 相关问题 1. ADC校准失败的可能原因及解决方法? 2. 如何设计多通道ADC扫描模式(如温度+光敏同步采集)? 3. 高精度ADC(如16位)的硬件设计有哪些特殊要求? 4. ADC采样时间如何影响信号带宽和精度? > 引用说明: > - 校准流程和数值获取参考[1][2] > - 硬件配置参考[3][5] > - 过压保护设计参考[4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值