> 文档中心 > 【GD32F427开发板试用】02-ADC规则组连续采样

【GD32F427开发板试用】02-ADC规则组连续采样

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Stark_GS

ADC 简介及特点

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

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

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

开发环境&参考文档

  • Keil-MDK 5.27.1.0
  • Windows11
  • 固件库-GD32F4xx_Firmware_Library_V3.0.2
  • GD32F427xx_Datasheet_Rev1.2
  • GD32F4xx_User_Manual_Rev2.7_CN
  • GD32F4xx 固件库使用指南_V1.0

代码部分

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

ADC 初始化

adc.h 文件

#ifndef _ADC_H_#define _ADC_H_#include "gd32f4xx.h"#include "systick.h"void ADC_Init(void);uint16_t ADC_ReadValue(void);#endif

adc.c 文件

#include "adc.h"//#include "Printf.h"void ADC_Init(void){    rcu_periph_clock_enable(RCU_GPIOA);//启用外设时钟功能    rcu_periph_clock_enable(RCU_ADC0);    adc_clock_config(ADC_ADCCK_PCLK2_DIV8); gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2);//设置GPIO模式 adc_deinit();    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT); adc_special_function_config(ADC0,ADC_CONTINUOUS_MODE,DISABLE);//配置 ADC 为连续模式(扫描模式只在 DMA 模式下使用)    adc_special_function_config(ADC0,ADC_SCAN_MODE,DISABLE);//配置 ADC 为连续模式(扫描模式只在 DMA 模式下使用) adc_data_alignment_config(ADC0,ADC_DATAALIGN_RIGHT);//ADC 对齐设置为右对齐 adc_channel_length_config(ADC0,ADC_ROUTINE_CHANNEL,1);//配置通道数 adc_routine_channel_config(ADC0,0,ADC_CHANNEL_2,ADC_SAMPLETIME_15);//配置使用哪一个 ADC 通道    //    adc_external_trigger_config(ADC_CHANNEL_1,ENABLE);// 开启 ADC 的常规通道组//    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE);//配置 ADC 的触发方式 此处设置为软件触发 adc_external_trigger_source_config(ADC0, ADC_ROUTINE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0);     adc_external_trigger_config(ADC0, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE); adc_enable(ADC0);    delay_1ms(20);    adc_calibration_enable(ADC0);//校准和复位校准 ADC    }uint16_t ADC_ReadValue(void){    uint16_t Value=0;    adc_software_trigger_enable(ADC0,ADC_ROUTINE_CHANNEL);//软件触发 ADC 转换开始 if(SET == adc_flag_get(ADC0,ADC_FLAG_STRC))    { delay_1ms(100); if(SET == adc_flag_get(ADC0,ADC_FLAG_EOC)) {      Value = adc_routine_data_read(ADC0); }    adc_flag_clear(ADC0,ADC_FLAG_STRC|ADC_FLAG_EOC); }    return Value;    }

代码实现 ADC 读取

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

主函数

#include "gd32f4xx.h"//#include "gd32f427v_start.h"#include "systick.h"#include #include "Printf.h"#include "gpio.h"#include "uart.h"#include "adc.h"uint16_t ADC_Value;int main(void){    systick_config();    //配置系统时钟 GPIO_Init();    USART_Init();    ADC_Init(); while(1)     { gpio_bit_toggle(GPIOC, GPIO_PIN_6);    //反转PC6 delay_1ms(200);  USART_TransmitString("这是一个串口测试\r\n");  printf("串口重定向测试\r\n");  ADC_Value = ADC_ReadValue(); printf("ADC Channel Value = %d\r\n ",ADC_Value);    }}

关于串口 printf 打印可以查看前一个文档

【GD32F427开发板试用】02-ADC规则组连续采样