989|2

410

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【ACM32G103RCT6开发板测评】+ ADC测试 [复制链接]

 

测试下ADC功能,检测PA1端口输入的电压值。

 

一、ADC内部框图

内部一共有20路ADC输入

测试使用内部IN1,对应的PA1引脚

 

二、程序部分

 

2.1、ADC引脚初始化

acm32g103_hal_msp.c

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    uint32_t i;
    GPIO_InitTypeDef GPIO_Handle; 
    uint32_t ADC_Pin_Map[][3] =
    {
//        { ADC_CHANNEL_0_EN, (uint32_t)GPIOA, GPIO_PIN_0 }, 
        { ADC_CHANNEL_1_EN, (uint32_t)GPIOA, GPIO_PIN_1 },
//        { ADC_CHANNEL_2_EN, (uint32_t)GPIOA, GPIO_PIN_2 },
//        { ADC_CHANNEL_3_EN, (uint32_t)GPIOA, GPIO_PIN_3 },
//        { ADC_CHANNEL_4_EN, (uint32_t)GPIOA, GPIO_PIN_4 },
//        { ADC_CHANNEL_5_EN, (uint32_t)GPIOA, GPIO_PIN_5 },
//        { ADC_CHANNEL_6_EN, (uint32_t)GPIOA, GPIO_PIN_6 },
//        { ADC_CHANNEL_7_EN, (uint32_t)GPIOA, GPIO_PIN_7 },
//        { ADC_CHANNEL_8_EN, (uint32_t)GPIOB, GPIO_PIN_0 },
//        { ADC_CHANNEL_9_EN, (uint32_t)GPIOB, GPIO_PIN_1 },
//        { ADC_CHANNEL_10_EN, (uint32_t)GPIOC, GPIO_PIN_0 },
//        { ADC_CHANNEL_11_EN, (uint32_t)GPIOC, GPIO_PIN_1 },
//        { ADC_CHANNEL_12_EN, (uint32_t)GPIOC, GPIO_PIN_2 },
//        { ADC_CHANNEL_13_EN, (uint32_t)GPIOC, GPIO_PIN_3 },
//        { ADC_CHANNEL_14_EN, (uint32_t)GPIOC, GPIO_PIN_4 },
//        { ADC_CHANNEL_15_EN, (uint32_t)GPIOC, GPIO_PIN_5 },
        { 0xffffffff, 0 }, //结束标志
    };    

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();

    //Set gpio to analog.
    for(i = 0; ADC_Pin_Map[i][0] != 0xffffffff; i++)
    {
        if(hadc->Init.ChannelEn & ADC_Pin_Map[i][0])
        {
            GPIO_Handle.Pin            = ADC_Pin_Map[i][2];
            GPIO_Handle.Mode           = GPIO_MODE_ANALOG;
            GPIO_Handle.Pull           = GPIO_NOPULL;
            HAL_GPIO_Init((GPIO_TypeDef *)ADC_Pin_Map[i][1], &GPIO_Handle);   
        }
    }

    /* Enable ADC Clock */
    __HAL_RCC_ADC12_CLK_ENABLE();
    /* Clear Pending Interrupt */
    NVIC_ClearPendingIRQ(ADC12_IRQn);	
    /* Enable External Interrupt */
    NVIC_EnableIRQ(ADC12_IRQn);
  
}

2.2、acm32g103_it.c

#include "main.h"
#include "acm32g103_it.h"

extern TIM_HandleTypeDef tim2_handler; 
extern ADC_HandleTypeDef ADC_Handle;

void ADC1_2_IRQHandler(void)
{
    HAL_ADC_IRQHandler();
}

2.3、adc.c

#include "main.h"

#define BUFFER_LENGTH    (21)
uint32_t gadcBuffer[BUFFER_LENGTH];                 //ADC Value

//ADC_HandleTypeDef hadc;
ADC_HandleTypeDef ADC_Handle;

