开发环境:
MDK:Keil
开发板:N32G45x STB 开发板
MCU:N32G45X
功能特点:
9模拟数字转换(ADC)
9.1简述
12位ADC是使用逐次遇近的高速模数转换器。它有多个通道,每个通道的AD转换有四种执行模式:单
次、连续、扫描或间断。ADC转换值存储(左对齐/右对齐)在16位数据寄存器中。可以通过模拟看门狗
检测输入电压是否在用户定义的高/低阈值内,并且ADC的输入时钟的最大频率为72MHz。
9.2ADC主要特征
■支持最多4个ADC,支持单端输入和差分输入,可测量40个外部和7个内部信号源
ADC1支持11个外部通道,ADC2支持13个外部通道,ADC3支持15个外部通道,ADC4支持13个
外部通道
■支持12位、10位、8位、6位分辨率
◆12bit分辨率下最高采样速率5.14MSPS
◆10bit分辨率下最高采样速率6MSPS
◆Sbit分率下最高采样速率7.2MSPS
◆6bit分辨率下最高采样速率9MSPS
■ADC时钟源分为工作时钟源、采样时钟源和计时时钟源
◆仅可配置AHBCLK作为工作时钟源,最高可到144MHz
◆可配置PLL作为采样时钟源,最高可到72MHz,支持分频1,2,4,6.8,10.12,16,32,64,128,256
◆可配置AHB_CLK作为采样时钟源,最高可到72MHz,支持分频1,2,4.6,8,10.12,16.32
◆计时时钟用于内部计时功能,频率必须配置成1MHz
■支持触发采样,包括EXTITIMER
■各通道的采样时间间隔可编程
■支持扫描模式
■支持单次转换
■支持连续转换
■支持间断模式
■支持自校准
支持DMA
■中断生成
转换结束
◆注入转换结束
功能框图:
实现功能:
1、 利用开发板G45X采集NTC的参数,并通过串口打印出相关的值。
2、 NTC连接的引脚PA7,GPIO17脚。
原理图:
ADC描述:
12 位 ADC 是使用逐次逼近的高速模数转换器。它有多个通道,每个通道的 A/D 转换有四种执行模式:单次、连续、扫描或间断。 ADC 转换值存储(左对齐/右对齐)在 16 位数据寄存器中。可以通过模拟看门狗检测输入电压是否在用户定义的高/低阈值内,并且 ADC 的输入时钟的最大频率为 72MHz。
核心代码如下:
ADC初始化:
/* System clocks configuration ---------------------------------------------*/
RCC_Configuration();
/* GPIO configuration ------------------------------------------------------*/
GPIO_Configuration();
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.MultiChEn = ENABLE;
ADC_InitStructure.ContinueConvEn = ENABLE;
ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE;
ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R;
ADC_InitStructure.ChsNumber = 1;
ADC_Init(ADC, &ADC_InitStructure);
/* DMA channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA_CH1);
DMA_InitStructure.PeriphAddr = (uint32_t)&ADC->DAT;
DMA_InitStructure.MemAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_SRC;
DMA_InitStructure.BufSize = 1;
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_DISABLE;
DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.CircularMode = DMA_MODE_CIRCULAR;
DMA_InitStructure.Priority = DMA_PRIORITY_MEDIUM;
DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
DMA_Init(DMA_CH1, &DMA_InitStructure);
DMA_RequestRemap(DMA_REMAP_ADC1, DMA, DMA_CH1, ENABLE);
/* Enable DMA channel1 */
DMA_EnableChannel(DMA_CH1, ENABLE);
/* ADC1 regular channel8 configuration */
ADC_ConfigRegularChannel(ADC, ADC_CH_8_PA7, 1, ADC_SAMP_TIME_55CYCLES5);
/* Enable ADC DMA */
ADC_EnableDMA(ADC, ENABLE);
/* Enable ADC */
ADC_Enable(ADC, ENABLE);
/* Check ADC Ready */
while(ADC_GetFlagStatusNew(ADC,ADC_FLAG_RDY) == RESET)
;
/* Start ADC1 calibration */
ADC_StartCalibration(ADC);
/* Check the end of ADC1 calibration */
while (ADC_GetCalibrationStatus(ADC))
;
/* Start ADC1 Software Conversion */
ADC_EnableSoftwareStartConv(ADC, ENABLE);```
获取值:
solid_humi = (ADCConvertedValue/26);
通过串口打印出:
printf( "ADC value is %d", ADCConvertedValue );