自学内容网 自学内容网

STM32的ADC详解

目录

一、ADC简介

二、ADC的时钟

三、ADC特性

四、ADC功能说明

五、规则通道和注入通道

1.规则通道

2.注入通道

3.区别

六、数据寄存器

1.右对齐

2.左对齐

七、转换模式

1.单次转换模式

2.续转换模式

3.扫描模式

4.区别

八、程序实现

1.需求

2.ADC初始化

3.AD采集


一、ADC简介

ADC是模拟数字转换器(Analog to Digital Converter),是一种将模拟量(如电压值、光敏电阻阻值、热敏电阻阻值等)转换为数字量的设备。

二、ADC的时钟

ADC有两个时钟方案,一个是针对数字电路的,一个是根据模拟电路的。

模拟电路的时钟:ADCCLK,所有 ADC 共用,此时钟来自于 APB2 时钟,该预分频器允许 ADC 在 fPCLK2 /2、/4、/6 或 /8 下工作。

数字接口的时钟:此时钟等效于 APB2 时钟。可以通过 RCC APB2 外设时钟使能RCC_APB2ENR为每个 ADC 使能/禁止数字接口的时钟。

三、ADC特性

STM32F4的ADC是12位逐次逼近型的模拟数字转换器,具有多达19个复用通道,可测量来自16个外部源、2个内部源通道的信号。ADC的结果存储在一个左对齐或者右对齐的16位数据寄存器中。STM32F4系列有3个ADC,这些ADC可以独立使用,也可以使用双重或者三重模式来提高采样率

ADC的主要特性包括

(1)可配置12位、10位、8位或6位分辨率

(2)在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断

(3)支持单次和连续转换模式

(4)自动将通道0转换为通道“n”的扫描模式

(5)数据被存储在16位数据寄存器中,数据对齐以保持内置数据一致性

(6)可独立设置各通道采样时间,以及外部触发器选项。

(7)STM32F4的ADC还具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或者下限。

四、ADC功能说明

VREF是ADC的的参考电压,VDDA是ADC的供电引脚,ADCx_IN0-ADCx_IN15代表16个外部通道,温度传感器、VREFINT、VBAT代表3个内部通道,然后被分出了16个规则通道和和4个注入通道。

五、规则通道和注入通道

1.规则通道

每个ADC存在16个规则通道,规则通道可以理解为就是普通的转换通道,通常我们在没有配置注入转换通道的情况下,主要使用的就是这个通道。规则通道的转换结果储存在规则数据寄存器(ADC_DR)中,所有规则通道的转换结果均共用此规则数据寄存器,因此为避免数据丢失,在每个通道转换完毕时应尽快将转换结果读出。

2.注入通道

每个ADC存在4个注入通道,注入通道可以理解为一种中断或插入的通道,它可以在规则通道转换的时候强行插入要转换的通道,注入通道可以中断规则通道的转换,并在注入通道组转换完成后,规则通道组的规则转换会从上次中断的规则转换处恢复。每个注入通道均有一个用于储存转换结果的注入数据寄存器(ADC_JDRx),所以他们的转换结果互不影响。

3.区别

 规则通道适合于需要连续、大规模数据采集的场景,而注入通道则适用于需要快速响应、单次数据采集的情况。

六、数据寄存器

数据寄存器有16位,但是最多12位有效吗,ADC_CR2 寄存器中的 ALIGN 位用于选择转换后存储的数据的对齐方式,可选择左对齐和右对齐两种方式,读数后处理的方式也不一样。

1.右对齐

2.左对齐

七、转换模式

1.单次转换模式

  • 在单次转换模式下,ADC按照设定的配置执行一次转换,然后停止转换并等待进一步的触发。
  • 这种模式适用于需要单次获取转换结果的应用场景。
  • 在单次转换模式下,无论是规则通道还是注入通道,ADC都会执行一次转换然后停止。
  • 如果选择多个通道进行转换,并且没有启动扫描模式,那么ADC只会转换选定的第一个通道。

2.续转换模式

  • 在连续转换模式下,ADC在完成一次转换后自动开始下一次转换,无需外部触发。
  • 这种模式适用于需要持续采样的应用场景,如数据采集。
  • 在连续转换模式下,ADC会持续进行转换,直到被外部触发停止或复位。
  • 如果选择多个通道进行转换,并且启动了扫描模式,那么ADC会按照通道号的顺序对设置的多个通道进行连续转换。

3.扫描模式

  • 扫描模式是与通道选择相关的功能,而不是一个独立的转换模式。
  • 在扫描模式下,可以通过设置多个输入通道进行连续转换。
  • ADC将按照通道号的顺序对设置的多个通道进行转换,并将结果按顺序保存在对应的数据寄存器中。
  • 扫描模式通常与连续转换模式一起使用,以实现多个通道的连续采样和转换。

4.区别

  • 单次转换模式仅执行一次转换并停止。
  • 连续转换模式在完成一次转换后自动开始下一次转换,无需外部触发。
  • 扫描模式允许设置多个通道进行连续转换,并通常与连续转换模式一起使用。

八、程序实现

1.需求

我们用STM32F429的PA5来实现AD的采集,根据数据手册,我们得知PA5属于ADC1的通道5。

2.ADC初始化

设置ADC1,4分频,12位模式,右对齐等ADC基本参数。

ADC_HandleTypeDef ADC1_Handler;//ADC句柄
//初始化ADC
//ch: ADC_channels 
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{ 
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC1_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式
    ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC1_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换
    ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1 
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC1_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
    HAL_ADC_Init(&ADC1_Handler);                                 //初始化 
}

//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();//开启GPIOA时钟

    GPIO_Initure.Pin=GPIO_PIN_5;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

3.AD采集

我们用ADC1的通道5,所以传入参数ch=5,结果返回一次ADC规则组的转换结果。


//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
u16 Get_Adc(u32 ch)   
{
    ADC_ChannelConfTypeDef ADC1_ChanConf;
    
    ADC1_ChanConf.Channel=ch;                                   //通道
    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置

    HAL_ADC_Start(&ADC1_Handler);                               //开启ADC

    HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
 
return (u16)HAL_ADC_GetValue(&ADC1_Handler);        //返回最近一次ADC1规则组的转换结果
}


原文地址:https://blog.csdn.net/qq_38072731/article/details/140485200

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!