1718|3

410

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【HC32F4A0开发板】ADC电压采集测试 [复制链接]

 

这篇学习下ADC数据采集测试。

 

一、硬件部分

使用开发板上的R105电位器来测试,采集电源的分压,数据输入的变化。

硬件电路图部分

二、程序部分

ADC采集端口是PA3。

2.1、adc.c

#include "main.h"

void init_adc(void)
{
		stc_adc_init_t stcAdcInit;
		stc_gpio_init_t stcGpioInit;
	
    CLK_SetClockDiv((CLK_BUS_PCLK2 | CLK_BUS_PCLK4), (CLK_PCLK2_DIV8 | CLK_PCLK4_DIV2));
    /* 2. Specifies the clock source of ADC. */
    CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK);
	
		FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_ADC1, ENABLE);
		(void)ADC_StructInit(&stcAdcInit);
		(void)ADC_Init(CM_ADC1, &stcAdcInit);
	
		(void)GPIO_StructInit(&stcGpioInit);
    stcGpioInit.u16PinAttr = PIN_ATTR_ANALOG;
    (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_03, &stcGpioInit);
	
		ADC_ChCmd(CM_ADC1, ADC_SEQ_A, ADC_CH3, ENABLE);
		ADC_SetSampleTime(CM_ADC1, ADC_CH3, 0x40U);
	
		//ADC_ConvDataAverageConfig(CM_ADC1, ADC_AVG_CNT8);
    //ADC_ConvDataAverageChCmd(CM_ADC1, ADC_CH3, ENABLE);
}


void adc_test(void)
{
    uint16_t u16AdcValue;
    int32_t iRet = LL_ERR;
		uint16_t adc_val=0;
    __IO uint32_t u32TimeCount = 0UL;

    /* Can ONLY start sequence A conversion.
       Sequence B needs hardware trigger to start conversion. */
    ADC_Start(CM_ADC1);
    do {
        if (ADC_GetStatus(CM_ADC1, ADC_FLAG_EOCA ) == SET) 
				{
            ADC_ClearStatus(CM_ADC1, ADC_FLAG_EOCA);
            iRet = LL_OK;
            break;
        }
    } while (u32TimeCount++ < 1000);

    if (iRet == LL_OK) 
		{
        /* Get any ADC value of sequence A channel that needed. */
        u16AdcValue = ADC_GetValue(CM_ADC1, ADC_CH3);
				adc_val=(uint16_t)((((float32_t)(u16AdcValue) * 3.3) / ((float32_t)(1UL << 12U))) * 1000.F);
			
			
        DDL_Printf("The ADC voltage is %u mV\r\n",adc_val);
    } 
		else 
		{
        ADC_Stop(CM_ADC1);
        DDL_Printf("ADC exception.\r\n");
    }
}

2.2、adc.h

#ifndef _ADC_H
#define _ADC_H

void init_adc(void);
void sdc_test(void);


#endif

2.3、main.c

#include "main.h"
#include "lcd.h"
#include "sram.h"
#include "timer0.h"
#include "led.h"
#include "touch.h"
#include "can.h"
#include "adc.h"


stc_touchpad_data_t touchdat;
void SysTick_Handler(void)
{
    SysTick_IncTick();
		led1_tog();
}

int32_t main(void)
{
	
	uint16_t u=0;
	uint8_t i=0;
	uint16_t cord[6]={WHITE, BLUE, BRED, GBLUE, RED, YELLOW};
	/* Register write enable for some required peripherals. */
	LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_EFM | LL_PERIPH_SRAM);

	BSP_CLK_Init();
	/* EXCLK 60MHz */
	CLK_SetClockDiv(CLK_BUS_EXCLK, CLK_EXCLK_DIV4);
	DDL_PrintfInit(BSP_PRINTF_DEVICE, BSP_PRINTF_BAUDRATE, BSP_PRINTF_Preinit);
	BSP_IO_Init();
	BSP_LED_Init();
	BSP_LCD_IO_Init();
	
	init_led();
	init_touch();
	init_lcd();
	init_sram();
	init_timer0();
	init_can();
	init_adc();
	SysTick_Init(1000U);

	LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_EFM | LL_PERIPH_SRAM);
	POINT_COLOR=RED;       
	LCD_Clear(WHITE);
	//sram_test();

	for (;;) 
	{
		SysTick_Delay(500U);
		adc_test();
		
	}
}

 

三、串口输出

调解电位器,输出输出采集的电压值。

最新回复

谢谢分享,期待后续评测   详情 回复 发表于 2023-3-21 10:42
点赞 关注
 
 

回复
举报

1668

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

调解电位器,输出输出采集的电压值的精度怎样,与设定有误偏差

点评

12位ADC,测量精度可以的   详情 回复 发表于 2023-3-20 17:59
 
 
 

回复

410

帖子

3

TA的资源

纯净的硅(高级)

板凳
 
火辣西米秀 发表于 2023-3-20 07:32 调解电位器,输出输出采集的电压值的精度怎样,与设定有误偏差

12位ADC,测量精度可以的 

 
 
 

回复

7452

帖子

18

TA的资源

五彩晶圆(高级)

4
 

谢谢分享,期待后续评测

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 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
快速回复 返回顶部 返回列表