国民技术
直播中

jf_16332518

2年用户 13经验值
私信 关注
[经验]

【国民技术N32项目移植】标题: 【国民技术N32项目移植】

开发环境:

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.png
描述2.png

描述3.png

实现功能:

1、 利用开发板G45X采集NTC的参数,并通过串口打印出相关的值。

2、 NTC连接的引脚PA7,GPIO17脚。

原理图:

描述4.png

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 );

更多回帖

发帖
×
20
完善资料,
赚取积分