void ADC_Init_Polling_Nchannels(void)
{
    ADC_ChannelConfTypeDef ADC_ChannelConf;

    ADC_Handle.Init.ClockPrescaler = ADC_CLOCK_DIV16;       //ADC_CLK分频选择
    ADC_Handle.Init.Resolution     = ADC_RESOLUTION_12B;    //分辨率
    ADC_Handle.Init.DataAlign      = ADC_DATAALIGN_RIGHT;   //数据对齐
    ADC_Handle.Init.ConConvMode    = DISABLE;               //连续转换模式

    ADC_Handle.Init.DiscontinuousConvMode = DISABLE;        //间断模式
    ADC_Handle.Init.NbrOfDiscConversion   =1;               //间断模式通道计数
    ADC_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;  //触发模式:外部触发或软件触发
    ADC_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择
    ADC_Handle.Init.DMAMode = ADC_DMAMODE_DISABLE;          //DMA选择
    ADC_Handle.Init.OverMode = ADC_OVERMODE_DISABLE;        //溢出时是否保留上次采样数据

    ADC_Handle.Init.OverSampMode = ADC_OVERSAMPMODE_DISABLE;//过采样使能
    ADC_Handle.Init.Oversampling.Ratio =ADC_OVERSAMPLING_RATIO_2;//过采样率
    ADC_Handle.Init.Oversampling.RightBitShift =ADC_RIGHTBITSHIFT_2;//过采样移位系数
    ADC_Handle.Init.Oversampling.TriggeredMode =0;          //过采样触发模式    
    ADC_Handle.Init.AnalogWDGEn = ADC_ANALOGWDGEN_DISABLE;  //模拟看门狗
    ADC_Handle.Init.ChannelEn = ADC_CHANNEL_1_EN;

    ADC_Handle.Instance = ADC1;   

    HAL_ADC_Init(&ADC_Handle);


    /* The total adc regular channels number */
    ADC_Handle.ChannelNum = 1;


    ADC_ChannelConf.Channel = ADC_CHANNEL_1;
    ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ1;
    ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
    ADC_ChannelConf.SingleDiff = ADC_SINGLE_ENDED;
    ADC_ChannelConf.OffsetNumber = ADC_OFFSET_NONE;
    ADC_ChannelConf.Offset = 0;	
    HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
}

void HAL_ADC_IRQCallback(void)
{
    __IO uint32_t Status;


    Status = ADC_Handle.Instance->SR;
    /************ Check End of Conversion flag for injected ************/
    if(__HAL_ADC_GET_IT_SOURCE(&ADC_Handle, ADC_IE_JEOCIE))
    {
        if((Status & ADC_SR_JEOC) == ADC_SR_JEOC)
        {
            /* Conversion complete callback */ 
            if (NULL != ADC_Handle.InjectedConvCpltCallback)
            {
                ADC_Handle.InjectedConvCpltCallback(&ADC_Handle);
            }

            /* Clear injected group conversion flag */
            __HAL_ADC_CLEAR_FLAG(&ADC_Handle, ADC_SR_JEOC);
        }
    }

    /************ Check End of Conversion flag for injected group ************/
    if(__HAL_ADC_GET_IT_SOURCE(&ADC_Handle, ADC_IE_JEOGIE))
    {	
        if((Status & ADC_SR_JEOG) == ADC_SR_JEOG)
        {
            if(ADC_IS_SOFTWARE_START_INJECTED(&ADC_Handle)    || \
            (ADC_IS_SOFTWARE_START_REGULAR(&ADC_Handle) &&(ADC_Handle.Init.ConConvMode == 0)) && (HAL_IS_BIT_CLR(ADC_Handle.Instance->CR1, ADC_CR1_JAUTO))) 
            {
                /* Disable ADC end of conversion interrupt on injected injected */
                __HAL_ADC_DISABLE_IT(&ADC_Handle, ADC_IE_JEOCIE);

            }

        /* Conversion complete callback */ 
        if (NULL != ADC_Handle.InjectedGroupConvCpltCallback)
        ADC_Handle.InjectedGroupConvCpltCallback(&ADC_Handle);

        /* Clear injected group conversion flag */
        __HAL_ADC_CLEAR_FLAG(&ADC_Handle, ADC_SR_JEOG);

        }

    }

    /************ Check Conversion flag for regular Channel ************/
    if(__HAL_ADC_GET_IT_SOURCE(&ADC_Handle, ADC_IE_EOCIE))
    {
        if((Status & ADC_SR_EOC) == ADC_SR_EOC)
        {      
            /* Conversion complete callback */
            if (NULL != ADC_Handle.ConvCpltCallback)
            ADC_Handle.ConvCpltCallback(&ADC_Handle);

            /* Clear conversion flag */
            __HAL_ADC_CLEAR_FLAG(&ADC_Handle, ADC_SR_EOC);
        }
    }

    /************ Check End of Conversion flag for regular group ************/
    if(__HAL_ADC_GET_IT_SOURCE(&ADC_Handle, ADC_IE_EOGIE))
    {
        if((Status & ADC_SR_EOG) == ADC_SR_EOG)
        {      
            if((__HAL_ADC_CHECK_TRIG_REGULAR(&ADC_Handle, ADC_SOFTWARE_START)) && 
            (ADC_Handle.Init.ConConvMode == 0))
            {
                /* Disable ADC end of conversion interrupt on group regular */
                __HAL_ADC_DISABLE_IT(&ADC_Handle, ADC_IE_EOGIE);
            }

            /* Conversion complete callback */
            if (NULL != ADC_Handle.GroupCpltCallback)
            ADC_Handle.GroupCpltCallback(&ADC_Handle);

            /* Clear regular group conversion flag */
            __HAL_ADC_CLEAR_FLAG(&ADC_Handle, ADC_SR_EOG);
        }
    }

    /************ Check Analog watchdog flags ************/
    if(__HAL_ADC_GET_IT_SOURCE(&ADC_Handle, ADC_IE_AWDIE))
    {
        if((Status & ADC_SR_AWD) == ADC_SR_AWD)
        {
            /* Level out of window callback */ 
            if (NULL != ADC_Handle.LevelOutOfWindowCallback)
            ADC_Handle.LevelOutOfWindowCallback(&ADC_Handle);

            /* Clear the ADC analog watchdog flag */
            __HAL_ADC_CLEAR_FLAG(&ADC_Handle, ADC_SR_AWD);
            }
    } 
}


