立创梁山派GD32F450ZGT6--ADC0--通道11--PC1--采集电压

使用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的通道出来的)

如果有大佬知道的话,请踢一下我(大哭)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老怪.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值