一、ADC简介
1. ADC:模拟信号转数字信号
注:
模拟信号:模拟信号是指用连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。
数字信号:用数字表示出来的一个量
比较常见的设计AD转换的:温湿度传感器、二氧化碳浓度、PM2.5传感器,光照强度测量
这几种传感器主要是根据测试环境的变化改变电压值,通过硬件传到主机中变成数字信号后通过特定的公式计算,最终得出一定范围内的值。
二、ADC的转换模式
1.规则组和注入组的区别与特点
规则组 (Regular Group)
- 用途:主要用于常规的连续多通道或多采样的转换。
- 触发机制:可以由软件启动,也可以通过硬件事件(如定时器中断、外部事件等)触发。
- 序列配置:用户可以定义一个转换序列,该序列包含多个通道,这些通道会按照预设的顺序依次进行转换。
- 数据处理:转换结果通常存储在规则数据寄存器中,可以通过DMA传输到内存中,以便进一步处理。
- 应用场景:适用于需要周期性或连续采集一组信号的应用场景,比如传感器读取等。
注入组 (Injected Group)
- 用途:用于快速响应的单次转换,通常用于需要立即处理的信号,例如按键检测或者温度监测。
- 触发机制:一般由软件启动,也可以通过硬件触发。
- 序列配置:注入组通常包含较少的通道,每个通道单独配置,一次只转换一个通道。
- 数据处理:转换结果存储在注入数据寄存器中,通常不使用DMA传输,而是直接通过CPU读取。
- 应用场景:适用于需要对特定事件做出快速响应的应用场景,比如按键按下时立即读取电压值等。
总结
- 转换优先级:注入转换具有更高的优先级,当正在进行规则转换时,如果启动了注入转换,则规则转换会被暂停,直到注入转换完成。
- 资源占用:规则组通常涉及更多的资源消耗,因为它支持更复杂的转换序列;而注入组则更加轻量级,适合简单的、即时的信号采集。
- 配置灵活性:两者都提供了很高的配置灵活性,可以根据具体的应用需求来调整转换参数。
规则组——4通道
-
规则组允许你定义最多4个通道的转换序列。这些通道可以在单次转换模式或扫描模式下进行转换。
- 转换序列:你可以为规则组设置一个包含最多4个通道的转换序列。这意味着你可以定义这些通道按什么顺序进行转换。
注入组——16通道
注入组允许你定义最多16个通道,但一次只能转换一个通道。
- 转换特性:注入组的转换通常是针对单一事件的快速响应,每次转换仅针对一个通道。
适用:
- 规则组适合于需要连续或周期性地从多个传感器获取数据的情况,它支持最多4个通道的转换序列,并且可以利用DMA进行高效的数据传输。
- 注入组更适合于需要快速响应特定事件的情况,它支持最多16个通道,但一次只能转换一个通道,通常用于简单的信号检测任务。
注意:规则组和注入组在进行模数转换的过程中存在数据覆盖的风险。
2.两种转换模式
单次转换模式的特点
- 启动方式:单次转换可以由软件启动,也可以通过硬件触发(如外部事件、定时器中断等)。
- 转换过程:一旦启动,ADC将进行一次模数转换,然后停止。
- 数据读取:转换完成后,需要手动读取转换结果。如果不及时读取,结果可能会被下一次转换覆盖(尤其是在注入组中)。
- 适用场景:适用于不需要连续监控信号的应用,或者需要根据某些条件启动转换的情况,例如基于事件触发的信号捕获、按键检测等。
连续转换模式的特点
- 启动方式:连续转换可以由软件启动,也可以通过硬件触发(如外部事件、定时器中断等)。
- 转换过程:一旦启动,ADC将连续不断地进行模数转换,直到通过软件命令停止。
- 数据读取:转换完成后,需要及时读取转换结果。如果不及时读取,结果可能会被下一次转换覆盖(特别是在规则组中)。
- 适用场景:适用于需要周期性地从多个传感器获取数据的应用,例如温度监控、压力监测等。
单次转换和连续转换对于读取通道的区别
规则组 (Regular Group)
- 单次转换:在单次转换模式下,规则组可以配置一个或多个通道进行转换。你可以定义一个包含最多4个通道的转换序列,这些通道将按照预设的顺序进行转换。
- 连续转换:在连续转换模式下,规则组同样可以配置一个或多个通道进行转换。你可以定义一个包含最多4个通道的转换序列,这些通道将按照预设的顺序连续不断地进行转换。
注入组 (Injected Group)
- 单次转换:注入组在单次转换模式下,一次只能转换一个通道。即使你可以配置最多16个通道,但在单次转换模式下,每次转换只涉及一个通道。
- 连续转换:注入组在连续转换模式下仍然一次只能转换一个通道。尽管可以配置多个通道,但在连续转换模式下,每次转换仍然是针对一个通道进行的,而不是像规则组那样按照序列进行连续转换。
总结
-
规则组:
- 单次转换:最多4个通道。
- 连续转换:最多4个通道。
-
注入组:
- 单次转换:1个通道。
- 连续转换:1个通道(连续转换指的是连续多次单个通道的转换)。
说明
-
规则组:
- 在规则组中,你可以定义一个包含最多4个通道的转换序列,并且可以选择单次转换或连续转换模式。
- 在连续转换模式下,一旦启动转换,ADC将按照定义的序列顺序连续不断地转换这些通道,直到被停止。
-
注入组:
- 在注入组中,尽管可以配置最多16个通道,但在每次转换中只能转换一个通道。
- 在连续转换模式下,每次转换仍然是针对一个通道进行的,只是这个过程会重复进行。
注:
-
单次转换:一次不管初始化配置了几个通道,都是对这些通道进行一轮读取后就会停止
连续转换:会对配置的通道进行一圈又一圈的读取,直到有停止的命令
3.连续模式与扫描模式的区别
-
扫描模式 (Scan Mode)
- 定义:扫描模式是指在一个转换序列中连续转换多个通道的功能。
- 通道顺序:用户可以定义一个包含多个通道的转换序列。
- 转换顺序:转换按照预设的顺序依次进行。
- 应用场景:扫描模式通常用于需要从多个传感器获取数据的应用场景,例如从多个温度传感器或压力传感器采集数据。
- 配置:扫描模式通常与规则组一起使用,并且需要在ADC配置中启用扫描模式。
- 转换模式:扫描模式可以与单次转换模式或连续转换模式结合使用。
-
连续转换模式 (Continuous Conversion Mode)
- 定义:连续转换模式是指ADC在完成一次转换之后自动开始下一次转换,直到被显式停止。
- 转换特性:一旦启动,ADC将连续不断地进行模数转换,直到通过软件命令停止。
- 应用场景:连续转换模式适用于需要周期性地从一个或多个传感器获取数据的应用场景。
- 配置:连续转换模式可以在规则组或注入组中使用,并且需要在ADC配置中启用连续转换模式。
- 转换模式:连续转换模式可以与单次转换模式或扫描模式结合使用。
-
区别总结
- 扫描模式关注的是如何在一次转换序列中转换多个通道,而连续转换模式关注的是如何重复进行转换直到被停止。
- 扫描模式与连续转换模式可以结合使用,但它们关注的重点不同。
- 扫描模式是在单次转换或连续转换中对多个通道进行有序转换的能力,而连续转换模式则是指ADC是否连续不断地进行转换。
- 扫描模式通常与规则组结合使用,而连续转换模式可以在规则组或注入组中使用。
-
示例
假设你有三个传感器(通道1、通道2和通道3),并且想要每隔一定时间周期性地读取这些传感器的数据。
-
使用扫描模式 + 连续转换模式:
- 配置规则组为扫描模式,并定义一个转换序列,包括通道1、通道2和通道3。
- 启用连续转换模式。
- 一旦启动转换,ADC将按照定义的顺序连续不断地转换这三个通道,直到被停止。
- 一次转换三个通道
-
使用连续转换模式 + 单次转换模式:
- 配置规则组为单次转换模式。
- 启用连续转换模式。
- 每次转换时,只转换一个通道,然后手动启动下一次转换以转换另一个通道。
- 这种情况下,虽然也是连续转换,但每次只转换一个通道,不像扫描模式那样按照序列转换多个通道。
- 三次转换三个通道
4.间断模式
规则组
此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换
(n<=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的
DISCNUM[2:0]位给出。
一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转
换完成为止。总的序列长度由ADC_SQR1寄存器的L[3:0]定义。
举例:
n=3,被转换的通道 = 0、1、2、3、6、7、9、10
第一次触发:转换的序列为 0、1、2
第二次触发:转换的序列为 3、6、7
第三次触发:转换的序列为 9、10,并产生EOC事件
第四次触发:转换的序列 0、1、2
注意: 当以间断模式转换一个规则组时,转换序列结束后不自动从头开始。
当所有子组被转换完成,下一次触发启动第一个子组的转换。在上面的例子中,第四次触发重
新转换第一子组的通道 0、1和2。
注入组
此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道
顺序逐个转换ADC_JSQR寄存器中选择的序列。
一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有
的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。
例子:
n=1,被转换的通道 = 1、2、3
第一次触发:通道1被转换
第二次触发:通道2被转换
第三次触发:通道3被转换,并且产生EOC和JEOC事件
第四次触发:通道1被转换
注意: 1 当完成所有注入通道转换,下个触发启动第1个注入通道的转换。在上述例子中,第四个
触发重新转换第1个注入通道1。
2 不能同时使用自动注入和间断模式。
三、初始化过程
1.初始化图例
2.初始化模块代码
void AD_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*设置ADC时钟*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频,ADCCLK = 72MHz / 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); //将PA0引脚初始化为模拟输入
/*规则组通道配置*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //规则组序列1的位置,配置为通道0
/*ADC初始化*/
ADC_InitTypeDef ADC_InitStructure; //定义结构体变量
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //模式,选择独立模式,即单独使用ADC1
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐,选择右对齐
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发,使用软件触发,不需要外部触发
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //连续转换,失能,每转换一次规则组序列后停止
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式,失能,只转换规则组的序列1这一个位置
ADC_InitStructure.ADC_NbrOfChannel = 1; //通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1
ADC_Init(ADC1, &ADC_InitStructure); //将结构体变量交给ADC_Init,配置ADC1
/*ADC使能*/
ADC_Cmd(ADC1, ENABLE); //使能ADC1,ADC开始运行
/*ADC校准*/
ADC_ResetCalibration(ADC1); //固定流程,内部有电路会自动执行校准
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
}
3.初始化需要注意的点
GPIO设置:
设置为模拟输入,模拟输入时,GPIO口是无用的,断开GPIO口,防止GPIO口的电压造成干扰
模拟输入是专门为AD设计的
通道采样时间的选择
通道采样时间,需要更快的转换就选择小的,慢的就选择大的
左对齐和右对齐两种模式
左对齐模式 (Left-Aligned)
- 定义:在左对齐模式下,转换结果的有效数据位于寄存器的最左侧。
- 特点:
- 转换结果的有效数据占据高位。
- 寄存器低位填充零。
- 应用:通常用于需要直接访问转换结果的应用,特别是当转换结果需要与处理器字节宽度匹配时。
- 示例:假设ADC分辨率为12位,在左对齐模式下,转换结果将占据寄存器的高12位,低位填充零。
右对齐模式 (Right-Aligned)
- 定义:在右对齐模式下,转换结果的有效数据位于寄存器的最右侧。
- 特点:
- 转换结果的有效数据占据低位。
- 寄存器高位填充零。
- 应用:通常用于需要保留高位零的应用,例如在进行数学运算时需要保持位宽不变。
- 示例:假设ADC分辨率为12位,在右对齐模式下,转换结果将占据寄存器的低12位,高位填充零。
校准
校准是固定的,不必深究