STM/GD32 ADC知识汇总(理论,参考野火电子《F4开发指南》)

一、单个ADC功能框图

学会看这个框图,对整个ADC有一个整体的把握。

        1、电压输入范围

        ADC输入范围:VREF-≤VIN ≤VREF+。由这四个引脚决定。一般是在外部加一个电压调理电路,将输入放到上述范围内,ADC才可以测量。

        2、输入通道

        STM32的ADC通道多达19个,其中的外部通道有16个,就是框图中的ADCx_IN0、ADCx_IN1⋯ADCx_IN5,对应着不同的IO口。剩余的3个通道属于内部通道,ADC2和3的内部通道16/17/18连接到内部的VSS,ADC1的16连接到内部VSS,17连接到内部参考电压VREFINT(可以用来测参考电压),18连接到内部的温度传感器或备用电源VBAT(可以用来测温度和备用电源电量)。

        每个ADC相同通道编号可能对应着不同的引脚。

   外部的16个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有16路,注入通 道最多有4路。

        2.1、规则通道 regular channel

        通常使用到的通道都是这个通道。

        2.2、注入通道 injected channel

        插入、 插队的意思,是一种不安分的通道。它是一种在规则通道转换的时候强 行插入要转换的一种通道。如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注 入通道,等注入通道转换完成后,再回到规则通道的转换流程。这点跟中断程序很像。

        所以,注入通道只有在规则通道存在时才会出现。

        3、转换顺序

        3.1、规则序列

        规则序列寄存器用来设置每个通道要第几个来转换。寄存器有3个,分别为SQR3、SQR2、SQR1。SQR3控制着规则序列中的第一个到第六个转换,SQR2控制着规则序列中的第7到第12个转换,SQR1控制着规则序 列中的第13到第16个转换。

        序列的意思就是要转换的通道顺序。比如通道16想第1个转换,那么SQR3的SQ1中写入16,通道1想第8个转换,那就把8写入到SQR2的SQ8中。具体想转换多少个通道,由SQL[3:0]决定,最多16个通道。

        3.3、注入序列

        寄存器JSQR只有一个,最多支持4个通道,具体多少个由JSQR的JL[2:0]决定。

当JL<4时,它和规则序列转换顺序不一样。第一个转换的JSQx,x=4-JL,跟SQR刚好相反。比如JL=00(1个转换),那么转换是从JSQ4开始,而不是JSQ1。这要注意。

        4、触发源

        通道和转换顺序设置好以后,就开始转换了。开始转换有几种方式,

        第一种最简单的,ADC的CR2寄存器中ADON控制开始、停止启动。

        ADC还支持外部事件触发转换,这个触发包括内部定时器触发 和外部IO触发。所以还需要选择触发源,是否激活触发源,以及触发源极性(有4种状态,分别是:禁止触发检测、上升沿检测、下降沿 检测以及上升沿和下降沿均检测。)。

        5、采样时间

        5.1、ADC时钟

        ADC输入时钟ADC_CLK由PCLK2经过分频产生,最大值是36MHz,典型值为30MHz。

        涉及到的寄存器:ADC通用控制寄存器ADC_CCR。设置分频 因子ADCPRE[1:0]设置,可设置的分频系数有2、4、6和 8,注意这里没有1分频。对于STM32F407ZGT6我们一般设置PCLK2=HCLK/2=84MHz。所以程 序一般使用4分频或者6分频。

         5.2、采样时间

        ADC需要若干个ADC_CLK周期完成对输入的电压进行采样。

        涉及到的寄存器:ADC采样时间寄存器ADC_SMPR1和ADC_SMPR2,通过SMP[2:0]位设置采样的周期数,ADC_SMPR2控制的是通道0~9, ADC_SMPR1控制的是通道10~17。 

        其中采样周期最小是 3 个周期(即最快),每个周期为1/ADC_CLK。

        ADC的总转换时间跟ADC的输入时钟和采样时间有关,公式为:Tconv = 采样时间+12个周期(12bit对应12个周期,分辨率越高, AD转换数据精度越高,转换时间也越长;分辨率越低,AD转换数据精度越低,转换时间也越 短)。

        如果ADC_CLK=21M,最短的转换时间为(3+12)/21MHz=0.7142us。

        6、数据寄存器

        6.1、规则数据寄存器ADC_DR(1个)

        32位的寄存器,只有低16位有效并且只是 用于独立模式(仅仅使用三个ADC中的一个)存放转换完成数据。因为ADC的最大精度是12位,允许存放数据是左对齐或者右对齐,由ADC_CR2的11 位ALIGN设置。若左对齐,12bit精度,转换完成存放到DR的[4:15],右对齐,转换完成存放到DR的[0:11]。

        16个通道共用一个DR寄存器,有可能会丢数,所以在转换完成后应该尽快读走数据或开启DMA传输。如果不使用DMA,可以检查SR状态寄存器中转换进度,进而进行程序控制。

        6.2、注入数据寄存器ADC_JDRx(4个)

        4个通道,4个JDR寄存器,每个通道有自己的寄存器,也是低16位有效,也可设置对齐方式。

        6.3、通用规则数据寄存器ADC_CDR(1个)

        适用于双重或三重模式的。双重模式就是同时使用ADC1 和ADC2,而三重模式就是三个ADC同时使用。在双重或者三重模式下一般需要配合DMA数 据传输使用。

        7、中断

        转换结束后会产生中断和DMA请求,中断分为四种:规则通道转换结束中断,注入转换通道转换结 束中断,模拟看门狗中断和溢出中断。

        7.1 规则通道/注入通道转换结束中断

        7.2 溢出中断

        如果发生DMA传输数据丢失,会置位ADC状态寄存器ADC_SR的OVR位,如果同时使能了 溢出中断,那在转换结束后会产生一个溢出中断。

        7.3 模拟看门狗中断     

        当被ADC转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模 拟看门狗中断。   

        8、电压转换

        12bit的满量程对应的VRef,读到的数据寄存器的值X,那么实际采集到的电压Y=VRef*X/(2^12)。

