RISC-V_GD32VF103-ADC 模数转换 电压采集

ADC 模数转换,使用引脚 PA1 ,最好是0-3.3V电压,将DAC 引脚PA4 和 ADC引脚PA1 连接

就可以实现DAC输出 , ADC采集,按键增加电压,printf打印。

有两个初始化,一个是软件触发转换完成不会中断,一个是软件触发,完成转换将触发中断,没有中断或事件触发启动转换。x_x

不中断则取消main.c中的注释,改变初始化。

adc.c

#include "adc.h"
#include "gd32vf103.h"
#include "gd32vf103_libopt.h"
#include <stdio.h>
#include <string.h>


// ************************************************************************************************************** //
//DAC 初始化
void ADC0_Init()
{
	rcu_periph_clock_enable(RCU_GPIOA); //开启GPIOA时钟
	rcu_periph_clock_enable(RCU_ADC0);   //开启ADC0时钟
	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1); //初始化引脚 PA1

	adc_deinit(ADC0);
	adc_mode_config(ADC_MODE_FREE);  //配置ADC同步模式
	adc_mode_config(ADC_DAUL_REGULAL_FOLLOWUP_FAST);  //配置ADC同步模式
	adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); //ADC0特殊功能开启
	adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); //配置ADC数据对齐方式
	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);//配置规则通道组或注入通道组的长度 ,1个规则组
	adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);//规则组选择

	adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); //软件触发
	adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); //配置ADC外部触发
	adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 1); //配置ADC间断模式

	adc_enable(ADC0);

	delay_1ms(1);
	adc_calibration_enable(ADC0);  //ADC0校准复位
}
// ************************************************************************************************************** //
//DAC 中断初始化
void ADC0_EXTI_Init()
{
	rcu_periph_clock_enable(RCU_GPIOA); //开启GPIOA时钟
	rcu_periph_clock_enable(RCU_ADC0);   //开启ADC0时钟
	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1); //初始化引脚 PA1

	adc_deinit(ADC0);
	adc_mode_config(ADC_MODE_FREE);  //配置ADC同步模式
	adc_mode_config(ADC_DAUL_REGULAL_FOLLOWUP_FAST);  //配置ADC同步模式
	adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); //ADC0特殊功能开启
	adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); //配置ADC数据对齐方式
	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);//配置规则通道组或注入通道组的长度 ,1个规则组
	adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);//规则组选择

	adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); //软件触发
	adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); //配置ADC外部触发
	adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 1); //配置ADC间断模式

	adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); //清除规则组通道中断
	adc_interrupt_enable(ADC0, ADC_INT_EOC); //使能规则组通道中断
	eclic_irq_enable(ADC0_1_IRQn, 1, 0); //使能中断线
	adc_enable(ADC0);

	delay_1ms(1);
	adc_calibration_enable(ADC0);  //ADC0校准复位
}
// ************************************************************************************************************** //
//ADC 中断服务函数
void ADC0_1_IRQHandler(void)
{
    uint16_t adc_value;

    if(adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOC) != RESET)
    {
        adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
        adc_value = adc_regular_data_read(ADC0);

        printf("ADC_Value = %03x \n\r",adc_value);
    }
}

adc.h

#ifndef  __ADC_H__
#define  __ADC_H__
#include "gd32vf103.h"
#include "systick.h"




// ************************************************************************************************************** //
void ADC0_Init(void);
void ADC0_EXTI_Init(void);
void ADC0_1_IRQHandler(void);



#endif

main.c

#include "gd32vf103.h"
#include "gd32vf103c_start.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>

#include "led.h"
#include "key.h"
#include "usart0.h"
#include "dac.h"
#include "adc.h"


// ************************************************************************************************************* //
//主函数
int main(void)
{
	uint16_t DAC_Value = 0;
	//uint16_t ADC_Value = 0;
	uint8_t  key = 0;

	eclic_global_interrupt_enable();
	eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);

	LED_Init();    //LED灯初始化
	KEY_Init();    //KEY按键初始化
	USART0_Init(); //USART0初始化
	DAC0_Init();   //DAC0初始化
	ADC0_EXTI_Init();//ADC0初始化

	printf("串口测试 USART TEST 0123456789 \n\r");
    while(1)
    {
		key = KEY_Scan();
		if(key == 1)
		{
			LED0_T;
			DAC_Value+=0x100;if(DAC_Value > 0xfff) {DAC_Value = 0x000;}
			dac_data_set(DAC0, DAC_ALIGN_12B_R, DAC_Value); //设置DAC0 数据
			delay_1ms(100);
			adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); //ADC软件触发使能
			//delay_1ms(100);
			//ADC_Value = adc_regular_data_read(ADC0); //获得ADC采集值

			printf("DAC_Value = %03x \n\r",DAC_Value);
			//printf("ADC_Value = %03x \n\r",ADC_Value);
		}
		delay_1ms(100);
    }
}

个人见解,感谢阅读。

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值