GD32L233RXX ADC,DAC使用内部参考电压

最近调试GD32L233RXX 单片机 ADC,DAC功能的时候发现ADC读回来的电压怎么都是0xfff,DAC能写入,但是引脚上电压始终不对的问题。后来查了相关资料,对于有VREFP引脚的单片机可以接到外部参考也可以i使用单片机内部参考。有些单片机还需要对指定寄存器进行配置。GD32L233RXX便是如此。
1,硬件VREFP引脚连接方式:
在这里插入图片描述
2,用户手册上关于VREF功能描述:
(1)内部参考电压
其内部参考电压为2.5V。
(2)在这里插入图片描述
参考电压有4种工作模式,需要对相应寄存器进行配置。
(3)寄存器描述
在这里插入图片描述
3,ADC初始化代码:

/* adc gpio 初始化 */
void board_adc_gpio_init()
{
	/* 	
		PA0 ---> ADC_IN0 	BA_T
		PA1 ---> ADC_IN1 	charging_in
		PB1 ---> ADC_IN9 	HVT
	*/
	/* enable GPIOA clock */
    rcu_periph_clock_enable(RCU_GPIOA);
	/* enable GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB);
	gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);
	gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);
	gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);
}

/* init */
void board_adc_init()
{
	uint16_t delay;
	board_adc_gpio_init();
	/* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC);
    /* config ADC clock */
    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV16);
	
	/* useD internal VREF 2.5V */
	vref_enable();
	vref_high_impedance_mode_disable();
	/* ADC channel length config */
    adc_channel_length_config(ADC_INSERTED_CHANNEL, 3);
	
//    /* PA0 ---> ADC_IN0 	BA_T channel config */
//    adc_routine_channel_config(0U, ADC_CHANNEL_0, ADC_SAMPLETIME_28POINT5);
//    /* PA1 ---> ADC_IN1 	charging_in channel config */
//    adc_routine_channel_config(1U, ADC_CHANNEL_1, ADC_SAMPLETIME_28POINT5);
//	/* PB1 ---> ADC_IN9 	HVT channel config */
//    adc_routine_channel_config(2U, ADC_CHANNEL_9, ADC_SAMPLETIME_28POINT5);
	
	/* ADC temperature sensor channel config */
    adc_inserted_channel_config(0U, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5);
    /* ADC internal reference voltage channel config */
    adc_inserted_channel_config(1U, ADC_CHANNEL_1, ADC_SAMPLETIME_239POINT5);
	/* ADC internal reference voltage channel config */
    adc_inserted_channel_config(2U, ADC_CHANNEL_9, ADC_SAMPLETIME_239POINT5);

    /* ADC trigger config */
    adc_external_trigger_source_config(ADC_INSERTED_CHANNEL, ADC_EXTTRIG_INSERTED_NONE);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
    /* ADC SCAN function enable */
    adc_special_function_config(ADC_SCAN_MODE, ENABLE);
    /* ADC temperature and Vrefint enable */
    adc_channel_16_to_19(ADC_TEMP_CHANNEL_SWITCH, ENABLE);
    adc_channel_16_to_19(ADC_INTERNAL_CHANNEL_SWITCH, ENABLE);

    adc_external_trigger_config(ADC_INSERTED_CHANNEL, ENABLE);

    /* 64 times sample, 6 bits shift */
    adc_oversample_mode_config(ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_8B, ADC_OVERSAMPLING_RATIO_MUL256);
    adc_oversample_mode_enable();

    /* enable ADC interface */
    adc_enable();
    delay_1ms(1U);

    /* ADC calibration and reset calibration */
    adc_calibration_enable();
}

/* get vol */
void board_adc_get_vol(float *pfVol)
{
	/* MAX 2.5V?	*/
//	pfVol[0] = ADC_IDATA0;
	pfVol[0] = ADC_IDATA0;
	pfVol[1] = ADC_IDATA1;
	pfVol[2] = ADC_IDATA2;
}

4,DAC初始化代码:

#define ADC_PRECISION				4096 / 2500 // use internal vref = 2.5v

/* dac gpio 初始化 */
void board_dac_gpio_init()
{
	/* 	
		PA4 ---> DAC_OUT 	阈值设置
	*/
	/* enable GPIOA clock */
    rcu_periph_clock_enable(RCU_GPIOA);
	gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);
}

/* dac config */
void board_dac_config()
{
	board_dac_gpio_init();
	/* enable GPIOA clock */
    rcu_periph_clock_enable(RCU_DAC);
	/* initialize DAC */
    dac_deinit(DAC0);
    /* DAC trigger disable */
    dac_trigger_disable(DAC0, DAC_OUT0);
    /* DAC wave mode config */
    dac_wave_mode_config(DAC0, DAC_OUT0, DAC_WAVE_DISABLE);

    /* DAC output buffer enable */
    dac_output_buffer_enable(DAC0, DAC_OUT0);
    /* DAC enable */
    dac_enable(DAC0, DAC_OUT0);
}

void board_dac_set_data(uint16 u16VolmV)
{
	uint16_t u16OutData = u16VolmV * ADC_PRECISION;
	dac_data_set(DAC0, DAC_OUT0, DAC_ALIGN_12B_R, u16OutData);
}

搞技术搞技术,要不是为了混口饭吃谁搞技术!谁爱搞谁搞!! 兄弟们直接抄代码就行。 对了,这个ADC还是多路采集的,使用的内部注入组,最多支持4路同时读取,本来想搞DMA的,但是没有搞出来,就用这个将就一下了,兄弟们弄出来可以@我一下!
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值