二、stm32/gd32 ADC其他术语

       可以通过结构体类型来了解。

        1、ADC_InitTypeDef

typedef struct {
     uint32_t ClockPrescaler;/*ADC 时钟分频系数 */
     uint32_t Resolution;/*ADC 分辨率选择 */
     uint32_t DataAlign;/* 输出数据对齐方式 */
     uint32_t ScanConvMode;/* 扫描转换模式,单通道AD转换不使用,多通道才使用扫描*/
     uint32_t EOCSelection;/* 结束转换选择,参考寄存器CR2的bit10,意思是在每个规则转换序列结束时将EOC位置1还是在每个规则转换结束时置1 */
     uint32_t ContinuousConvMode;/* 连续转换模式,连续转换还是单次转换,单次转换后想要再进行转换需要手动启动 */
     uint32_t NbrOfConversion;/* AD规则转换序列数目 */
     uint32_t DiscontinuousConvMode; /* 不连续采样模式 */
     uint32_t NbrOfDiscConversion; /* 不连续采样通道 */
     uint32_t ExternalTrigConv;/* 外部事件触发选择 */
     uint32_t ExternalTrigConvEdge; /* 外部事件触发极性:有禁
止触发检测、上升沿触发检测、下降沿触发检测以及上升沿和下降沿均可触发检测。 */
     uint32_t DMAContinuousRequests; /*DMA 连续请求转换 */
} ADC_InitTypeDef;

        2、ADC_ChannelConfTypeDef

        

typedef struct 
{
  uint32_t Channel;                 /*ADC 转换通道 */
  uint32_t Rank;                   /*ADC 序列,也就是第几个转换 */
  uint32_t SamplingTime;           /*ADC 采样时间,在代码注释中说到:总的转换时间为采样时间+处理时间,其中处理时间不同的分辨率不同,12位=12个周期,10位=11周期,8位=9周期,6位=7周期 */
  uint32_t Offset;                 /*预留 */
}ADC_ChannelConfTypeDef;

