【GD32F310开发板试用】ADC 规则组连续采样

首发极术社区。如对兆易创新GD32F310 MCU感兴趣,欢迎添加微信 aijishu2020 加入GD32技术讨论群。

ADC 简介及特点

器件中集成了一个 12 位 2.86 MSPS 多通道 ADC。 一共有19个多路复用通道:16个外部通道,1个内部温度传感器通道(VSENSE)、1 通道用于内部参考电压 (VREFINT) 和 1 通道用于电池电压
(VBAT)。
输入电压范围在 VSSA 和 VDDA 之间。 片上硬件过采样方案提高了性能,同时减轻了相关的计算负担中央处理器。 模拟看门狗模块可用于检测通道,这些通道需要保持在特定的阈值窗口内。 一个可配置的通道管理块可以是用于以单次、连续、扫描或非连续模式执行转换,以支持更高级的使用。

ADC 可由通用定时器 TIMER2、TIMER14 和高级定时器 (TIMER0) 产生的事件触发。 温度传感器可用于产生随温度线性变化的电压。 它在内部连接到 ADC_IN16 输入通道,用于将传感器输出电压转换为数字值。

  • 12位SAR ADC的转换速率高达2.86 MSPS
  • 12位、10位、8位或6位可配置分辨率
  • 硬件过采样比可调从2到256x提高分辨率到16位
  • 输入电压范围:VSSA-VDDA (2.6 ~ 3.6 V)
  • 温度传感器

开发环境&参考文档

  • Keil-MDK 5.34
  • Windows10
  • 固件库-GD32F3x0_Firmware_Library_V2.2.0
  • GD32F310xx-数据手册-Rev1.1
  • GD32F3x0-用户手册-Rev2.5
  • GD32F3x0-固件库使用指南-Rev1.2

代码部分

代码部分延续使用了串口打印及串口重定向的代码,这里不在贴出

ADC 初始化

adc.h 文件

#ifndef _ADC_H_
#define _ADC_H_

#include "gd32f3x0.h"
#include "systick.h"


void HW_AdcInit(void);
uint16_t Adc_ReadValue(void);


#endif



adc.c 文件

#include "adc.h"
#include "Printf.h"

void HW_AdcInit(void)
{
	rcu_periph_clock_enable(RCU_ADC);
	rcu_periph_clock_enable(RCU_GPIOA);//启用外设时钟功能

	rcu_adc_clock_config(RCU_ADCCK_APB2_DIV4);
	
	gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2);//设置GPIO模式
	
    adc_channel_length_config(ADC_REGULAR_CHANNEL,1);//配置通道数
	adc_regular_channel_config(0,ADC_CHANNEL_2,ADC_SAMPLETIME_55POINT5);//配置使用哪一个 ADC 通道
	
//    adc_external_trigger_config(ADC_CHANNEL_1,ENABLE);// 开启 ADC 的常规通道组
//    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE);//配置 ADC 的触发方式 此处设置为软件触发
	
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);//ADC 对齐设置为右对齐
	adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE);//配置 ADC 为连续模式(扫描模式只在 DMA 模式下使用)
    adc_enable();
	delay_1ms(20);
    adc_calibration_enable();//校准和复位校准 ADC
    
}

uint16_t Adc_ReadValue(void)
{
	uint16_t Value=0;
	adc_software_trigger_enable(ADC_REGULAR_CHANNEL);//软件触发 ADC 转换开始
	
	if(SET == adc_flag_get(ADC_FLAG_STRC))
	{
		delay_1ms(100);
		if(SET == adc_flag_get(ADC_FLAG_EOC))
		{		
			Value = adc_regular_data_read();
		}
	adc_flag_clear(ADC_FLAG_STRC|ADC_FLAG_EOC);	
	}
	return Value;
}


代码实现 ADC 读取

使用 ADC 的通道2(端口:GPIOA_PIN2)测量 VCC 的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11AAL4rh-1649927981747)(/img/bVbumC)]

使用体验

  • ADC 初始化在用户手册中有初始化的流程,参照初始化流程即可配置。

  • 有一点疑问的地方就是ADC_CTL1寄存器中的 ETSRC[2:0] 的软件触发选项,目前是不用配置也不影响你的软件触发ADC转换。
    注入通道的 ETSIC[2:0] 没有测试,大致应该是一样的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值