void adc_test(void)
{
	uint32_t i;
	float vol=0.0;

	ADC_Init_Polling_Nchannels();
	
	while(1)
	{
			for (i = 0; i < BUFFER_LENGTH; i++)
			{
					gadcBuffer[i] = 0;
			}

			HAL_ADC_Polling(&ADC_Handle, gadcBuffer, ADC_Handle.ChannelNum, 0);

			for (i = 0; i < ADC_Handle.ChannelNum; i++)
			{
					vol = (gadcBuffer[i]&0xFFF)*3.3/4095;
					printf("PA1 Voltage is: %0.1f V \r\n", vol);
				 
			} 
			HAL_DelayMs(1000);     
	}
	
	
	
	
}

2.4、main.c

#include "main.h" 

int main(void)
{
	HAL_Init();  
	SystemClock_Config();    
	usart_init(115200);
	printf("\r\n\r\n====== ACM32G103 MCU is runing ======\r\nSysCoreClk: %dHz, HCLK:%dHz\r\nPCLK1:%dHz, PCLK2:%dHz\r\n\r\n",g_SystemCoreClock, HAL_RCC_GetHCLKFreq(),HAL_RCC_GetPCLK1Freq(),HAL_RCC_GetPCLK2Freq());  
   
	init_led();
	init_tim2();
	init_key();
	adc_test();
	while(1)
	{

	}
}

 

 三、运行结果

 

3.1、硬件连接图

 

3.2、调节电位器,串口输出

 

最新回复

感谢大佬分享ADC的精彩示例,他的ADC那是又快双好!   详情 回复 发表于 2024-1-16 20:26
点赞 关注
 
 

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 

感谢大佬分享ADC的精彩示例,他的ADC那是又快双好!

点评

这个芯片介绍ADC转换速率最高3Msps  详情 回复 发表于 2024-1-16 21:37
 
 
 

回复

410

帖子

3

TA的资源

纯净的硅(高级)

板凳
 
lugl4313820 发表于 2024-1-16 20:26 感谢大佬分享ADC的精彩示例,他的ADC那是又快双好!

这个芯片介绍ADC转换速率最高3Msps

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
积极拓展机顶盒应用 谨慎应对专利问题

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 是什么原因导致目前我国机顶盒市场条块分割?机卡不能真正分离的主要原因 ...

单片机使用μC/OS-II的利弊

近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题。本文通过对一种源码公开的嵌入式实时操作系统μC/OS- ...

坛友们再来玩游戏——接龙谱写精彩人生[规则内详]

光看标题,大家肯定不知所云。那就在这里细看规则,其实非常简单! 规则: 一人一层楼 一层楼长一岁 情节可自己想象 ...

今天把基于C8051F320的湿度计完工,公布所有代码!

做了C8051F320的湿度计的个人收尾工作: 1、加了一块锂充电电池,修改了充电电路。修改方法见我其他的帖子,不再罗嗦了。这个 ...

cc2540 cc2541 低功耗实测和总结

CC2541 CC2540 实现超低功耗是非常重要的: 我们来总结一下实现方法: 1,有定时器在跑时会一直跑在PM2电流在300uA左右。 ...

TMS320F28335 串口 SCI

TMS320F28335的串口有三个串口,SCIA,SCIB和SCIC,GPIO的管脚对应如下: SCIA对应GPIO28/29和GPIO35/36两组可选,SCIB有四组 ...

【问题反馈】安路TangDynasty ChipWatcher能把人逼疯的排序

我想把vga_rden信号移动到 rout的下边,当我把它拖到lcd_en上时,它跑到了lcd_en的上边,按照这个逻辑我把它拖到lcd_request的上 ...

AD23的显示效果很难看

今天安装了AD23,发现一个了一个变化,原来AD的PCB显示过孔的颜色是灰白色,但是这个AD23打开PCB,过孔的颜色被设置成了和当前层 ...

负载阻抗和功率放大器阻抗不匹配怎么办?自制阻抗变换器怎么用?

负载阻抗和功率放大器阻抗不匹配怎么办?自制阻抗变换器怎么用?

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表