一、ADC框图
ADC输入电源
2. 输入通道
这16个通道对应着不同的IO口,此外 ADC1 的通道 16 连接到了芯片内部的温度传感器,通道 17连接到了VRefInt(内部参照电压)。
3. 规则通道与注入通道
a)规则通道组:
i)相当正常运行的程序。最多16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中。
ii)规则通道中的转换顺序由三个寄存器控制:SQR1、SQR2、SQR3,它们都是32位寄存器。SQR寄存器控制着转换通道的数目和转换顺序,只要在对应的寄存器位SQx中写入相应的通道,这个通道就是第x个转换。
b)注入通道组:
i)相当于中断。最多4个通道。注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的JL[1:0]中。
ii)和规则通道转换顺序的控制一样,注入通道的转换也是通过注入寄存器来控制,只不过只有一个JSQR寄存器来控制。
4. 规则通道与注入通道
ADC需要一个触发信号来实行模/数转换,其一就是通过直接配置寄存器触发,通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。另外,还可以通过内部定时器或者外部IO触发转换,也就是说可以利用内部时钟让ADC进行周期性的转换,也可以利用外部IO使ADC在需要时转换,具体的触发由控制寄存器CR2决定。
5.转换时间
ADC的每一次信号转换都要时间,这个时间就是转换时间,转换时间由输入时钟和采样周期来决定。
a)输入时钟
由于ADC在STM32中是挂载在APB2总线上的,所以ADC得时钟是由PCLK2经过分频得到的。
b)采样周期
ADC预分频器的ADCCLK是ADC模块的时钟来源。通常,由时钟控制器提供的ADC_CLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器。 分频因子由RCC_CFGR的ADCPRE[1:0]配置,可配置2/4/6/8分频。
为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M。
T = 采样时间 + 12.5个周期,其中1周期为1/ADC_CLK
例如,当 ADC_CLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到: Tcovn=1.5+12.5=14 个周期=1us。
6.数据寄存器
转换完成后的数据就存放在数据寄存器中,但数据的存放也分为规则通道转换数据和注入通道转换数据的。
a)规则数据寄存器
规则数据寄存器负责存放规则通道转换的数据,通过32位寄存器ADC_DR来存放。当使用ADC独立模式(也就是只使用一个ADC,可以使用多个通道)时,数据存放在低16位中,当使用ADC多模式时高16位存放ADC2的数据。需要注意的是ADC转换的精度是12位,而寄存器中有16个位来存放数据,所以要规定数据存放是左对齐还是右对齐。
当使用多个通道转换数据时,会产生多个转换数据,然而数据寄存器只有一个,多个数据存放在一个寄存器中会覆盖数据导致ADC转换错误,所以我们经常在一个通道转换完成之后就立刻将数据取出来,方便下一个数据存放。一般开启DMA模式将转换的数据,传输在一个数组中,程序对数组读操作就可以得到转换的结果。
b)注入数据寄存器
7.数据寄存器
a)规则通道转换完成中断
规则通道数据转换完成之后,可以产生一个中断,可以在中断函数中读取规则数据寄存器的值。这也是单通道时读取数据的一种方法。
b)注入通道转换完成中断
注入通道数据转换完成之后,可以产生一个中断,并且也可以在中断中读取注入数据寄存器的值,达到读取数据的作用。
c)模拟看门狗事件
当输入的模拟量(电压)不再阈值范围内就会产生看门狗事件,就是用来监视输入的模拟量是否正常。
以上中断的配置都由ADC_SR寄存器决定:
链接:STM32—ADC详解_stm32adc功能详解_Aspirant-GQ的博客-CSDN博客
二、ADC的转换模式
1. 单次转换模式
ADC只执行一次转换;
2. 连续转换模式(Continuous Conversion Mode)
转换结束之后马上开始新的转换;
3. 扫描模式(Scan Conversion Mode)
ADC扫描被规则通道和注入通道选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续 转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
扫描模式简单的说是一次对所有所选中的通道进行转换,比如开了ch0、ch1、ch4、ch5。ch0转换完以后就会自动转换通道1、4、5直到转换完这个过程不能被打断。如果开启了连续转换模式,则会在转换完ch5之后开始新一轮的转换。
4. 间断模式(Discontinuous Conversion Mode)
触发一次,转换一个通道,在触发,在转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。
间断模式可以说是对扫描模式的一种补充。它可以把0、1、4、5这四个通道进行分组。可以分成0、1一组,4、5一组。也可以每个通道单独配置为一组。这样每一组转换之前都需要先触发一次。
三、ADC单通道与多通道
ADC单通道
只进行一次ADC转换:配置为“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换。
进行连续ADC转换:配置为“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断连续。
ADC多通道
只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换。
进行连续ADC转换:配置为“连续转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。
需要注意的是,如果开启了多通道ADC,需要将每次转换的数据及时取出,否则会被后面的的数据覆盖掉。
链接:https://blog.csdn.net/as480133937/article/details/99627062
四、不同通道ADC采样不同引脚的电压示例
STM32CubeMX设置
主函数
while (1)
{
int16_t adcBuf[2];
for(int i=0;i<2;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
adcBuf[i]=HAL_ADC_GetValue(&hadc1);
printf("adc %d = %d \r\n",i,adcBuf[i]);
}
HAL_ADC_Stop(&hadc1);
HAL_Delay(1000);
}
配置分析
分析配置成这样的模式,扫描模式是在配置为多个通道必须打开的,CubeMX上也默认好了,只能使能。单次转换模式是我不需要不停的去采集每个通道值,而是把两个通道采集完以后就让它停止。间断模式可以让扫描的两个通道进行分成两个组,CubeMX参数里面Number of Discontinous Conversions是配置间断组每个组有几个通道的,这里必须配置为1(否则在获取ad值得时候只能读取到每个间断组最后一个通道)。
链接:https://blog.csdn.net/qq_35241004/article/details/120165458文章来源:https://www.toymoban.com/news/detail-459246.html
输出结果
这里将PC4引脚连接到了GND,PC5引脚连接到了3.3V。文章来源地址https://www.toymoban.com/news/detail-459246.html
到了这里,关于STM32 | STM32CubeMX基础之ADC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!