RISC-V_GD32VF103-ADC 模数转换 电压采集
程序员文章站
2024-02-22 14:04:22
...
ADC 模数转换,使用引脚 PA1 ,最好是0-3.3V电压,将DAC 引脚PA4 和 ADC引脚PA1 连接
就可以实现DAC输出 , ADC采集,按键增加电压,printf打印。
有两个初始化,一个是软件触发转换完成不会中断,一个是软件触发,完成转换将触发中断,没有中断或事件触发启动转换。--_--
不中断则取消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);
}
}
个人见解,感谢阅读。