GD32自学笔记:4.ADC

发布于:2025-09-08 ⋅ 阅读:(20) ⋅ 点赞:(0)

while(1)里测试ADC是否正常

        首先,ADC引脚说明如下:

ADC 通道 引脚 描述
ADC_CHANNEL_0 PA0 端口 A 的引脚 0,可用于模拟信号输入,如传感器或外部电压。
ADC_CHANNEL_1 PA1 端口 A 的引脚 1,常用于模拟输入,适用于一般 ADC 应用。
ADC_CHANNEL_2 PA2 端口 A 的引脚 2,可用于 ADC 采样,常见于多通道采集场景。
ADC_CHANNEL_3 PA3 端口 A 的引脚 3,适用于模拟信号输入,常用于信号测量。
ADC_CHANNEL_4 PA4 端口 A 的引脚 4,可用于 ADC,也常用于 DAC 输出(需注意复用)。
ADC_CHANNEL_5 PA5 端口 A 的引脚 5,常见于模拟输入,需注意与其他外设复用。
ADC_CHANNEL_6 PA6 端口 A 的引脚 6,可用于 ADC 采样,注意避免与定时器等冲突。
ADC_CHANNEL_7 PA7 端口 A 的引脚 7,适用于一般 ADC 输入场景。
ADC_CHANNEL_8 PB0 端口 B 的引脚 0,扩展了 ADC 通道,适合多通道采集。
ADC_CHANNEL_9 PB1 端口 B 的引脚 1,常用于模拟信号输入。
ADC_CHANNEL_10 PC0 端口 C 的引脚 0,适用于需要高精度采样的场景。
ADC_CHANNEL_11 PC1 端口 C 的引脚 1,此程序中使用的通道,默认用于 ADC 采样
ADC_CHANNEL_12 PC2 端口 C 的引脚 2,适用于模拟输入,常见于传感器接口。
ADC_CHANNEL_13 PC3 端口 C 的引脚 3,可用于 ADC 采样,注意外部电路设计。
ADC_CHANNEL_14 PC4 端口 C 的引脚 4,适用于模拟信号输入场景。
ADC_CHANNEL_15 PC5 端口 C 的引脚 5,常用于 ADC 通道扩展。
ADC_CHANNEL_16 内部 内部温度传感器通道,用于测量芯片内部温度。
ADC_CHANNEL_17 内部 内部参考电压通道,用于校准或测量 VREFINT。

  • 通道分配:GD32F470ZGT6 的 ADC 通道 0 到 15 对应外部 GPIO 引脚,从 PA0 到 PC5,覆盖端口 A、B、C。这些引脚在配置为 ADC 模式时,必须设置为模拟输入模式(GPIO_MODE_ANALOG)。
  • 内部通道:ADC_CHANNEL_16 和 ADC_CHANNEL_17 是内部通道,分别用于测量芯片温度和内部参考电压(VREFINT),无需外部引脚。

        硬件连接图:

        bsp_adc.c中的Get_ADC_Value函数:

unsigned int Get_ADC_Value(uint8_t  ADC_CHANNEL_x)
{
    unsigned int adc_value = 0;
    //ÉèÖòɼ¯Í¨µÀ
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_x, ADC_SAMPLETIME_15);
    //¿ªÊ¼Èí¼þת»»
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
    //µÈ´ý ADC0 ²ÉÑùÍê³É 
    while ( adc_flag_get(ADC0, ADC_FLAG_EOC) == RESET ) 
    {
        ;
    }
    //¶ÁÈ¡²ÉÑùÖµ
    adc_value = adc_regular_data_read(ADC0);
    //·µ»Ø²ÉÑùÖµ
    return adc_value;
}

       通过此函数可以明白ADC的采样流程如下:

  1. 配置 ADC 通道

    • 函数:adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_x, ADC_SAMPLETIME_15)
    • 动作:设置 ADC0 的常规通道(如 ADC_CHANNEL_11/PC1),采样时间为 15 个 ADC 时钟周期,准备采集模拟信号。
  2. 触发 ADC 转换

    • 函数:adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL)
    • 动作:通过软件触发启动 ADC0 转换,将 PC1 引脚的模拟信号(0-3.3V)转换为 12 位数字值(0-4095)。
  3. 等待转换完成

    • 函数:while (adc_flag_get(ADC0, ADC_FLAG_EOC) == RESET)
    • 动作:轮询检查 ADC 转换结束标志(EOC),等待采样和转换完成。
  4. 读取转换结果

    • 函数:adc_value = adc_regular_data_read(ADC0)
    • 动作:从 ADC0 数据寄存器读取 12 位转换结果,存储到 adc_value
  5. 返回采样值

    • 函数:return adc_value
    • 动作:返回 12 位数字值,供主程序转换为电压(如 (value / 4095.0) * 3.3)并通过串口输出。

        main.c里写:

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "bsp_led.h"
#include "sys.h"
#include "bsp_usart.h"
#include "bsp_adc.h"
#include <stdio.h>

/*!
    \brief    main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
char ptr[200];
int main(void)
{

	uint16_t value = 0;
	
    systick_config();
	
	usart_gpio_config(9600U);
	
	adc_config();
	
    while(1) 
		{
			value = Get_ADC_Value(ADC_CHANNEL_11);
			sprintf((char*)ptr,"ADC value = %f\r\n",(( value / 4095.0 ) * 3.3));
			usart_send_string(ptr);
			delay_1ms(500);
    }
}

        然后PA9(单片机TX)接USB转TTL的RX,PA10(单片机RX)接USB转TTL的TX,这里的PC1是ADC引脚,ADC引脚可以接板载的GND和3.3V测试一下:

        接GND:

        接3.3V:

      后续把ADC放定时器中断里和DMA相关的程序放在开发板”毕业“小项目里再涉及。


网站公告

今日签到

点亮在社区的每一天
去签到