使用GD32F450ZGT6的PC1引脚通过非DMA的ADC功能采集电压。
话不多说,上代码
1、单通道采集
// PC1 ADC012_IN11
void ADC_Init(void)
{
/* 开启PC口的时钟 */
rcu_periph_clock_enable(RCU_GPIOC);
/* 开启ADC0的时钟 */
rcu_periph_clock_enable(RCU_ADC0);
/* 配置ADC时钟 */
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
/* 配置PC1为浮空模拟输入模式 */
gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_1);
/* 配置ADC0为常规通道组,并只使用1个通道 */
adc_channel_length_config(ADC0,ADC_REGULAR_CHANNEL,1);
/* 配置ADC0的数据对齐方式为右对齐*/
adc_data_alignment_config(ADC0,ADC_DATAALIGN_RIGHT);
/* 配置ADC0的分辨率为12位*/
adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
/* 连续转换开启 */
adc_special_function_config(ADC0,ADC_CONTINUOUS_MODE, ENABLE);
/* 启用扫描方式 */
adc_special_function_config(ADC0,ADC_SCAN_MODE,ENABLE);
/*启动ADC0通道11 是第0个开始扫描 周期为144个指令周期 */
adc_regular_channel_config(ADC0,0,ADC_CHANNEL_11,ADC_SAMPLETIME_144);
/* ADC0使能 */
adc_enable(ADC0);
/* ADC校准使能 */
adc_calibration_enable(ADC0);
/* 启动ADC0常规通道组软件触发 */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}
//读取ADC0-通道11-PC1的电压
unsigned int Get_ADC_Value(void)
{
unsigned int Data=0;
float vol;
char temp[50];
// /* 启动ADC0常规通道组软件触发 */
// adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
//
// /* 没有转换结束就进入while */
// while( adc_flag_get(ADC0,ADC_FLAG_EOC) == RESET )
// {
// USART0_send_String("error");
// delay_1ms(1000);
// }
// /* 清除组转换结束标志位 */
// adc_flag_clear(ADC0,ADC_FLAG_EOC);
/* 读取ADC常规组数据寄存器 */
Data = adc_regular_data_read(ADC0);
/* 换算为电压 */
vol = (Data / 4096.0) * 3.3;
//调试 串口输出数据
sprintf(temp, "ADC为:%d\r\n", Data);
USART0_send_String((unsigned char*)temp);
sprintf(temp, "读取的电压为:%f\r\n", vol);
USART0_send_String((unsigned char*)temp);
return Data;
}
主函数
#include "gd32f4xx.h"
#include "systick.h"
#include "usart0.h"
#include "pwm.h"
#include "adc.h"
int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组
systick_config(); //系统滴答定时器 定时1MS
USART1_Init();
ADC_Init();
USART0_send_String("--开始--");
while(1)
{
Get_ADC_Value();
delay_1ms(1000);
}
}
如果不想使用PC1作为ADC引脚,那要更改对应引脚的时钟,和对应引脚的ADC通道。
怎么知道哪个引脚可以使用ADC功能?
见数据手册的2.6章节,选择自己芯片的引脚数,就可以查看哪个引脚有ADC功能了。(我使用的是GD32F450Z系列)
结果
1、输入电压1.8V 采集到1.83V
2、输入电压2.9V 采集到2.95V
注意:最大采集电压为3.6V!
这里发现一个问题,当不使用DMA传输时,用多路ADC进行采集,会发生数据错位。(即本来是将电压输入到PC2引脚,但是数据却是从PC3的通道出来的)
如果有大佬知道的话,请踢一下我(大哭)