欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-22 14:04:22
...

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

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

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

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

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

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

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

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);
    }
}

个人见解,感谢阅读。