注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lugl4313820的个人空间 https://home.eeworld.com.cn/space-uid-1269709.html [收藏] [复制] [分享] [RSS]
日志

【国民技术车规MCU N32A455开发板】3、简单测试ADC功能

已有 490 次阅读2024-3-22 19:32

【国民技术车规MCU N32A455开发板】1、开发板测试 

【国民技术车规MCU N32A455开发板】2、驱动LCD屏 

我的目的是测电流,所以先得把ADC摸出来。所以今天就分享ADC的基本数据采集。

【ADC输入源选择】

由于我的最终目标是测试PGA的功能,所以先选择PA6为ADC输入,进行测试。

【驱动步骤】

1、使能GPIOA的时钟、ADC的时钟,配置ADC1的分频。

//打开时钟
	RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC1, ENABLE);
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
	/* RCC_ADCHCLK_DIV16*/
  ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB,RCC_ADCHCLK_DIV16);
  RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSE, RCC_ADC1MCLK_DIV8);  //selsect HSE as RCC ADC1M CLK Source	

2、配置PA6为模拟输入:

	//adc1 PA6为输入通道 
	
  /* Configure PC0 PC1 as analog input -------------------------*/
	GPIO_InitStructure.Pin       = GPIO_PIN_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

3、配置ADC的参数,同时使能ADC1,具体代码如下:

	  /* ADC configuration ------------------------------------------------------*/
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = DISABLE;
    ADC_InitStructure.ContinueConvEn = DISABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_NONE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_Init(ADC1, &ADC_InitStructure);


    /* Enable ADC */
    ADC_Enable(ADC1, ENABLE);
    /*Check ADC Ready*/
    while(ADC_GetFlagStatusNew(ADC1,ADC_FLAG_RDY) == RESET)
        ;
    /* Start ADC calibration */
    ADC_StartCalibration(ADC1);
    /* Check the end of ADC calibration */
    while (ADC_GetCalibrationStatus(ADC1));

4、实现一个读取ADC指定通道的函数,传入参数为ADC1-4,通道为相应的通道 。

uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel)
{
    uint16_t dat;
    
    ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_239CYCLES5);
    /* Start ADC Software Conversion */
    ADC_EnableSoftwareStartConv(ADCx, ENABLE);
    while(ADC_GetFlagStatus(ADCx, ADC_FLAG_ENDC)==0){
    }
    ADC_ClearFlag(ADCx, ADC_FLAG_ENDC);
    ADC_ClearFlag(ADCx, ADC_FLAG_STR);
    dat=ADC_GetDat(ADCx);
    return dat;
}

在选择对应的通道中,官方的库n32a455_adc.h文件给我们定义好的对应有通道的宏定义,方便我们了解如何配置对应的通道,就不用查数据手册这么麻烦了。

  5、在主函数中,我添加代码,读取这一通道的数据,并展示到LCD屏上:


#include "main.h"

#include "log.h"
#include "lcd_init.h"
#include "lcd.h"
#include "adc.h"
#include "delay.h"

__IO uint16_t ADC1ConvertedValue[5];
int main(void)
{

    log_init();
		init_adc();
	
		LCD_Init();//LCD初始化
		LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
		LCD_ShowChinese(10,0,"国民技术",RED,WHITE,24,0);
		LCD_ShowString(24,30,"N32A455",RED,WHITE,16,0);
		while(1)
		{
				ADC1ConvertedValue[0]=ADC_GetData(ADC1,ADC1_Channel_03_PA6);
				LCD_ShowIntNum(24,50,ADC1ConvertedValue[0],4,RED,WHITE, 16);
				LCD_ShowFloatNum1(24,80,(float)ADC1ConvertedValue[0]*3.3/4095.0,4,RED,WHITE, 16);
				delay_ms(500);
		}

}

【测试】

通过PA6,使用数字电源输入电压值,就可以测量出对应的电压了。效果如下图所示:

 

【总结】

国民技术给了很丰富的例子,通过阅读数据手册与官方的示例,就可快速的入门他们的外设使用。同时ADC的测量值也非常准。

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章