三、编程要点

        学习编写HAL库那样的代码,能提高自身代码设计水平,使用宏定义引脚信息方便硬件电路改动时程序移植。

        1、独立模式单通道应用

        单通道,在EOC中断中或while(1)查询EOC状态置位后读取数据。

        1) 初始ADC用到的GPIO:先使能GPIO时钟,配置为模拟输入;
        2) 设置ADC的工作参数并初始化:使能ADC时钟,配置ADC连续转换模式,通道个数为1,配置通道:哪个通道,采样时间多少,第几个转换;
        3) 设置ADC工作时钟;
        4) 设置ADC转换通道顺序及采样时间;
        5) 配置使能ADC转换完成中断,配置中断优先级,在中断内读取转换完数据:ADC中断提供了一个回调函数HAL_ADC_ConvCpltCallback(),在这里调用HAL_ADC_GetValue()读DR寄存器;
        6) 使能ADC;
        7) 使能软件触发ADC转换。

        2、独立模式多通道应用

        ADC转换结果数据使用DMA方式传输至指定的存储区,这样取代单通道实验使用中断服务的 读取方法。实际上,多通道ADC采集一般使用DMA数据传输方式更加高效方便。

        1) 初始化配置ADC目标引脚为模拟输入模式,先使能GPIO时钟
        2) 使能ADC时钟和DMA时钟;
        3) 配置DMA从ADC规则数据寄存器传输数据到我们指定的存储区,传输为16位,;
        4) 配置通用ADC为独立模式,采样4分频;
        5) 设置ADC为12位分辨率,启动扫描,连续转换,不需要外部触发;
        6) 设置ADC转换通道顺序及采样时间;
        7) 使能DMA请求,DMA在AD转换完自动传输数据到指定的存储区;
        8) 启动ADC转换;
        9) 使能软件触发ADC转换。

        3、三重ADC交替模式(通常采集同一个通道)

        AD转换包括采样阶段和转换阶段,在采样阶段才对通道数据进行采集;而在转换阶段只是将采 集到的数据进行转换为数字量输出,此刻通道数据变化不会改变转换结果。独立模式的ADC采 集需要在一个通道采集并且转换完成后才会进行下一个通道的采集。双重或者三重ADC的机制使用两个或以上ADC同时采样两个或以上不同通道的数据或者使用两个或以上ADC交叉采集 同一通道的数据。双重或者三重ADC模式较独立模式一个最大的优势就是转换速度快。

        三重ADC交替模式是针对同一通道的使用三个ADC交叉采集,就是 在ADC1采样完等几个时钟周期后ADC2开始采样,此时ADC1处在转换阶段,当ADC2采样 完成再等几个时钟周期后ADC3就进行采样此时ADC1和ADC2处在转换阶段,如果ADC3采 样完成并且ADC1已经转换完成那么就可以准备下一轮的循环,这样充分利用转换阶段时间达 到增快采样速度的效果。

        

        双重或者三重ADC需要使用通用规则数据寄存器ADC_CDR,这点跟独立模式不同。

        1) 初始化配置ADC目标引脚为模拟输入模式,先使能GPIO时钟
        2) 使能ADC1、ADC2、ADC3以及DMA时钟;
        3) 配置DMA控制将ADC通用规矩数据寄存器数据转存到指定存储区;
        4) 配置通用ADC为三重ADC交替模式,采样延迟,使用DMA模式2,ADC1为主模式,其他两个ADC为从模式,所以这里使用ADC1句柄:HAL_ADCEx_MultiModeConfigChannel(&ADC_Handle1,&mode);;
        5) 设置ADC1、ADC2和ADC3为12位分辨率,禁用扫描,连续转换,不需要外部触发;
        6) 设置ADC1、ADC2和ADC3转换通道顺序及采样时间;
        7) 使能ADC1的DMA请求,在ADC转换完后自动请求DMA进行数据传输;
        8) 启动ADC1、ADC2和ADC3转换;
        9) 使能软件触发ADC转换。

        4、双重ADC规则同时模式(多通道)

        双重ADC或三重ADC规则同时指的是,多个ADC在同一时刻可对不同的通道进行采样(采样时间不重叠)。

        使用的DMA模式2。

        1) 初始化配置ADC目标引脚为模拟输入模式,先使能GPIO时钟
        2) 使能ADC1、ADC2以及DMA时钟;
        3) 配置DMA控制将ADC通用规矩数据寄存器数据转存到指定存储区;
        4) 配置通用ADC为双重规则同时模式,采样延迟,使用DMA模式1(DMA传输时传输长度为2),ADC1为主模式,其他两个ADC为从模式,所以这里使用ADC1句柄:HAL_ADCEx_MultiModeConfigChannel(&ADC_Handle1,&mode);;
        5) 设置ADC1、ADC2为12位分辨率,禁用扫描,连续转换,不需要外部触发;
        6) 设置ADC1、ADC2转换通道(各有一个通道)顺序及采样时间;
        7) 使能ADC1的DMA请求,在ADC转换完后自动请求DMA进行数据传输;
        8) 启动ADC1、ADC2转换;
        9) 使能软件触发ADC转换。

四、总结

        1、AD采集,在软件配置上没什么大的区别。

        1)需要设计者首先确定自己测几个通道的信号,如果是单个,那可以使用DMA、中断、轮询的方式读取数据,如果还需要多个ADC采集同一个通道,那可以使用多重或三重交替模式采集。

        2)如果是多通道,想只使用一个ADC就能满足速度要求,那么可以配置独立模式下的多通道,使用DMI传输。多通道采集的周期大概一致,比如所有通道差不多1ms采集一次,那就可以都设置成规则通道;如果有的通道偶尔采集一次,比较重要,需要中断规则通道的那些通道,那么就可以使用注入通道采集。

        3)如果是多通道,速度要求特别快,那可以考虑多重或三重规则同时模式。

        总之,它可满足你的应用需求。

  • 40
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值