目录
一、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规则组的转换结果
}