GD32自学笔记:4.ADC
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的采样流程如下:
配置 ADC 通道
- 函数:
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_x, ADC_SAMPLETIME_15)
- 动作:设置 ADC0 的常规通道(如 ADC_CHANNEL_11/PC1),采样时间为 15 个 ADC 时钟周期,准备采集模拟信号。
- 函数:
触发 ADC 转换
- 函数:
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL)
- 动作:通过软件触发启动 ADC0 转换,将 PC1 引脚的模拟信号(0-3.3V)转换为 12 位数字值(0-4095)。
- 函数:
等待转换完成
- 函数:
while (adc_flag_get(ADC0, ADC_FLAG_EOC) == RESET)
- 动作:轮询检查 ADC 转换结束标志(EOC),等待采样和转换完成。
- 函数:
读取转换结果
- 函数:
adc_value = adc_regular_data_read(ADC0)
- 动作:从 ADC0 数据寄存器读取 12 位转换结果,存储到
adc_value
。
- 函数:
返回采样值
- 函数:
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相关的程序放在开发板”毕业“小项目里再涉及。